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

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

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

3 ответа

Решение

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

3.3.1 Параметры времени выполнения

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

3.3.2 Опции Toplevel

--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 

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

CLISP

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

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

clisp -c test.lisp

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

clisp -q -c test.lisp

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

clisp -q -q -on-error abort -x '(progn (загрузить "test") (main) (quit))'

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

$ clisp myprogram.lisp

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

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

Я пытаюсь интегрировать sbclCommon-Lisp в R через knitr. Вот несколько тестов о том, как отправить запрос на оценку вsbclа затем верните его R. Это работает для отправки форм, а не файла. Из терминала:

sbcl --noinform --eval '(progn (print (* 2 3 4 5)) (sb-ext:quit))'
;; 120

sbcl --noinform --eval '(progn (print (* 2 3 4 5)) (sb-ext:quit))'
;; ПРИВЕТ МИР

sbcl --noinform --eval "(progn (dotimes (i 5) (print i)) (sb-ext:quit))"
;; 0
;; 1
;; 2
;; 3
;; 4

Другие вопросы по тегам