Rai*_*wig 68
Common Lisp中的#'functionname
Common Lisp和其他一些Lisp方言有多个命名空间.这里功能和值的不同之处.要获取名称的函数值,我们需要编写:
(function functionname)
Run Code Online (Sandbox Code Playgroud)
由于写入有点长,因此有一个较短的符号:
#'functionname
Run Code Online (Sandbox Code Playgroud)
为了显示效果,请看:
(let ((foo 42))
(flet ((foo () 'bar))
(list foo (function foo) #'foo (foo))))
Run Code Online (Sandbox Code Playgroud)
上面定义了局部变量 FOO和局部函数 FOO.该列表语句返回值的FOO,那么函数值的foo使用(function ...)标记,然后用速记符号,然后实际调用函数的值相同FOO.
(function foo)并且#'foo是相同的概念,但写的不同.两者都引用了名为的本地词法函数FOO.FOO由FLET表单作为本地函数引入.
Lisp REPL返回如下内容:
(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR)
Run Code Online (Sandbox Code Playgroud)
上面显示第一项实际上是变量的值,FOO接下来的两项是函数值,函数绑定到FOO.最后一项是BAR从函数调用返回的符号(FOO).
Common Lisp,Emacs Lisp和ISLisp中存在正常值和函数值的名称空间分离.像Scheme这样的其他Lisp方言没有这种分离.在Scheme中,名称只能表示一个值.
#字符.
该#字符用于在s表达式中引入特殊语法.这里有些例子:
#'functionname -> (function functionname)
#(1 2 3) -> the vector of the elements 1 2 3
#c(1 2) -> a complex number
#xFFFF -> a hex number
#b1111 -> a binary number
Run Code Online (Sandbox Code Playgroud)
还有很多.#是一个所谓的调度宏字符.
ANSI Common Lisp HyperSpec描述了第2.4.8节Sharpsign中的#字符.
Common Lisp可能使用了不同的向量语法.说[1 2 3].它也可以使用不同的语法来表示复数.有点像{1 2}.但它没有那样做.为什么?究其原因是因为Common Lisp的尝试是经济与语言文字的使用和叶人物,如[,],{和}用户为他/她自己的语法扩展.通常Lisp用户开发嵌入式语言并使其更容易,Common Lisp标准试图将字符使用率降至最低,并提供宏字符机制和调度宏字符.
为了保持字符使用率,使用单个调度字符#,然后下一个字符确定可以表示的内容.#b对于二进制数.#x对于十六进制数.#c对于复数.#(对于矢量.#'用于功能名称.还有更多.
由于Common Lisp是一种可编程编程语言,因此用户可以更改此字符级语法.请参阅SET-DISPATCH-MACRO-CHARACTER函数.