I попробовал следующее:
$ 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/
Просто продолжаю ответ Чарли Мартина и ваш последующий вопрос. dx86cl64 --eval
запустит REPL, поэтому, если вы хотите запустить данный сценарий, а затем завершите работу, просто добавьте это в конец вашего сценария: (ccl :: выйти)
. В приведенном вами примере это поможет:
#! /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!
$ _
Проблема в вашей строке 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 , чтобы узнать, почему.
Вы должны убедиться, что ядро может загрузить образ памяти Лиспа. По умолчанию ядро ищет файл с именем, похожим на двоичный файл ядра с добавленным «.image», то есть, если вы запускаете CCL, используя dx86cl64
, то загружаемое изображение имеет вид dx86cl64.image
из того же каталога. Вы можете изменить это поведение, явно предоставив изображение с помощью параметра - image
. Попробуйте dx86cl64 --help
для получения дополнительной информации.
См. Подкаталог scripts в каталоге ccl. В нем должны быть скрипты, которые вы можете адаптировать и использовать.
Вы не можете вызвать сценарий из командной строки следующим образом:
/Applications/ccl/dx86cl64 myscript
вы можете?
Я думаю, вам нужно называть его так (у меня здесь нет Clozure CL, поэтому я не могу протестировать ):
/Applications/ccl/dx86cl64 -b -l myscript
Итак, ваш сценарий должен начинаться следующим образом:
#!/Applications/ccl/dx86cl64 -b -l
...