我曾经看过这个用过一次,但无法理解它做了什么.参考文献说它是
#n=object读取为任何对象具有对象作为其打印表示.但是,该对象标记为n,即必需的无符号十进制整数,可通过语法#n#进行引用.标签的范围是最外面的read调用读取的表达式; 在此表达式中,相同的标签可能不会出现两次.
对我来说,只读了56个随机选择的英语单词...请问您能举例说明何时可以使用这个单词?
在Common Lisp中,它由读者和打印机使用.
这样,您可以在某个s表达式中标记对象,并在s表达式的不同位置引用它.
标签#someinteger=后跟一个s表达式.整数必须是唯一的.您不能在单个s表达式中使用该标签两次.
对标签的引用是#someinteger#.整数标识要引用的s表达式.必须先引入标签,然后才能引用它.该引用可以在s表达式中多次使用.
例如,这用于读取和打印具有共享数据对象的循环列表或数据结构.
这是一个简单的例子:
? '(#1=(1 . 2) (#1#))
Run Code Online (Sandbox Code Playgroud)
读为
((1 . 2) ((1 . 2)))
Run Code Online (Sandbox Code Playgroud)
另请注意:
? (eq (first *) (first (second *)))
T
Run Code Online (Sandbox Code Playgroud)
它是一个相同的利弊细胞.
我们来试试一个循环列表.
确保打印机处理圆形列表并且不会永久打印它们...
? (setf *print-circle* t)
T
Run Code Online (Sandbox Code Playgroud)
现在我们正在构建一个列表:
? (setf l1 (list 1 2 3))
(1 2 3)
Run Code Online (Sandbox Code Playgroud)
我们将最后一个cdr设置为第一个缺点:
? (setf (cdr (last l1)) l1)
#1=(1 2 3 . #1#)
Run Code Online (Sandbox Code Playgroud)
如上所示,打印列表获取标签,最后一个cdr是对该标签的引用.
我们也可以使用相同的表示法直接输入循环列表.读者理解它:
? '#1=(1 2 3 . #1#)
#1=(1 2 3 . #1#)
Run Code Online (Sandbox Code Playgroud)
既然我们告诉打印机处理这样的构造,我们可以尝试第一个例子中的表达式:
? '(#1=(1 . 2) (#1#))
(#1=(1 . 2) (#1#))
Run Code Online (Sandbox Code Playgroud)
现在打印机检测到对同一个cons对象有两个引用.