我正在尝试使用fold-left和append连接方案中的列表(用于更大的函数)。但是,我不断获得如下所示的输出:
=> (0 quote (1) quote (2))
这是我的代码:
(fold-left (lambda(a b) (append a b)) '(0) '('(1) '(2)))
为什么这不会完全相同:
(define x (append '(0) '(1)))
(define y (append x '(2)))
y
此代码输出一个简单的列表:
(0 1 2)
不是折叠左边做的和第二个代码块完全相同吗?我可以更改什么来获得简单的列表输出?
您在引用的数据中引用。当Scheme遇到(quote x)
或简称'x
时,它会将其评估为参数不变。
'('(1) '(2)))
简称:
(quote ((quote (1)) (quote (2))))
正如我所说的评估规则,它应评估为:
((quote (1)) (quote (2)))
因此,如果你采取caar
或引用的表达式,你应该得到符号quote
:
(caar '('(1) '(2)))
; ==> quote
如果您不打算在数据结构中包含这些引号,那么您需要在表达式中不要使用它们,例如:
'((1) (2))
注意:有一种与Scheme相关的语言,称为Racket,它在REPL中的默认输出不是值本身,而是一个可以计算该值的表达式。即使是经验丰富的阴谋家,这通常也会令人困惑。这就像问某人“什么是3加4”并回答1 plus 6
。