Запуск функции 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
Это запустит программу прямо в терминале. Если вы хотите скомпилировать его для запуска позже, см. Выше.
Я пытаюсь интегрировать sbcl
Common-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