Common lisp 理解公共lisp中的尖引号

Common lisp 理解公共lisp中的尖引号,common-lisp,Common Lisp,在我下面的实验中,我简化了REPL返回错误的地方,并添加了[num],以便在讨论中引用 我有点困惑,为什么我尝试调用存储在变量中的函数失败了。在我看来,语法比它需要的更复杂 为什么我既不能发f 3,也不能发f 3? 是否不允许在表单的第一个元素中使用尖引号? 为什么这里都需要 [235]>setf f'abs;我同意这一点 [236]>abs 3;这很好 3. [237]>f3;由于sep.fn命名空间而导致错误。好啊 -Err[1]:未定义的函数f- [238]>'f3;别明白这个错误告诉我的

在我下面的实验中,我简化了REPL返回错误的地方,并添加了[num],以便在讨论中引用

我有点困惑,为什么我尝试调用存储在变量中的函数失败了。在我看来,语法比它需要的更复杂

为什么我既不能发f 3,也不能发f 3? 是否不允许在表单的第一个元素中使用尖引号? 为什么这里都需要

[235]>setf f'abs;我同意这一点 [236]>abs 3;这很好 3. [237]>f3;由于sep.fn命名空间而导致错误。好啊 -Err[1]:未定义的函数f- [238]>'f3;别明白这个错误告诉我的。。。 -错误[2]:“F不是函数名,请尝试改用符号 [239]>funcall'f3;似乎很啰嗦。。。! 3. 这是否意味着系统功能的处理方式与用户定义的功能不同

完整性:

[240]>funcall abs 3 -Err[3]:变量ABS没有值-;我明白为什么这是一个错误。 [241]>funcall'abs3;这不是很冗长吗? 3. 我还没有到ANSI Common Lisp中的符号章节,也许这会有帮助。。。谢谢你的提示

[235]> (setf f #'abs)               ; I'm ok with this
#<SYSTEM-FUNCTION ABS>
上述功能称为abs

上图:没有名为f的函数

上图:Common Lisp只接受符号作为函数名、符号作为宏名、符号作为特殊运算符或lambda表达式作为cons表单的第一个元素。函数f不是函数名

这是否意味着系统功能的处理方式与用户定义的功能不同

没有

上面使用命名函数f中的函数对象调用函数funcall。funcall然后以3作为参数调用此函数对象

似乎很冗长

是的

为什么我既不能发f 3,也不能发f 3?是否不允许在表单的第一个元素中使用尖引号

因为f没有命名函数。它命名了一个变量f也不是函数名。实际上,我们需要使用函数名作为符号

名称空间

与其他一些Lisp方言一样,Common Lisp有两个用于函数和变量的名称空间

定义变量foo:

定义函数foo:

我们可以使用从变量foo获得的值调用函数foo:

如何从函数的全局名称获取函数对象:

CL-USER 57 > (fdefinition 'foo)
#<interpreted function FOO 4060001CAC>

CL-USER 58 > (symbol-function 'foo)
#<interpreted function FOO 4060001CAC>
或者只使用变量:

CL-USER 60 > (symbol-value 'foo)
3
CL-USER 61 > foo
3
一些积极因素:

正面:没有名字冲突

我们可以写作

(defun foo (list) (list list))
而且不用写

(defun foo (lst) (list lst))
正面:更简单的编译

(let ((list 3))
  (list 1 list 3))
上述内容在Common Lisp中永远不会出错。在Scheme中,这将是一个错误:3不是一个函数

上述功能称为abs

上图:没有名为f的函数

上图:Common Lisp只接受符号作为函数名、符号作为宏名、符号作为特殊运算符或lambda表达式作为cons表单的第一个元素。函数f不是函数名

这是否意味着系统功能的处理方式与用户定义的功能不同

没有

上面使用命名函数f中的函数对象调用函数funcall。funcall然后以3作为参数调用此函数对象

似乎很冗长

是的

为什么我既不能发f 3,也不能发f 3?是否不允许在表单的第一个元素中使用尖引号

因为f没有命名函数。它命名了一个变量f也不是函数名。实际上,我们需要使用函数名作为符号

名称空间

与其他一些Lisp方言一样,Common Lisp有两个用于函数和变量的名称空间

定义变量foo:

定义函数foo:

我们可以使用从变量foo获得的值调用函数foo:

如何从函数的全局名称获取函数对象:

CL-USER 57 > (fdefinition 'foo)
#<interpreted function FOO 4060001CAC>

CL-USER 58 > (symbol-function 'foo)
#<interpreted function FOO 4060001CAC>
或者只使用变量:

CL-USER 60 > (symbol-value 'foo)
3
CL-USER 61 > foo
3
一些积极因素:

正面:没有名字冲突

我们可以写作

(defun foo (list) (list list))
而且不用写

(defun foo (lst) (list lst))
正面:更简单的编译

(let ((list 3))
  (list 1 list 3))

上述内容在Common Lisp中永远不会出错。在Scheme中,这将是一个错误:3不是一个函数。

谢谢-很高兴听到有两个名称空间的好处。我可以再问一个问题吗?我使用setf,就像在setf'abs中一样,我现在知道它将一个函数对象赋给变量f,而不是赋给函数名f,这完全不是惯用法吗?是否仅使用defun将符号指定为函数名f?我明白了,除了flet&labels,如果我想给变量f赋值的话,我可以这样做,但如果我愿意,我只能接受我们所指的冗长。。。继续到符号一章。。。非常感谢雷纳@mwal:setf的“主要”问题。。。到目前为止,f是一个未定义的变量…@mwal:你可以将变量设置为函数,但我们需要一个原因。。。
谢谢-很高兴听到有两个名称空间的好处。我可以再问一个问题吗?我使用setf,就像在setf'abs中一样,我现在知道它将一个函数对象赋给变量f,而不是赋给函数名f,这完全不是惯用法吗?是否仅使用defun将符号指定为函数名f?我明白了,除了flet&labels,如果我想给变量f赋值的话,我可以这样做,但如果我愿意,我只能接受我们所指的冗长。。。继续到符号一章。。。非常感谢雷纳@mwal:setf的“主要”问题。。。到目前为止,f是一个未定义的变量…@mwal:你可以将变量设置为函数,但我们需要一个原因。。。
(defun foo (lst) (list lst))
(let ((list 3))
  (list 1 list 3))