1

我正在编写一个函数来将列表的最后一个元素切换到开头:

(define last-elem
    (lambda (l)
        (car (reverse l))))

(define all-but-last
    (lambda (l) 
            (reverse (cdr (reverse l)))))


(define (last-to-first x) (append (list last-elem x) (all-but-last x)))

(last-to-first '(1 2 3 4 5 6))

它没有用,我知道为什么。我忘了把括号放在周围list last-elem x

问题是,我很好奇输入错误代码的输出:

(#<Closure> (1 2 3 4 5 6) 1 2 3 4 5)

如果这是什么意思?它是怎么出现的?

4

3 回答 3

3

在 Racket 中,输出为

'(#<procedure:last-elem> (1 2 3 4 5 6) 1 2 3 4 5)

这更清楚一点。

对函数的引用总是与它的引用环境一起存储,也就是作为闭包,并且您的 Scheme 实现选择以这种方式显示它。

于 2013-03-17T12:45:27.300 回答
0
(list last-elem x)

不调用函数last-elem。它只返回一个包含两个元素的列表:变量的值last-elem(它是一个过程)和参数的值x。你要:

(list (last-elem x))

但首先没有理由列出清单。尝试:

(define (last-to-first x)
  (cons (last-elem x) (all-but-last x)))
于 2013-03-17T08:42:08.570 回答
0

在 Scheme 中,所有标识符都表示句法关键字(绑定到“转换器”)或变量(绑定到值)。在您的代码last-elem中表示绑定到您定义的函数的变量。当你写:

(list last-elem x)

解释器/编译器生成一个值为last-elemand的列表x。因此,#<Closure>列表中的结果。

于 2013-03-17T16:48:53.673 回答