我正在编写一个函数来将列表的最后一个元素切换到开头:
(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)
这是什么意思?它是怎么出来的?
答案 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-elem
和x
的列表。因此,列表中#<Closure>
的结果。