Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Нет. Как только вы введете функцию в 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, 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

Ответ 2

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

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

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

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