返回在Scheme中调用它的次数的函数看起来像
(define count
(let ((P 0))
(lambda ()
(set! P (+ 1 P))
P)))
(list (count) (count) (count) (count)) ==> (list 1 2 3 4)
但是假设我们有一个看起来像这样的表达式
(map ______ lst)
我们希望将其评估为
(list 1 2 3 ... n)
where n = (length list)
问题要求我们在空白处使用lambda语句,并且我们不能在空白中使用任何辅助定义,如(count),所以
(lambda (x) (count))
是不允许的。只需用以前的定义替换(计数):
(map
(lambda (x)
((let ((P 0))
(lambda ()
(set! P (+ 1 P))
P))))
L)
也不起作用。
有什么建议吗?
答案 0 :(得分:1)
你有90%的路要走。在空白处使用count
定义的右侧,并向函数添加(忽略)参数。
答案 1 :(得分:1)
你非常非常接近正确的解决方案!在问题的代码中只需这样做:
lambda
是错误的,删除该行和相应的右括号lambda
是最终传递给map
过程的那个,因此它需要接收一个参数(即使它实际上没有使用)let
表单一切归结为此:传递给lambda
的{{1}}会收到一个参数,但也会包含map
变量。 P
表单仅在传递的let
的上下文中定义P
一次,并从lambda
上的那一点“记住”lambda
的值,因为对于列表中的每个元素,使用相同的P
。