输出中的#<closure> </closure>

时间:2013-03-17 05:49:43

标签: scheme closures

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

(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)

这是什么意思?它是怎么出来的?

3 个答案:

答案 0 :(得分:3)

在Racket中,输出是

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

更清楚一点。

对函数的引用始终与其引用环境a.k.a.一起存储为闭包,并且您的Scheme实现选择以这种方式显示它。

答案 1 :(得分: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)))

答案 2 :(得分:0)

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

(list last-elem x)

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