web-dev-qa-db-ja.com

ターミナルコマンドプロンプトからの一般的なLISP関数の実行

これに対する答えを見つけるのが難しいので、それができないかもしれません。コマンドラインから、つまりemacs内からではなく、LISPファイルをロード/コンパイルし、そのファイル内のLISP関数の1つをコマンドラインからも実行できるという柔軟性が欲しいです。これは間違いなく実装固有の機能であるため、これを提供する実装へのポインタ(またはおそらくそれはかなり標準的なものかどうかはわかりません)。私はSBCLを使用していて、それが好きなので、これができれば素晴らしいと思います。

また、Mac OSXとターミナルを使用しています。

13
johnbakers

SBCLマニュアルでは、3つの便利なオプションについて説明しています

.3.1ランタイムオプション

_--noinform_
起動時にバナーやその他の情報メッセージの印刷を抑制します。これにより、Unixパイプラインで問題なく動作するLISPプログラムを簡単に作成できます。 _--noprint_および_--disable-debugger_オプションも参照してください。

.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 
_
23
Joshua Taylor

以下は 最初のgoogleの結果 からの貼り付けです:

クリップ

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

Arch Linuxターミナルでテストしたところ、次のことができます。

$ clisp myprogram.LISP

これはプログラムをターミナルで実行します。後で実行するためにコンパイルする場合は、上記のビットを参照してください。

4
TW80000

他の人々が示したように、ほとんどすべての実装には、ターミナルを介してLISPコードを実行するものがあります。多くの実装に共通のインターフェースを提供するラッパーもいくつかあります: [〜#〜] cim [〜#〜] および cl-launch

1
Luís Oliveira

sbcl Common-LISPをknitrを介してRに統合しようとしています。評価のリクエストを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

0
f0nzie