lisp - 符号和名称不同吗?

标签 lisp elisp common-lisp symbols lexical-scope

符号和名称有区别吗? 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/

相关文章:

lisp - 编写专家系统的最佳语言是什么?

emacs - 如何使泥土轨道模式与彩色多行提示一起使用

arrays - Scheme 语言中的 3D 数组

emacs - 自动关闭emacs shell模式选项卡完成缓冲区?

LISP - 每次出现搜索原子后的原子

lisp - 使用 macroexpand-1 扩展 let 形式内的宏(Practical Common Lisp,第 8 章, "Plugging the Leaks")

common-lisp - 如何使用 Quicklisp 更新依赖项?

lisp - defstruct - :read-only is not read only

lisp 不同长度的两个列表

ruby - 在 Lisp/Ruby 中将 IF-ELSE 实现为过程