例如,#'functionname
,是否有必要?
答案 0 :(得分:67)
在Common Lisp中的#'functionname
Common Lisp和其他一些Lisp方言有多个命名空间。这里功能和值的不同之处。要获取名称的函数值,我们需要写:
(function functionname)
由于写入时间有点长,因此有一个较短的符号:
#'functionname
要显示效果,请参阅:
(let ((foo 42))
(flet ((foo () 'bar))
(list foo (function foo) #'foo (foo))))
上面定义了本地变量 FOO
和本地函数 FOO
。
list语句使用FOO
表示法返回foo
的值,然后返回(function ...)
的函数值,然后使用相同的简写符号,然后是实际调用函数FOO
的值。
(function foo)
和#'foo
是相同的概念,但写的方式不同。两者都引用名为FOO
的本地词法函数。 FOO
表单引入FLET
作为本地函数。
Lisp REPL返回如下内容:
(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR)
上面显示第一项实际上是变量FOO
的值,接下来的两项是函数值,函数绑定到{ {1}}。最后一项是符号FOO
,从函数调用BAR
返回。
Common Lisp,Emacs Lisp和ISLisp中存在正常值和函数值的名称空间分离。像Scheme这样的其他Lisp方言没有这种分离。在Scheme中,名称只能表示一个值。
#character 。
(FOO)
字符用于在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
是一个所谓的调度宏字符。
ANSI Common Lisp HyperSpec描述了Section 2.4.8 Sharpsign中的#
字符。
Common Lisp可能对向量使用了不同的语法。说#
。它也可以使用不同的语法来表示复数。像[1 2 3]
这样的东西。但它没有那样做。为什么?原因是Common Lisp尝试在语言中使用字符时经济实惠,并为用户留下{1 2}
,[
,]
和{
等字符自己的语法扩展。通常Lisp用户开发嵌入式语言并使其更容易一些,Common Lisp标准试图将字符使用率降至最低,并提供宏字符机制和调度宏字符。
为了降低字符使用率,使用单个调度字符}
,然后下一个字符确定可以表示的内容。 #
表示二进制数。 #b
表示十六进制数。复数的#x
。向量#c
。函数名#(
。还有更多。
由于Common Lisp是一种可编程编程语言,因此用户可以更改此字符级语法。请参阅函数SET-DISPATCH-MACRO-CHARACTER。