gpt4 book ai didi

lisp - 在 Lisp 中,为什么我们需要使用列表函数来返回列表?

转载 作者:行者123 更新时间:2023-12-05 08:45:11 29 4
gpt4 key购买 nike

我原以为这会起作用:

(defun list-of-things (thing1 thing2 thing3)
"returns a ???"
'(thing1 thing2 thing3))

但这实际上是返回列表所需要的:

(defun list-of-things (thing1 thing2 thing3)
"returns a list"
(list thing1 thing2 thing3))

最佳答案

这是两个不同的东西,也是 Lisp 语言的核心概念。

语法 '(a b c)(quote (a b c)) 的简写和 quote是一种特殊形式,它返回其参数 unevaluated。在这种情况下,它将是包含三个符号的列表。

另一方面,list是一个普通函数,它计算它的参数并返回它们的值列表。

更深入一点:在评估任何表达式之前,必须阅读代码。 Lisp 特有的部分(事实上,Common Lisp 更是如此)是“解析器”实际上只是一个 Lisp 函数,返回 Lisp 对象。这些对象然后被提供给“评估者”,评估者评估它们:

  • 读取字符时'(thing1 thing2 thing3) , 读者知道 '是一个阅读器宏,所以它显示为(quote (thing1 thing2 thing3)) .这是一个包含两个元素的列表,一个符号和另一个包含三个符号的列表。然后将此列表提供给评估器:它知道 quote是一种特殊形式,它返回未计算的参数,因此它只返回列表 (thing1 thing2 thing3) , 由读者提供给它。
  • 另一方面,在阅读 (list thing1 thing2 thing3) 时,读者还将其作为列表(这次包含 4 个符号)阅读,然后将其提供给评估者。现在,评估者看到第一个符号是 list ,一个函数,因此它评估参数(它确定符号 thing1 ... 绑定(bind)到什么),将它们传递给 list功能等

所有这一切都是可能的,因为 Lisp code 是根据 Lisp objects(例如列表等)定义的。在“解析”(实际上称为阅读)阶段之后,评估者实际上得到了一个实际的 Lisp 对象来评估。在谈到编译等时,事情当然会稍微复杂一些,但总体思路是一样的。 quote运算符,缩写 ' , 是一种“直接”访问读者创建的事物并“绕过”评估的方法。

关于lisp - 在 Lisp 中,为什么我们需要使用列表函数来返回列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73681303/

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