Могу ли я сохранить исходные файлы в Clisp? - PullRequest
13 голосов
/ 15 сентября 2011

Я начинающий программист и изучаю книгу "Земля Лисп".

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

Ответы [ 2 ]

20 голосов
/ 15 сентября 2011

Краткий ответ

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

Длинный ответ

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

Во-первых, я знаю, что вам нравится REPL, но я бы посоветовал вам взглянуть на некоторые редакторы с поддержкой Lisp, такие как Emacs с SLIME (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 записал образ памяти. При следующем запуске вы вернете его обратно с флагом -M.

ataylor:~  $ clisp -M lispinit.mem 

бла-бла

[1]> (add-two 1 2)
3
1 голос
/ 15 декабря 2015

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

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

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

(3) Я родом из мира bash, где вы можетебуквально выведите историю команд в текстовый файл и назовите его «сценарием» (хотя это лишь малая часть мощности, которую вы можете получить с помощью реальных сценариев 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.

...