#\ 、 ' 和 #' 之间有什么区别?

Ped*_*eir 1 lisp common-lisp

在 Common Lisp 中,鉴于“a”只是一个字符,那么 , 之间有什么#\a区别'a #'a

我的问题来自tutorialspoint.com 的Lisp 教程。本教程在某一时刻介绍了:

; a character array with all initial elements set to a
; is a string actually
(write(make-array 10 :element-type 'character :initial-element #\a)) 
(terpri)

; a two dimensional array with initial values a
(setq myarray (make-array '(2 2) :initial-element 'a :adjustable t))
(write myarray)
(terpri)
Run Code Online (Sandbox Code Playgroud)

随着输出:

"aaaaaaaaaa"
#2A((A A) (A A))
Run Code Online (Sandbox Code Playgroud)

#'未包含在本示例中,但我将其包含在问题中,因为它也可能令人困惑。

非常感谢!

ex *_*ilo 5

首先,a它不只是“一个字符”。Lisp 阅读器将其解析#\a为字符文字a,它是 Common Lisp 中的一个对象。请注意,#\a#\A是不同的字符对象。

当 Lisp 阅读器遇到单引号时,单引号后面的表达式不会被求值。具体来说,'a被视为(quote a),其中quote返回其未计算的参数。现在,a是一个符号,因此'a计算结果为该符号。但 Lisp 阅读器默认将其读取的大多数字符都大写,因此'a实际上计算的是符号A。好消息是,无论你输入aA,Lisp 阅读器都会读取A(除非你弄乱了可读表),并且'a和都'A计算为符号A

当 Lisp 读者遇到时#'a,整个表达式被视为(function a),在计算时返回与名称关联的函数a。但是,请注意,在不表示函数的标识符上使用function, 以及扩展名是错误的。#'

为了稍微澄清一下最后一部分,请考虑以下 REPL 交互:

CL-USER> (defvar a 1)
A
CL-USER> a
1
CL-USER> #'a

The function COMMON-LISP-USER::A is undefined.
   [Condition of type UNDEFINED-FUNCTION]
Run Code Online (Sandbox Code Playgroud)

这里定义了变量a并赋予了 value 1,但是当我们尝试访问 表示的函数时,a我们会收到一条错误消息,因为没有这样的函数。继续:

; Evaluation aborted on #<UNDEFINED-FUNCTION A {1002DDC303}>.
CL-USER> (defun a (x) x)
A
CL-USER> (a 'b)
B
CL-USER> a
1
CL-USER> #'a
#<FUNCTION A>
Run Code Online (Sandbox Code Playgroud)

现在我们定义了一个名为的函数a,它只返回其参数。您可以看到,当我们使用a参数调用时'b,我们得到了预期的结果:(a 'b)--> b。但是,当我们a单独评估时,我们仍然得到1。Common Lisp 中的符号是除其他单元之外还具有值单元和函数单元的对象。经过上述交互后,该符号a现在已位于1其值单元格中,并且具有我们在其功能单元格中定义的功能。a当评估符号时,将访问值单元格,但是当(function a)#'a求值时,将访问函数单元格。您可以在上面看到,当#'a计算时,我们定义的函数被返回,并且 REPL 打印#<FUNCTION A>来显示这一点。

顺便说一句,我不建议使用Tutorialspoint 来学习Common Lisp。浏览该网站,我立即看到了这一点:

LISP 表达式不区分大小写,cos 45 或 COS 45 相同。

这是错误的。而且,Lisp 并不是全部大写。这些都不能激发信心。相反,找一本好书。 tag-info页面上有一些建议。