我正在尝试使用lisp并在http://www.gigamonkeys.com/book/处完成Practical Common Lisp一书。
是否有一个命令可以打印以前在REPL中定义的函数,以后可以读取?我试过了
(print #'function-name)
但是这导致#<>
中包含的输出无法读回(如果
设置为*print-readably
**print-readably
,我只会收到错误消息)。我使用T
或princ
代替prin1
得到相同的结果。
我有点惊讶这不容易找到。我在lisp上阅读的一些内容鼓励在REPL中进行实验,但如果在输入后无法保存函数,则在进入它们之前,您必须将它们写在单独的文件中,这部分失败了重点。
答案 0 :(得分:11)
无法回读功能对象。
1)您可以使用DRIBBLE功能,这会将REPL输入保存到文件中。
2)从编辑器到REPL的评估很常见。您不需要键入REPL,可以键入编辑器文本缓冲区并将表达式从那里发送到REPL。
3)Common Lisp具有FUNCTION-LAMBDA-EXPRESSION,在某些情况下可能能够恢复源代码(或Lisp系统记录为源代码):
CL-USER 200 > (defun foo (a) (+ a b))
FOO
CL-USER 201 > (function-lambda-expression #'foo)
(LAMBDA (A) (DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 41C00751D3>))
(DECLARE (LAMBDA-NAME FOO))
(+ A B))
NIL
FOO
答案 1 :(得分:2)
简而言之,没有,但是,相反的情况很容易 - 将它们写入文件并使用emacs&amp ;;将它们发送到repl非常容易。煤泥。
默认情况下,iirc C-x e
会在repl中的point(emacs游标)之前立即评估表单。
这为您提供了两全其美 - 文件的一致性和repl的交互性。
祝你的lisp之旅好运!
答案 2 :(得分:0)
编译函数,永远不会存储它们的源代码。我建议使用Emacs + Slime,在那里浏览你的历史很容易。
答案 3 :(得分:0)
我建议您使用emacs。加载漂亮的打印机功能。包裹是(报价pp)。只是apropos漂亮的打印机。 Slime还可以对函数进行预处理打印(如果我记得正确),但是包含emacs的包很不错。
(要求'pp)
我编写了一个格式语句,用于打印匿名(或命名)函数,但代码在另一台机器上。如果你有兴趣让我知道,我会试着找到它。
[...]
是的,您可以在以后找到并打印在REPL中键入的函数,只需检查函数名称的命名空间。将名称空间视为哈希表。如果功能 已被实习,然后它应该出现在命名空间中。我认为有办法 比如说,maphash命名空间......
lisp的某些实现要求您设置变量以保持功能代码附加到函数符号;这就像在c中调试符号一样。它占用空间 但调试自动生成的函数是一个婊子,抛出一些宏-1扩展...
尝试使用命令,, ...我正在画一个空白。有一阵子了。通常最大的问题是修复未命名的函数(lambda表达式)。一些实现还实现了“命名匿名函数”或类似的东西。
&LT;是否有一个命令可以打印一个先前在REPL中定义的函数&lt;以后可以阅读的方式吗?
一个非常好的问题。是的你可以。它可能像write-fasl-stream一样简单 更多参与。