gpt4 book ai didi

lisp - Sharpsign 等号阅读器宏示例?

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:57 25 4
gpt4 key购买 nike

我见过这个用过一次,但不明白它的作用。引用资料说是

#n=object reads as whatever object has object as its printed representation. However, that object is labeled by n, a required unsigned decimal integer, for possible reference by the syntax #n#. The scope of the label is the expression being read by the outermost call to read; within this expression, the same label may not appear twice.

在我看来,这只是 56 个随机选择的英语单词...请举例说明何时可以使用它?

最佳答案

在 Common Lisp 中,它由阅读器和打印机使用。

这样你就可以在一些 s-expression 中标记一个对象并在 s-expression 中的不同位置引用它。

标签是 #someinteger= 后跟一个 s 表达式。整数必须是唯一的。您不能在单个 s 表达式中两次使用标签。

对标签的引用是#someinteger#。该整数标识要引用的 s-expression。必须先引入标签,然后才能引用它。引用可以在一个 s 表达式中多次使用。

例如,这用于读取和打印循环列表或具有共享数据对象的数据结构。

这里有一个简单的例子:

? '(#1=(1 . 2) (#1#))

读作

((1 . 2) ((1 . 2)))

另请注意:

? (eq (first *) (first (second *)))
T

这是一个相同的cons cell。

让我们试试循环列表

确保打印机处理循环列表并且不会永远打印它们...

? (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#))

现在打印机检测到有两个对同一个 cons 对象的引用。

关于lisp - Sharpsign 等号阅读器宏示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12649290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com