Ответ 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