List Lisp';什么是列表?

List Lisp';什么是列表?,list,lisp,common-lisp,List,Lisp,Common Lisp,所以我有一段简单的代码: (defun lol (z) (getf (list :a 1 :b 2 :c 3) :z)) 当我启动该功能时: (lol '(a)) 它只给我零而不是1。从技术上讲,上述内容是否与: (getf (list :a 1 :b 2 :c 3) :a) 为什么会发生这种情况?我如何修复它?第一个getf在一个特定类型的列表上工作。此外,函数lol不使用变量z。它总是在属性列表中查找:z关键字。如果要参数化lol查找的符号,则不会传递列表(”(a)),而是传递关键字

所以我有一段简单的代码:

(defun lol (z) (getf (list :a 1 :b 2 :c 3) :z))
当我启动该功能时:

(lol '(a))
它只给我零而不是1。从技术上讲,上述内容是否与:

(getf (list :a 1 :b 2 :c 3) :a)
为什么会发生这种情况?我如何修复它?

第一个getf在一个特定类型的列表上工作。此外,函数lol不使用变量z。它总是在属性列表中查找
:z
关键字。如果要参数化lol查找的符号,则不会传递列表(
”(a)
),而是传递关键字

(defun lol (z)
  (getf (list :a 1 :b 2 :c 3) z))

(lol :a) ; => 1
第一个getf在一个特定类型的列表上工作。此外,函数lol不使用变量z。它总是在属性列表中查找
:z
关键字。如果要参数化lol查找的符号,则不会传递列表(
”(a)
),而是传递关键字

(defun lol (z)
  (getf (list :a 1 :b 2 :c 3) z))

(lol :a) ; => 1
(getf L:z)
在当前绑定到
L
的列表中查找与符号
:z
关联的值:

  • :z
    与符号几乎没有关系
    z
  • :z
    与当前绑定到
    z
至少,读一读(为什么不读整本书)

您不能将
z
绑定到
a
并期望
:z
计算为
:a
。您可以做的是将
z
绑定到
a
并根据
z
的当前值访问符号
:a
。此外,symbol
:z
是一个关键字,不能用作局部变量

(defun lol (z) (getf '(:a 1 :b 2 :c 3) z))
在上面的示例中,局部变量
z
将保存一个值,该值将传递给调用
getf

在本次通话中:

(lol '(a))
。。。局部变量
z
绑定到
(a)
,这是一个常量列表,其第一个元素是符号
a
。当在
lol
中使用此值时,除了
nil
之外,不可能返回任何其他值,因为它会在列表中搜索相同的、相同的元素(如果需要,可以使用相同的内存地址)

应使用符号调用,因为两次出现的
package:symbol
引用相同的数据结构(如哈希映射)。你必须这样称呼它:

(lol 'symbol)
或者,由于关键字会自行评估:

(lol :symbol)
在您的情况下,
(lol:a)
将得到1。

(getf L:z)
在当前绑定到
L
的列表中查找与符号
:z
关联的值:

  • :z
    与符号几乎没有关系
    z
  • :z
    与当前绑定到
    z
至少,读一读(为什么不读整本书)

您不能将
z
绑定到
a
并期望
:z
计算为
:a
。您可以做的是将
z
绑定到
a
并根据
z
的当前值访问符号
:a
。此外,symbol
:z
是一个关键字,不能用作局部变量

(defun lol (z) (getf '(:a 1 :b 2 :c 3) z))
在上面的示例中,局部变量
z
将保存一个值,该值将传递给调用
getf

在本次通话中:

(lol '(a))
。。。局部变量
z
绑定到
(a)
,这是一个常量列表,其第一个元素是符号
a
。当在
lol
中使用此值时,除了
nil
之外,不可能返回任何其他值,因为它会在列表中搜索相同的、相同的元素(如果需要,可以使用相同的内存地址)

应使用符号调用,因为两次出现的
package:symbol
引用相同的数据结构(如哈希映射)。你必须这样称呼它:

(lol 'symbol)
或者,由于关键字会自行评估:

(lol :symbol)

在您的情况下,
(lol:a)
将为您提供1。

之所以会出现这种情况,是因为
(a)
是一个列表,其头部包含名为
a
的符号,位于当前包中,
:z
是名为
z
的符号,位于
关键字
包中。绑定到
:z
的值顺便说一句,“名为z的符号,存放在关键字包中”

绑定到符号
z
(在当前包中)的值决不会影响
:z
的值


因此,不,
(defun lol(z)(getf(list:a1:b2:c3):z))
定义了一个返回与
(getf(list:a1:b2:c3):z)相同值的函数。要修复它,请将
:z
替换为
z
,并调用类似
(lol:a)
的函数,因为列表和符号基本上是不可互换的。

之所以会发生这种情况,是因为
(a)
是一个列表,其头部包含名为
a
的符号,在当前包中插入,
:z
是名称为
z
的符号,在
关键字
包中插入。绑定到
:z
的值顺便说一句,“名为z的符号,存放在关键字包中”

绑定到符号
z
(在当前包中)的值决不会影响
:z
的值


因此,不,
(defun lol(z)(getf(list:a1:b2:c3):z))
定义了一个返回与
(getf(list:a1:b2:c3):z)相同值的函数。若要修复它,请将
:z
替换为
z
,并调用类似
(lol:a)
的函数,因为列表和符号基本上是不可互换的。

还有一些其他答案可以解决这个问题,但我认为有时一个示例是有用的。重要的部分是符号有包,并且(除了一些注意事项)一个包中具有给定名称的符号与另一个包中具有相同名称的符号不同

CL-USER> (defparameter *plist* (list 'a 1 ':a 2))
*PLIST*
CL-USER> (first *plist*)
A
CL-USER> (third *plist*)
:A
CL-USER> (eql (first *plist*) (third *plist*))
NIL
CL-USER> (getf *plist* 'a)
1
CL-USER> (getf *plist* ':a)
2
现在,一开始可能让人有点困惑的是,符号是p