functional-programming - Racket 中的 '(撇号)是什么?

标签 functional-programming scheme racket quote repl-printed-representation

我对 Racket 中 ' 标志的含义有点困惑。在我看来,同一个符号有不同的含义。看下面两个简单的例子:

list

Returns a newly allocated list containing the vs as its elements.


> (list 1 2 3 4)
'(1 2 3 4)

quote

Produces a constant value corresponding to datum (i.e., the representation of the program fragment) without its lexical information, source location, etc. Quoted pairs, vectors, and boxes are immutable.


> '(1 2 3 4)
'(1 2 3 4)

所以我的问题是:' 符号是否有两种含义(一个符号和一个列表),或者它们是相同的数据类型并且 list 实际上返回一个带引号的常量值?如果是第二种情况,为什么这样做:
> '(+ (- 2 13) 11)
'(+ (- 2 13) 11)

> (eval (list + (- 2 13) 11))
0

(也 (eval '(+ (- 2 13) 11)) 工作并正确评估 0 )

但这不会:
> (list + (- 2 13) 11)
'(#<procedure:+> -11 11)

> (eval '(#<procedure:+> -11 11))
. read: bad syntax `#<'

相关的也许:
What is ' (apostrophe) in Lisp / Scheme?

最佳答案

> 是 REPL - Read-Eval-Print Loop 的标志。

首先,读取您在 REPL 提示符下键入的任何表达式 - 转换为某些内部抽象语法树表示。然后计算输入表达式的这种内部表示 - 即找到它的值。然后打印结果。

当我们打字

> (list 1 2 3 4)

输入的表达式被读取为嵌套结构,让我们将其写为
[LIST | [1 | [2 | [3 | [4 | NIL ]]]]]

根据列表作为数据对和列表其余部分的通常表示(此处将一对 ab 显示为 [a | b] )。

然后对上面的结构求值,因为它的第一个元素是 LIST,所以它会使用指定的参数调用 list,这会导致构建一个新的列表结构,可以表示为
[1 | [2 | [3 | [4 | NIL ]]]]

然后它被打印出来,通常作为 (1 2 3 4) 但 Racket 选择将它打印为 '(1 2 3 4) 。顺便说一下,它无法评估,因为无法调用 1

接下来,引用表达式 '(1 2 3 4) ,读作 (quote (1 2 3 4)) 。它被转换为
[QUOTE | [ [1 | [2 | [3 | [4 | NIL ]]]] | NIL ]]

它在评估时(根据 quote 的评估规则)返回它收到的数据。我们表示为
[1 | [2 | [3 | [4 | NIL ]]]]

这就是为什么两者是相似的。我们是否构建一个包含 1、2、3 和 4 的新列表;或者我们让它作为读取过程的一部分被创建,所以它会被 quote 逐字返回;结果是一样的。

关于functional-programming - Racket 中的 '(撇号)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779637/

相关文章:

haskell - 如何定义该函数的类型配置文件?

performance - 我可以使用 Scheme 有效地实现快速排序吗?

Emacs lisp 定义语法

r - 跨平台 zip 文件创建

java - Google Collections API 是否具有与 Ruby Enumerable#inject 方法等效的方法?

emacs - 在方案模式下插入原始括号

macros - 定义多个顶级形式的 Racket 宏?

scheme - 这是延续传递风格吗?

functional-programming - SICP 示例不适用于 Racket

haskell - Monad 转换器库 - 使用哪一个?