Как запустить Clozure CL (Lisp) из сценария оболочки на OS X?
Я попробовал следующее:
$ 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 ответов
Просто следите за ответом Чарли Мартина и вашим последующим вопросом. 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!
$ _
Проблема в вашей линии Шебанга:
\#! /Applications/ccl/dx86cl64
В файле UNIX первые 16 бит называются "магическим числом". Бывает, что магическое число для исполняемого скрипта совпадает с битовой конфигурацией символов "#!". Первые 16 бит вашего файла имеют ту же конфигурацию, что и "\#", и UNIX этого не купит.
Можно добавить магические числа, но это не просто и не переносимо, так что вам нужен способ вызова скрипта. Я бы предложил
#! /bin/bash
exec /Applications/ccl/dx86cl64
с соответствующими аргументами и т. д. для вашего сценария. (The exec
Благодаря встроенной функции текущий процесс загружается с именованным исполняемым файлом без разветвления, поэтому у вас нет лишних процессов.)
Обновить
В вашем конкретном случае вы захотите что-то вроде
@! /bin/bash
exec /Applications/ccl/dx86cl64 --eval '(format t "~&~S~&" *args*)'
Посмотрите аргументы командной строки для Clozure, чтобы узнать почему.
Смотрите подкаталог scripts вашего каталога ccl. Он должен иметь несколько скриптов, которые вы можете адаптировать и использовать.
Вы не можете вызвать скрипт как это из командной строки:
/Applications/ccl/dx86cl64 myscript
ты можешь?
Я думаю, что вам нужно называть это так (у меня здесь нет Clozure CL, поэтому я не могу проверить):
/Applications/ccl/dx86cl64 -b -l myscript
Итак, ваш скрипт должен начинаться так:
#!/Applications/ccl/dx86cl64 -b -l
...
Вы должны убедиться, что ядро может загрузить образ памяти Lisp. Поведение по умолчанию для ядра, чтобы искать файл, который назван как двоичный файл ядра с добавленным ".image", то есть, если вы запускаете CCL, используя dx86cl64
то загруженное изображение dx86cl64.image
из того же каталога. Вы можете изменить это поведение, предоставив изображение явно используя --image
вариант. Пытаться dx86cl64 --help
для дополнительной информации.