Запуск общей функции Lisp из командной строки терминала

Мне сложно найти ответ на этот вопрос, так что, возможно, это невозможно. Мне бы хотелось, чтобы вы могли загрузить/скомпилировать файл lisp из командной строки, то есть не внутри emacs, а затем также запустить одну из функций lisp в этом файле также из командной строки. Это, несомненно, особенность реализации, поэтому любые указатели на реализацию, которая предлагает это (или, может быть, довольно стандартную, я не знаю). Я использую SBCL и люблю это, поэтому было бы здорово, если бы это было возможно.

Также я использую Mac OSX и Terminal.

Ответ 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 

Ответ 2

Ниже приведена вставка из первого результата Google:

CLISP

Если вы используете среду CLISP Common Lisp, применяется следующее.

Чтобы скомпилировать программу с именем test.lisp в файл байт-кода с именем test.fas, выполните следующие действия.

clisp -c test.lisp

Если вы хотите отобразить меньше выводимых данных, сделайте следующее.

clisp -q -c test.lisp

Чтобы запустить скомпилированный (или даже не скомпилированный, если вы пропустите вышеописанный шаг) файл Lisp, сделайте следующее, считая, что ваша функция ввода называется main. Обычно результат основной функции отображается, когда это делается, но команда (quit) предотвращает это. Параметр -on-error abort исключает сброс clisp в приглашение отладки и выходит из него при возникновении ошибки.

clisp -q -q -on-error abort -x '(progn (load "test" ) (main) (quit))'

Я только что протестировал его на моем терминале arc linux, и вы можете сделать следующее:

$ clisp myprogram.lisp

Это запустит программу прямо в терминале. Если вы хотите скомпилировать его для запуска позже, см. Приведенный выше бит.

Ответ 3

Как показали другие люди, почти все реализации имеют некоторый код запуска Lisp через терминал. Существуют также некоторые обертки, которые обеспечивают общий интерфейс для многих реализаций: CIM и cl-launch.