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

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

также я использую Mac OSX и терминал.

3 ответов


руководство SBCL описывает три полезных параметра

3.3.1 Варианты Выполнения

--noinform
Запретить печать любого баннера или другого информационное сообщение при запуске. Это упрощает написание Lisp программы, которые работают чисто в конвейерах Unix. См. также --noprint и --disable-debugger параметры.

3.3.2 Топлевел Варианты

--eval command
После выполнения любого файла инициализации, но перед запуском цикла read-eval-print на стандартном входе, прочитайте и оцените команда дана. Более одного можно использовать, и все будут прочитаны и выполнены, в порядке их появления по команде линия.

--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 to --eval (load "filename"), вы можете просто использовать базу имени файла, и если есть скомпилированная версия, то SBCL должен загрузить это, а если нет, то SBCL загрузит исходный файл, и вы получите скомпилированный код таким образом. Например, в следующем мы используем just --load test:

$ sbcl --noinform --load test --eval '(hello-world)'

HELLO-WORLD 

ниже вставить первый результат google:

clisp может

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

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

clisp может -с теста.шепелявить!--4-->

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

clisp-q-c тест.шепелявить!--4-->

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

clisp-q-q-on-error abort-x '(progn (load "test") (main) (бросай курить))'

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

$ clisp myprogram.lisp

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


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