Можно ли сохранить исходные файлы в Clisp?

Я начинающий программист и просматриваю книгу "Land of Lisp".

Я печатал примеры из книги с REPL. Можно ли сохранить мою нынешнюю программу .lisp-файл, чтобы я мог загрузить его и продолжить работу над ним позже? Я знаю, что могу просто создать .lisp-файлы в текстовом редакторе и загрузите их, но мне нравится использовать REPL в полноэкранном режиме для выполнения примеров.

2 ответов


короткий ответ:

нет. Как только вы вводите функцию в REPL, исходная форма исчезает, и у вас просто есть интерпретированная или скомпилированная форма. Вы можете делать некоторые умные вещи, но я подозреваю, что вы не хотите иметь с ними дело прямо сейчас.

ответ

используйте Emacs и слизь

во-первых, я знаю, что вам нравится REPL, но я бы рекомендовал вам посмотреть на некоторых редакторов с поддержкой Lisp, таких как Emacs со слизью (http://common-lisp.net/project/slime/), что дает вам лучшее из обоих миров. Вы печатаете в редакторе, он печатает в REPL, и вы действительно не знаете разницы от того, как вы делаете вещи сейчас. Затем вы можете скопировать и вставить функции, которые вам нравятся, в" правильный".файл lisp. Другим преимуществом использования Emacs является то, что он основан на варианте Lisp под названием Elisp, поэтому вы можете запрограммировать свой редактор в 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 может писал образ памяти. Ты отдай clisp может с -M флаг при запуске в следующий раз.

ataylor:~  $ clisp -M lispinit.mem 

бла бла

[1]> (add-two 1 2)
3

Я хотел лучшего ответа на этот же вопрос по следующим причинам:

(1) при изучении языка, часто вы больше хотите экспериментировать, чем на самом деле написать полное приложение.

(2) при экспериментировании может быть очень приятно просмотреть свою историю и посмотреть, что вы ввели и какие результаты получили.

(3) я пришел из мира bash, где вы можете буквально сбросить историю команд в текстовый файл и вызвать его "скрипт" (хотя это лишь крошечная часть мощности, которую вы можете получить с помощью actual bash скриптинг, он по-прежнему служит цели автоматизации после факта, с небольшой очисткой.)

Итак, из мира bash, Я просто пошел по простому маршруту-я автоматизировал очистку дампа stdout. Если вы используете терминал с историей прокрутки (что угодно, кроме виртуального терминала-и если вы кодируете lisp в VT, вы просто странный), чтобы играть с 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.