2010-08-08 11 views
8

Ho provato quanto segue:Come eseguire Clozure CL (Lisp) da uno script di shell su OS X?

$ cat args.sh 
\#! /Applications/ccl/dx86cl64 
(format t "~&~S~&" *args*) 

$ ./args.sh 

Impossibile immagine mucchio Lisp caricare da ./args.sh

posso correre Lisp multa direttamente:

$ /Applications/ccl/dx86cl64 
Welcome to Clozure Common Lisp Version 1.5-r13651 (DarwinX8664)! 

? 

E 'possibile scrivere uno script di shell per eseguire il codice Lisp con Clozure CL? Sono sicuro che sto facendo qualcosa di sciocco.

ho installato da: http://openmcl.clozure.com/

risposta

6

Basta seguire la risposta di Charlie Martin e la domanda successiva. Lo dx86cl64 --eval <code> creerà un REPL, quindi se vuoi attivare un determinato script e poi uscire, aggiungi questo alla fine del tuo script: (ccl::quit). Nell'esempio che hai fornito, questo sarebbe fare il trucco:

#! /bin/bash 
exec /Applications/ccl/dx86cl64 --eval '(progn (format t "hello script") (ccl::quit))' 

Uno script più bello sarebbe la seguente:

#! /bin/bash 
exec /Applications/ccl/dx86cl64 -b -e '(progn (load "'$1'") (ccl::quit))' 

Metti che in un file, load-ccl-script.sh (o altro nome a vostra scelta). Quindi funziona la seguente interazione:

$ echo '(format t "weeee!")' > a.lisp 
$ sh load-ccl-script.sh a.lisp 
weeee! 
$ _ 
+0

Grazie! (Suppongo che il 'sh' sia ridondante in 'sh load-ccl-script.sh a.lisp' ...) –

+0

Vero, ma senza di esso avrei dovuto includere 'chmod + x load-ccl-script. sh' line - i 3 personaggi erano un po 'più concisi, e poiché questo non era lo scopo del frammento, sono andato nel modo pigro :) – Edgar

0

Bisogna fare in modo, che il kernel può caricare un immagine di memoria Lisp. Il comportamento predefinito è che il kernel cerchi un file, che viene chiamato come il file binario del kernel con ".image", ad esempio, se si avvia CCL utilizzando dx86cl64, l'immagine caricata è dx86cl64.image dalla stessa directory. È possibile modificare questo comportamento fornendo esplicitamente l'immagine utilizzando l'opzione --image. Prova dx86cl64 --help per ulteriori informazioni.

2

il problema è nella vostra linea shebang:

\#! /Applications/ccl/dx86cl64 

In un file di UNIX, i primi 16 bit è chiamato il "numero magico". Succede che il numero magico per uno script eseguibile è la stessa configurazione di bit dei caratteri "#!". I primi 16 bit del tuo file hanno la stessa configurazione di "\ #" e UNIX non lo comprerà.

È possibile aggiungere numeri magici, ma non è facile o portatile, quindi quello che ti serve è un modo per invocare lo script. Suggerirei

#! /bin/bash 
exec /Applications/ccl/dx86cl64 

con argomenti appropriati ecc per il tuo script. (Il exec incorporato fa sì che il processo in corso di essere caricato con il nome eseguibile senza sborsare, in modo da non avere un processo di riserva in giro.)

Aggiornamento

Nel vostro caso particolare , si vorrà qualcosa come

@! /bin/bash 
exec /Applications/ccl/dx86cl64 --eval '(format t "~&~S~&" *args*)' 

Vedere la command line args for Clozure per il motivo.

+0

Grazie per il suggerimento. Ho provato questo: #!/bin/bash exec/Applications/ccl/dx86cl64 --eval '(formato t "ciao script")' Questo funziona, tranne che ottengo il prompt lisp dopo l'esecuzione del metodo. Come posso uscire fuori dal giro? $ ./args.sh ciao script Benvenuti in Clozure Common Lisp versione 1.5-r13651 (DarwinX8664)! ? –

+0

(ciao) Credo. –

+1

Almeno fino a quando Clozure 1.4 '(ciao)' non è disponibile. '(ccl :: quit)', tuttavia, è (quindi '(quit)' funzionerà anche se si è nel pacchetto 'ccl'). – Edgar

0

Vedere la sottodirectory degli script della directory ccl. Dovrebbe avere alcuni script che è possibile adattare e utilizzare.

+0

L'ho fatto. Sfortunatamente non sono script di codice chiari, ma utilità di shell. –

0

Non è possibile chiamare lo script come questo dalla linea di comando:

/Applications/ccl/dx86cl64 myscript 

si può?

Penso che avete bisogno di chiamare in questo modo (non ho Clozure CL qui, quindi non posso provare):

/Applications/ccl/dx86cl64 -b -l myscript 

Quindi, lo script dovrebbe iniziare in questo modo:

#!/Applications/ccl/dx86cl64 -b -l 
... 
Problemi correlati