gpt4 book ai didi

lisp - 在 Common Lisp 中引用

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

最近开始学习lisp。我正在查看书中的示例 Land of Lisp在我看到第 7 章附近的以下示例之前,我觉得我已经很好地理解了所有内容:

(defun quote-it (x)
(list 'quote x))

现在,我知道 list 会创建一个带有参数的列表,比如 (list 1 2 3 4) 会计算出列表 (1 2 3 4)

而且我还知道 quote 允许我引用一个论点,就像我可以使用 ' 一样。所以 'east(quote east)

相同

现在,有趣的是,上面的函数不返回列表,而只是引用我传递给它的任何内容。所以,如果我称它为

(quote-it east) 它只会返回 'east 而不是 ('east)

如果我这样做了,我会把这个函数写成

(defun quote-it (x) 
(quote x))

因此,我不知道为什么我们在书中示例中的 (list 'quote x) 中将命令写为 'quote

我知道我可以使用引号在代码和数据之间切换,例如 '(+ 1 2),但在这种情况下,我的意图似乎是在此处实际应用引号功能。那么,为什么要(list 'quote x)

那么,有经验的人可以澄清一下吗?

最佳答案

Lisp 源代码由一些在 Lisp 编程中使用的相同数据结构表示。这里特别重要的是列表和符号。当 Lisp 计算一个形式为

的形式时
(quote something)

也就是说,当 Lisp 计算一个列表形式时,它的第一个元素是符号 quote , 然后它返回对象 something 不对其进行评估。因此

(quote 2)       ;=> 2
(quote (a b c)) ;=> (a b c)

现在,这就是求值器(或编译器等)在获取要求值的 Lisp 对象时所做的事情,而该对象恰好是一个列表,其第一个元素是符号 quote。 .作为 Lisp 程序员,我们仍然必须编写代码供 Lisp 阅读器 阅读并传递给评估者。我们可以写长表格

(quote 2)
(quote (a b c))

在我们的源代码中,Lisp 阅读器将读取它们并将它们传递给编译器,但我们是 virtuous programmers ,所以我们很懒,想避免打字。所以,我们可以输入

'2
'(a b c)

相反。 编译器 最终得到完全相同的输入;第一个元素是符号 quote 的列表第二个值为 2(a b c) .

现在我们可以讨论您的代码了。表格

(list 'quote x)

返回一个列表,其第一个元素是符号 quote ,其第二个元素是变量的值 x .这可以打印

(quote <value-of-x>) ; fill in x's value for <value-of-x>, of course

现在,Lisp 打印机有点聪明,它可以选择使用我们在编写源代码时允许使用的相同速记来打印类似的东西。这样也可以打印为

'<value-of-x>

现在我们已经足以解决您关于本书代码的问题了:

Now, interestingly, the function above does not return a list, but simply quotes whatever I pass to it. And so, if I call it

(quote-it east) it would simply return 'east and not ('east)

'east(quote east) 的缩写,我们现在看到 (quote-it east) 确实,事实上,返回一个列表。它是您期望的形式的列表:第一个元素是符号 quote 的列表其第二个元素是符号 east .如果它返回('east) ,它仍然会返回一个列表,但它会返回一个错误形式的列表。 ('east)是,当我们展开缩写时,列表 ((quote east)) ;也就是说,它是一个包含单个元素的列表,而该元素是另一个列表,其第一个元素是符号 quote其第二个元素是符号 east .这当然是一个列表,但它不是您要查找的列表。

现在我们可以看一下您建议的代码。你的功能quote-it只有在您调用 (quote-it 'x) 的情况下才会碰巧起作用.也就是说,你可以做

(quote-it 'x)
;=> x

但请注意,您得到了一个符号,并且您得到了符号x。后退。您没有得到第一个元素是符号 quote 的列表第二个元素是<value-of-x> .当您使用 quote-it使用其他值,您会看到问题:

(quote-it 2)
;=> x

仍然得到一个符号,因为

(defun quote-it (x) 
(quote x)) ; or 'x

接受一个参数,将其绑定(bind)到词法变量 x , 然后返回 (quote x) 的值. (quote x) 的值是多少? ?如前所述,当求值器(或编译器等)获得符号列表时 quotesomething , 值为文字 something .由于 body quote-it是符号列表 quote和符号 x ,正文的值(value)quote-it是符号 x .

关于lisp - 在 Common Lisp 中引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20041446/

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