Как запустить Clozure CL (Lisp) из сценария оболочки на OS X?

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/

8
задан Bo Persson 15 February 2012 в 18:15
поделиться

5 ответов

Просто продолжаю ответ Чарли Мартина и ваш последующий вопрос. 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!
$ _
6
ответ дан 5 December 2019 в 20:12
поделиться

Проблема в вашей строке 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 , чтобы узнать, почему.

2
ответ дан 5 December 2019 в 20:12
поделиться

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

0
ответ дан 5 December 2019 в 20:12
поделиться

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

0
ответ дан 5 December 2019 в 20:12
поделиться

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

/Applications/ccl/dx86cl64 myscript

вы можете?

Я думаю, вам нужно называть его так (у меня здесь нет Clozure CL, поэтому я не могу протестировать ):

/Applications/ccl/dx86cl64 -b -l myscript

Итак, ваш сценарий должен начинаться следующим образом:

#!/Applications/ccl/dx86cl64 -b -l
...
0
ответ дан 5 December 2019 в 20:12
поделиться