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的问题。