符号和名称有区别吗? Paul Graham 的 On Lisp 专注于常见的 lisp,有一些讨论似乎暗示了这一点,例如
Since lambda-expressions are also names of functions, they can also appear first in function calls:
((lambda (x) (* x 2) 3)
6
这听起来像是符号是名字,但名字不是符号。但我不明白什么样的 Lisp“对象”符号是/可能是什么。
这也是源自 my question here关于尖引号 (#'
) 运算符 v. symbol-function
。我怀疑这些不同的唯一原因是因为并非所有名称都是符号,但我还没有足够的背景知识来理解这些答案(因此出现了这个问题)。
我还要求对 elisp v. common lisp 进行澄清。我假设这与词法形式有关,直到版本 24(我认为是 24.1)才在 elisp 中引入。
最佳答案
Lambda 表达式不是函数的名称。只是 ((lambda (...) ...) ...)
在 Common Lisp 中是允许的,因为它在标准中被定义为合法语法。
Common Lisp 中唯一允许的函数名称是符号和列表,如 (setf symbol)
。
例如可以写
(defun (setf foo) (...) ...)
这里的(setf foo)
是函数名。
Common Lisp 中不存在其他函数名,只有符号和(setf symbol
) 名。
Common Lisp Hyperspec 词汇表:Function Name .
function name n. 1. (in an environment) A symbol or a list (setf symbol) that is the name of a function in that environment. 2. A symbol or a list (setf symbol).
注意:1984 年的 Common Lisp 版本(在 CLtL1 中发布)确实只有符号作为函数名称。因此,函数名称 的概念并未定义。从符号中检索函数的函数称为 SYMBOL-FUNCTION
。 1989 年,ANSI CL 标准化组决定添加 setf 列表作为函数名称。它还引入了函数 FDEFINITION
,它类似于 SYMBOL-FUNCTION
,但除了符号之外,它还接受其他函数名称。看这里:Issue FUNCTION-NAME .
关于lisp - 符号和名称不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29333679/