Как запустить 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 для дополнительной информации.

Другие вопросы по тегам