gpt4 book ai didi

syntax - #在LISP中是什么意思

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:10 29 4
gpt4 key购买 nike

比如#'functionname,有必要吗?

最佳答案

#'Common Lisp 中的函数名

Common Lisp 和其他一些 Lisp 方言有不止一个 namespace 。这里的函数和值是不同的。要获取名称的函数值,我们需要这样写:

(function functionname)

由于写起来有点长,所以有一个较短的符号:

#'functionname

显示效果看这个:

(let ((foo 42))
(flet ((foo () 'bar))
(list foo (function foo) #'foo (foo))))

上面定义了一个局部变量 FOO 和一个局部函数 FOO。列表语句返回 FOO,然后使用 (function ...) 符号,然后使用简写符号,然后是实际调用函数 FOO 的值。

(function foo)#'foo 是同一个概念,只是写法不同。两者都引用名为 FOO 的本地词法函数。 FOOFLET 形式作为本地函数引入。

Lisp REPL 返回如下内容:

(42 #<function FOO 4060008224> #<function FOO 4060008224> BAR)

上面显示第一项实际上是变量 FOO,接下来的两项是函数值,函数绑定(bind)到 FOO。最后一项是符号 BAR,从函数调用 (FOO) 返回。

Common Lisp、Emacs Lisp 和 ISLisp 中都存在这种对普通值和函数值的命名空间的分离。其他 Lisp 方言如 Scheme 没有这种分离。在 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

还有更多。 # 是所谓的调度宏字符

ANSI Common Lisp HyperSpec 描述了 Section 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 .

关于syntax - #在LISP中是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4873810/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com