明显的';评估';CLISP中引号符号的定义

明显的';评估';CLISP中引号符号的定义,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,CLISP REPL的一些输出: [1]> (list 'list 1 2 3) (LIST 1 2 3) [2]> (list 'list '(1 2 3)) (LIST (1 2 3)) [3]> (list 'quote 1 2 3) (QUOTE 1 2 3) [4]> (list 'quote '(1 2 3)) '(1 2 3) 前三个,我完全理解所发生的事情:list函数被传递一个符号('list或'quote),因此结果是一个以list或quote

CLISP REPL的一些输出:

[1]> (list 'list 1 2 3)
(LIST 1 2 3)

[2]> (list 'list '(1 2 3))
(LIST (1 2 3))

[3]> (list 'quote 1 2 3)
(QUOTE 1 2 3)

[4]> (list 'quote '(1 2 3))
'(1 2 3)
前三个,我完全理解所发生的事情:
list
函数被传递一个符号(
'list
'quote
),因此结果是一个以
list
quote
符号开头的列表。第四个让我困惑。为什么它不返回
(引用(1 2 3))

我意识到,如果在REPL中输入
(QUOTE'(1 2 3))
,则返回
”(1 2 3)
,因此表达式在这个意义上是等价的。但是
(列表1 2 3)
相当于
(1 2 3)
,但是第一个表达式没有返回该值

(list'quote 1 2 3)
返回的列表的第一项是
quote
符号,但
(list'quote(1 2 3))
返回的是带引号的列表,这似乎不太合适。尤其是像
(list'list…
这样的表达式似乎总是返回以符号开头的列表-至少到目前为止,
quote
是唯一这样的“特例”


这不是最容易表达的问题,所以我希望我已经设法把我的困惑弄清楚了。有人能解释为什么quote会以这种看似独特的方式处理吗?

'something
与lisp阅读器的
(quote something)
相同。即使嵌套,情况也会如此。接下来的表达式我将双引号,这样在计算之后,其中一个引号仍然在那里

打印时,实现可以选择在有多个可能的表示形式的地方输出什么,因此一些实现会将
”某物的计算结果打印为

(引用某物)
而其他人可能会使用缩写词
'something

”(引用12 3)
不能缩写,因为引用的表单只有一个参数。因此,这里两个lisp系统都将打印
(引用1 2 3)

下面是查看您最后一个表达式的方法:

(let ((data (list 'quote '(1 2 3))))
  (format nil 
          "whole thing: ~a first element: ~a second-element: ~a" 
          data 
          (car data) 
          (cadr data)))
这将计算为
“整件事:”(1 2 3)第一个元素:引用第二个元素:(1 2 3)”
“整件事:(1 2 3))第一个元素:引用第二个元素:(1 2 3)”

由于打印机永远不会看到输入是否缩写,并且数据在内存中是否具有相同的结构,因此输出永远不会受到数据输入方式的影响。因此,
(quote(quote(1233))
将打印与
”(1233)
相同的内容

您对
cons
单元格有相同的行为,但标准规定了规则的执行方式<代码>(cons 1(cons 2(cons 3’()))
将是
(1.(2.(3))
,但实际上只是打印
(1 2 3)
但是如果您
(cons 1 2)
得到
(1.2)
显示
打印
根据
cdr
对输出进行不同的处理。但是,读者可以阅读其中任何一个,它们都将打印相同的内容,例如
'(1.(2.(3))==>(1.23)
(+(2.(3)));=>5

数字可以有很多视觉形式,只要数字下面有基数

(let ((*print-base* 16))
  (print 255)) ; prints FF (255 in hexadecimal)
列表
在Lisp中没有任何缩写或特殊性。它甚至不是一个原始函数,但它非常有用,因为它消除了每次手工操作的不便。它可以这样定义:

(defun my-list (&rest lst)
  lst)

(my-list 1 2 3 4) ; ==> (1 2 3 4)
请注意,REPL(READ-EVAL-PRINT-LOOP)有三个功能:

  • 使用功能读取
    READ
  • 使用函数进行评估
    EVAL
  • 并使用类似函数
    PRINT
要了解发生了什么,您必须查看所有三个函数

让我们看看第三种形式:

(list 'quote 1 2 3)
(list 'quote '(1 2 3))
这是由五个要素组成的列表:

  • 列表
  • (引用)
  • 1
  • 2
  • 3
  • EVAL
    然后计算参数,并使用四个结果调用函数
    list
    ,并返回一个新结果,即四个元素的列表:

  • QUOTE
  • 1
  • 2
  • 3
  • 打印
    然后获取此列表并将其写入:
    (引用1 2 3)
    。没有简写的方式来打印它

    让我们看看第四种形式:

    (list 'quote 1 2 3)
    
    (list 'quote '(1 2 3))
    
    这是三个要素的列表:

  • 列表
  • (引用)
  • (引用(12 3))
  • eval
    使用两个参数调用
    list

  • QUOTE
  • (1 2 3)
  • eval
    然后返回长度为2的列表:

  • QUOTE
  • (1 2 3)
  • 打印
    现在可以用两种不同的方式打印此列表:

    (引号(1233))
    或缩写形式
    ”(1233)
    。这里,引号字符位于单个表达式前面


    您的实现使用了第一个版本。

    Scheme和Common Lisp是不同的语言,但您可能会发现它们很有用,因为问题是相同的。更多相关链接(以及可能的副本)可在中找到。谢谢!我想我现在明白了