私は初心者プログラマーで、「LandofLisp」という本を読んでいます。
私はREPLを使って本の例を入力しています。現在のプログラムを.lispファイルとして保存して、ロードして後で作業を続けることができるようにすることはできますか?テキストエディタで.lispファイルを作成してロードできることはわかっていますが、REPLをフルスクリーンモードで使用して例を実行することを楽しんでいます。
私は初心者プログラマーで、「LandofLisp」という本を読んでいます。
私はREPLを使って本の例を入力しています。現在のプログラムを.lispファイルとして保存して、ロードして後で作業を続けることができるようにすることはできますか?テキストエディタで.lispファイルを作成してロードできることはわかっていますが、REPLをフルスクリーンモードで使用して例を実行することを楽しんでいます。
いいえ。REPLに関数を入力すると、ソースフォームはなくなり、解釈またはコンパイルされたフォームが作成されます。あなたはいくつかの賢いことをすることができます、しかし私はあなたが今それらに対処したくないと思う。
まず、あなたがREPLを楽しんでいることは知っていますが、Emacs with SLIME(http://common-lisp.net/project/slime/)など、Lispをサポートしているエディターのいくつかを見てみることをお勧めします。両方の長所。エディターに入力し、REPLに入力しますが、現在の作業方法との違いは本当にわかりません。次に、好きな関数をコピーして「適切な」.lispファイルに貼り付けることができます。Emacsを使用するもう1つの利点は、Elispと呼ばれるLispのバリアントに基づいているため、Lispでエディターをプログラムできることです。コードをきれいに印刷し、再フォーマットして複数の関数にリファクタリングし、あらゆる種類の優れた処理を実行できます。
それでもclispと入力してREPLでプレイしたい場合は、オプションがあります。
REPLセッションの出力をログに記録する場合は、DRIBBLEを確認してください。セッションはファイルに記録され、後で編集して必要なものを抽出できます。
たとえば、これは単純なセッションです。
ataylor:~ $ clisp
何とか何とか
[1]> (dribble "/Users/ataylor/jerome.lisp")
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"/Users/ataylor/jerome.lisp">
[2]> (defun add-two (a b) (+ a b))
ADD-TWO
[3]> (add-two 1 2)
3
[4]> (dribble)
#<CLOSED OUTPUT BUFFERED FILE-STREAM CHARACTER #P"/Users/ataylor/jerome.lisp">
[5]>
Bye.
ファイルの内容を表示するのは簡単ですが、すぐに大きくなる可能性があります。
ataylor:~ $ cat jerome.lisp
;; Dribble of #<IO TERMINAL-STREAM> started on 2011-09-14 18:16:57.
#<OUTPUT BUFFERED FILE-STREAM CHARACTER #P"/Users/ataylor/jerome.lisp">
[2]> (defun add-two (a b) (+ a b))
ADD-TWO
[3]> (add-two 1 2)
3
[4]> (dribble)
;; Dribble of #<IO TERMINAL-STREAM> finished on 2011-09-14 18:17:16.
後で使用するために、コピー(defun add-two (a b) (+ a b))
してファイルに貼り付けることができます。
そのファイルのロード(私はそれをに追加しましたjerome1.lisp
)は非常に簡単です。
ataylor:~ $ cat jerome1.lisp
(defun add-two (a b) (+ a b))
ataylor:~ $ clisp
何とか何とか
[1]> (load "/Users/ataylor/jerome1.lisp")
;; Loading file /Users/ataylor/jerome1.lisp ...
;; Loaded file /Users/ataylor/jerome1.lisp
T
[2]> (add-two 1 2)
3
[3]>
Bye.
あなたができる最も簡単なことは、Lispセッションを画像に保存することです。作成またはコンパイルしたすべての関数と、ほとんどの状態が保存されます。次のセッションでロードすると、clispを終了していないかのようになります。これを行う方法は実装に依存し、clisp、sbclなどで異なります。clispで何をするかを説明します。
これに伴う問題は、ファイルを開いて編集したり、githubに投稿したりできないことです。簡単な例を挙げましょう。
ataylor:~ $ clisp
何とか何とか
[1]> (defun add-two (a b) (+ a b))
ADD-TWO
[2]> (add-two 1 2)
3
[3]> (EXT:SAVEINITMEM)
;; Wrote the memory image into lispinit.mem (3,422,616 bytes)
Bytes permanently allocated: 171,840
Bytes currently in use: 3,243,400
Bytes available until next GC: 808,130
3243400 ;
808130 ;
171840 ;
1 ;
65640 ;
7834
[4]>
Bye.
clispがメモリイメージを書き込んだ場所に関するメッセージに注意してください。-M
次回起動するときに、フラグを付けてclispに戻します。
ataylor:~ $ clisp -M lispinit.mem
何とか何とか
[1]> (add-two 1 2)
3
次の理由から、この同じ質問に対するより良い答えが欲しかったのです。
(1)言語を学ぶとき、実際に完全なアプリケーションを書くよりも実験したいことがよくあります。
(2)実験するとき、あなたの歴史を調べて、あなたが何を入力し、どのような結果を得たかを見るのは本当に素晴らしいことです。
(3)私は、コマンド履歴を文字通りテキストファイルにダンプして「スクリプト」と呼ぶことができるの世界から来ましたbash
(これは実際のスクリプトで得られるパワーのほんの一部ですが、bash
それでも機能します事後自動化の目的で、少しクリーンアップします。)
だから、の世界からbash
、私は単純なルートで行きました—私はstdoutダンプのクリーンアップを自動化しました。スクロールバック履歴のある端末(仮想端末以外のもの-VTでlispをコーディングする場合は奇妙です)を使用してclisp
インタラクティブに遊ぶ場合は、端末のスクロールバック履歴全体をファイルにコピーしてから、次のコマンドを実行します。
sed -n -e 's/^\[[0-9]\+\]> //;tstuff' -e 'b;:stuff' -e 'p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/{s/.*//;h;d;};h;n;p;x;G;brep' myfile.lisphist > myfile.lisp
魔法!あなたは動作しているlispプログラムを持っています。(明らかに、クリーンアップする必要があります。目的は履歴を保持することであり、実際にはプログラムとして使用することではありません。ただし、出力/結果ではなく、入力したlispコマンドのみが含まれるため、直接使用できます。プログラムファイル。)
その後、実行clisp -repl myfile.lisp
して出来上がり!前回のセッションで到達した場所に戻っています。もちろん、インタラクティブにロードするには、最後の(quit)
行を削除する必要があります。:)
そのコマンドに関しては、プロンプトsed
を探し、その行を印刷して(プロンプトを削除して)、括弧のバランスをとろうとします。成功すると、次のプロンプトをスキャンします。括弧のバランスが取れていない場合は、バランスがとれるまで行を印刷します。clisp
[number]>
実際には、次のように少し簡略化できます。
sed -n -e '/^\[[0-9]\+\]> /{s///;p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/d;h;n;p;x;G;brep' -e '}' myfile.lisphist > myfile.lisp
(注:使用していません。コマンドラインで直接呼び出されたemacs
だけを使用していclisp
ます。SLIME内にスクロールバック履歴があるかどうかはわかりません。