Можно ли сохранить исходные файлы в 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.