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