Как запустить Clozure CL (Lisp) из сценария оболочки на OS X? - PullRequest
8 голосов
/ 08 августа 2010

Я попробовал следующее:

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

$ ./args.sh 

Не удалось загрузить изображение кучи LISP из ./args.sh

Я могу нормально запустить LISP:

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

? 

Можно ли написать сценарий оболочки для запуска кода lisp с помощью Clozure CL? Я уверен, что я делаю что-то глупое.

Я установил его с: http://openmcl.clozure.com/

Ответы [ 5 ]

6 голосов
/ 10 августа 2010

Просто следите за ответом Чарли Мартина и за вашим последующим вопросом. dx86cl64 --eval <code> запустит REPL, поэтому, если вы хотите запустить заданный сценарий, а затем выйдите, просто добавьте в конец сценария следующее: (ccl::quit) В приведенном вами примере это поможет:

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

Более хороший сценарий будет следующим:

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

Поместите это в файл, load-ccl-script.sh (или другое имя по вашему выбору). Тогда работает следующее взаимодействие:

$ echo '(format t "weeee!")' > a.lisp
$ sh load-ccl-script.sh a.lisp
weeee!
$ _
2 голосов
/ 08 августа 2010

Проблема в вашей строке shebang:

\#! /Applications/ccl/dx86cl64

В файле UNIX первые 16 бит называются «магическим числом».Бывает, что магическое число для исполняемого скрипта совпадает с битовой конфигурацией символов «#!».Первые 16 бит вашего файла имеют ту же конфигурацию, что и "\ #", и UNIX не купится на это.

Можно добавить магические числа, но это не просто и не переносимо, так чтовам нужен способ вызвать скрипт.Я бы предложил

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

с соответствующими аргументами и т. Д. Для вашего сценария.(Встроенная функция exec приводит к загрузке текущего процесса с именованным исполняемым файлом без разветвления , поэтому у вас нет лишнего процесса.)

Обновление

В вашем конкретном случае вам понадобится что-то вроде

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

См. Аргументы командной строки для Clozure , почему.

0 голосов
/ 09 августа 2010

Вы не можете вызвать скрипт из командной строки следующим образом:

/Applications/ccl/dx86cl64 myscript

можете?CL здесь, поэтому я не могу проверить):

/Applications/ccl/dx86cl64 -b -l myscript

Итак, ваш скрипт должен запуститься так:

#!/Applications/ccl/dx86cl64 -b -l
...
0 голосов
/ 08 августа 2010

Смотрите подкаталог scripts вашего каталога ccl. Он должен иметь несколько скриптов, которые вы можете адаптировать и использовать.

0 голосов
/ 08 августа 2010

Вы должны убедиться, что ядро ​​может загрузить образ памяти Lisp. Поведение по умолчанию - ядро ​​ищет файл, который называется как двоичный файл ядра с добавленным «.image», т. Е. Если вы запускаете CCL, используя dx86cl64, то загруженное изображение будет dx86cl64.image из того же каталога. , Вы можете изменить это поведение, предоставив изображение явно, используя опцию --image. Попробуйте dx86cl64 --help для получения дополнительной информации.

...