Functional programming 什么是';(撇号)在球拍里?

Functional programming 什么是';(撇号)在球拍里?,functional-programming,scheme,racket,quote,repl-printed-representation,Functional Programming,Scheme,Racket,Quote,Repl Printed Representation,我对“登录球拍的含义有点困惑。在我看来,同一个符号有不同的含义。请看下面的两个简单示例: 返回一个新分配的列表,其中包含vs作为其元素 生成与数据(即程序片段的表示)相对应的常量值,而不包含其词法信息、源位置等。引用的对、向量和框是不可变的 所以我的问题是: ”符号有两种含义(一个符号和一个列表),或者它们是相同的数据类型,并且列表实际上返回一个带引号的常量值?如果第二种情况是这样的,那么为什么这样做有效: > '(+ (- 2 13) 11) '(+ (- 2 13) 11) &g

我对
登录球拍的含义有点困惑。在我看来,同一个符号有不同的含义。请看下面的两个简单示例:

返回一个新分配的列表,其中包含vs作为其元素

生成与数据(即程序片段的表示)相对应的常量值,而不包含其词法信息、源位置等。引用的对、向量和框是不可变的

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

> '(+ (- 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 `#<'
>(列表+(-2 13)11)
'(# -11 11)
>(eval'(#-11))

. 阅读:糟糕的语法“#您被打印值的默认方式
#lang racket
弄糊涂了,这与几乎所有其他交互式lisp环境都不同。如果您在DrRacket本身中选择另一种语言,例如R5RS,您将发现它打印:

> (list 1 2 3 4)
(1 2 3 4)
也就是说,运算符
list
应用于数字1234的结果是生成这些数字的列表,这正是
(1234)
的解释

那么,答案是什么呢
对于您的情况也是有效的,
'anything
只是
(引用任何内容)

是REPL的符号-读取-评估打印循环

首先,在REPL提示符下键入的任何表达式都将被读取转换为一些内部抽象语法树表示。然后对输入表达式的这个内部表示进行求值,即找到它的值。然后打印结果

当我们打字时

> (list 1 2 3 4)
键入的表达式被读取为嵌套结构,让我们将其编写为

[LIST | [1 | [2 | [3 | [4 | NIL ]]]]]
根据列表作为成对数据和列表其余部分的通常表示(此处显示一对
a
b
作为
[a | b]

然后对上面的结构进行求值,因为它的第一个元素是
LIST
,所以它使用指定的参数调用
LIST
,从而生成一个新的列表结构,该结构可以表示为

[1 | [2 | [3 | [4 | NIL ]]]]
然后它被打印出来,通常是
(1234)
,但球拍选择打印成
”(1234)
。顺便说一句,无法对其求值,因为无法调用
1

接下来,引用的表达式
'(1234)
,读作
(quote(1234))
。它被转换成

[QUOTE | [ [1 | [2 | [3 | [4 | NIL ]]]] | NIL ]]
当对其进行评估时(根据
quote
的评估规则),将返回其收到的数据。我们代表为

[1 | [2 | [3 | [4 | NIL ]]]]

这就是二者相似的原因。我们是否建立一个包含1、2、3和4的新列表;或者我们让它作为读取过程的一部分创建,因此它会通过
引用
逐字返回;结果是一样的。

ok。谢谢你的澄清。但是为什么
(eval(list+(-2 13)11))
计算为
0
?函数调用只不过是函数名的列表,后面紧跟着它的参数吗?因为
(eval(list 1 2 3 4))
导致错误
1不是一个过程
“函数调用只不过是函数名的列表,后面跟着它的参数吗?”几乎正确,但不完全正确。在语言中,计算的是一种形式,即第一个参数是函数的特殊列表。第一个示例之所以有效,是因为“+”是函数名,
(list+(-2 13)11)
的结果是list
(-11 11)
(计算
list
的每个参数)。在第二个示例中,
(列表1 2 3 4)
的结果是列表
(1 2 3 4)
,它不是一个表单,因为
1
不是一个函数。感谢您的澄清。我想结合前面的回答,我终于明白了:)不客气有人声称这是该计划中最令人困惑的部分。当然,除了电话/抄送之外。:)
(eval'(#-11))
不起作用的原因是无法读回
。但是,使用quasikote和unquote,
(eval(quasikote((unquote+)-11))
可以工作。使用简写为
(eval`(,+-11))
[QUOTE | [ [1 | [2 | [3 | [4 | NIL ]]]] | NIL ]]
[1 | [2 | [3 | [4 | NIL ]]]]