我已经看到了这个用了一次,但不明白它做什么。 基准说,这是
#n=object
读取,无论对象具有对象作为其打印表示。 但是,该对象由n标记,所需无符号十进制整数,由语法#N#可能的参考。 标签的范围是由最外层的呼叫正被读取到读表达; 此表达式中,相同的标记可能不会出现两次。
这对我来说全文只有56随机选择的英语单词......你能不能请,表明这时候可以使用的例子吗?
我已经看到了这个用了一次,但不明白它做什么。 基准说,这是
#n=object
读取,无论对象具有对象作为其打印表示。 但是,该对象由n标记,所需无符号十进制整数,由语法#N#可能的参考。 标签的范围是由最外层的呼叫正被读取到读表达; 此表达式中,相同的标记可能不会出现两次。
这对我来说全文只有56随机选择的英语单词......你能不能请,表明这时候可以使用的例子吗?
在Common Lisp中它是由阅读器和打印机使用。
这样你可以在一些s表达式标注的对象,并在S-表达是指它在不同的地方。
标签是#someinteger=
后跟s表达式。 该整数必须是唯一的。 你不能在一个s表达式中使用的标签的两倍。
为标签的引用#someinteger#
整数标识s表达式来参考。 必须引入的标签,它可以被引用之前。 基准可以s表达式中被使用多次。
例如,这是在阅读和打印圆形列表或数据结构用于与共享数据对象。
这里一个简单的例子 :
? '(#1=(1 . 2) (#1#))
全文
((1 . 2) ((1 . 2)))
还要注意这一点:
? (eq (first *) (first (second *)))
T
它是一个相同cons单元。
让我们尝试循环列表 。
确保打印机与圆形列出涉及和没有永远打印出来...
? (setf *print-circle* t)
T
现在,我们正在建设一个列表:
? (setf l1 (list 1 2 3))
(1 2 3)
我们设定的最后CDR到第一缺点:
? (setf (cdr (last l1)) l1)
#1=(1 2 3 . #1#)
正如你可以在上面看到,打印清单得到一个标签和最后一个CDR是该标签的参考。
我们也可以直接使用相同的符号输入一个循环链表。 读者理解它:
? '#1=(1 2 3 . #1#)
#1=(1 2 3 . #1#)
既然我们已经告诉对付这种结构的打印机,我们可以尝试从第一个例子表达:
? '(#1=(1 . 2) (#1#))
(#1=(1 . 2) (#1#))
现在打印机检测到有两个引用到相同的利弊对象。