LISP中的#含义是什么?

时间:2011-02-02 11:19:56

标签: syntax lisp common-lisp special-characters

例如,#'functionname,是否有必要?

1 个答案:

答案 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