0

我正在尝试使用 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)

fold-left 不是和第二个代码块完全一样吗?我可以更改什么以获得简单的列表输出?

4

1 回答 1

3

您正在引用引用的数据。当 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

于 2018-09-15T21:30:23.327 回答