Scheme #<;关闭>;产量

Scheme #<;关闭>;产量,scheme,closures,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

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

(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))
它不起作用,我知道原因。我忘了在
列出最后一个元素x

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

(#<Closure> (1 2 3 4 5 6) 1 2 3 4 5)
(#(123456)12345)
这是什么意思?结果如何

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

在球拍中,输出为

'(#<procedure:last-elem> (1 2 3 4 5 6) 1 2 3 4 5)
”(#(123456)12345)
这更清楚一点


对函数的引用始终与其引用环境(也称为闭包)一起存储,您的方案实现选择以这种方式显示它。

在方案中,所有标识符表示语法关键字(绑定到“transformer”)或变量(绑定到值)。在您的代码中,最后一个元素表示绑定到您定义的函数的变量。当你写作时:

(list last-elem x)

解释器/编译器生成一个值为
last elem
x
的列表。因此,
#
的结果将显示在列表中。

您正确地解决了代码中的错误。但是你没有回答OP的问题。