可读地打印lisp功能

时间:2011-03-01 13:31:58

标签: lisp common-lisp

我正在尝试使用lisp并在http://www.gigamonkeys.com/book/处完成Practical Common Lisp一书。

是否有一个命令可以打印以前在REPL中定义的函数,以后可以读取?我试过了

(print #'function-name)

但是这导致#<>中包含的输出无法读回(如果*print-readably*设置为*print-readably,我只会收到错误消息)。我使用Tprinc代替prin1得到相同的结果。

我有点惊讶这不容易找到。我在lisp上阅读的一些内容鼓励在REPL中进行实验,但如果在输入后无法保存函数,则在进入它们之前,您必须将它们写在单独的文件中,这部分失败了重点。

4 个答案:

答案 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一样简单 更多参与。