Ответ 1
Руководство SBCL описывает три полезные опции
3.3.1 Параметры времени выполнения
--noinform
Подавлять печать любого баннера или другого информационное сообщение при запуске. Это облегчает запись Lispпрограммы, которые работают чисто в конвейерах Unix. См. Также--noprint
и--disable-debugger
.
3.3.2 Параметры верхнего уровня
--eval command
После выполнения любого файла инициализации, но перед запуском цикла read-eval-print на стандартном входе прочитайте и оцените команда дана. Можно использовать более одного параметра--eval
, и все будут прочитаны и выполнены, в том порядке, в котором они отображаются в команде линия.
--load filename
Это эквивалентно--eval '(load "filename")'
. Специальный синтаксис предназначен для сокращения цитирования головных болей при вызове SBCL из сценариев оболочки.
Для файла test.lisp
с содержимым
(defun hello-world ()
(print 'hello-world)
(terpri))
мы можем сделать это с помощью SBCL:
$ sbcl --noinform --load test.lisp --eval '(progn (hello-world) (sb-ext:quit))'
HELLO-WORLD
(progn ... (sb-ext:quit))
гарантирует, что программа завершится после выполнения (hello-world)
. В противном случае вы попадаете в подсказку SBCL. Поскольку код скомпилирован автоматически в SBCL, функция, которую вы запускаете, уже скомпилирована к моменту времени (hello-world)
. Если вы скомпилировали файл заранее, вы можете передать скомпилированный файл в --load
. Например,
$ sbcl --noinform --load test.fasl --eval '(hello-world)'
HELLO-WORLD
Фактически, учитывая эквивалентность от --load
до --eval (load "filename")
, вы можете просто использовать базу имени файла, а если есть скомпилированная версия, то SBCL должен загрузить ее, а если нет, то SBCL будет загрузите исходный файл, и вы получите скомпилированный код таким образом. Например, в дальнейшем мы используем только --load test
:
$ sbcl --noinform --load test --eval '(hello-world)'
HELLO-WORLD