Scheme:如何检查函数是否已使用相同的参数调用

时间:2017-01-22 22:22:52

标签: scheme racket

我正在尝试实现一个函数(看到x),该函数接受一个参数x并检查该函数是否先前使用相同的参数调用过。

例如: (begin (seen 5) (seen 10)) => #f

我不知道如何获取之前调用的函数,因为函数seen只接受一个参数。

1 个答案:

答案 0 :(得分:3)

我们必须写一个"记得"以前的调用。这不能在不使用可变状态的情况下完成,但至少我们可以将其封装在过程中(以避免全局状态):

(define seen
  (let ((already-seen (mutable-set)))
    (lambda (n)
      (cond ((set-member? already-seen n)
             #t)
            (else
             (set-add! already-seen n)
             #f)))))

诀窍是定义一个数据结构,以便在实际定义lambda之前保存已经看到的值。因为lambda关闭了它的定义上下文,所以它可以访问该状态,并在必要时进行变更。

我们可以将已经看到的值存储在支持成员资格测试的任何数据结构中 - 列表,哈希,您可以为其命名。但是set更自然,这就是我所使用的。行为符合预期:

(seen 5)
=> #f
(seen 5)
=> #t
(seen 10)
=> #f