在Scheme中模拟静态变量

时间:2013-01-11 01:46:09

标签: variables static scheme increment lexical

返回在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)

也不起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

你有90%的路要走。在空白处使用count定义的右侧,并向函数添加(忽略)参数。

答案 1 :(得分:1)

你非常非常接近正确的解决方案!在问题的代码中只需这样做:

  1. 最外面的lambda是错误的,删除该行和相应的右括号
  2. 最里面的lambda是最终传递给map过程的那个,因此它需要接收一个参数(即使它实际上没有使用)
  3. 删除let表单
  4. 周围最外面的括号

    一切归结为此:传递给lambda的{​​{1}}会收到一个参数,但也会包含map变量。 P表单仅在传递的let的上下文中定义P一次,并从lambda上的那一点“记住”lambda的值,因为对于列表中的每个元素,使用相同的P