我正在尝试实现一个函数(见x),它接受一个参数x,并检查函数以前是否用同一个参数调用过。
例如:(begin (seen 5) (seen 10)) => #f
我不知道如何获得前面调用的函数,因为函数seen
只使用一个参数。
发布于 2017-01-22 18:39:59
我们必须编写一个“记住”以前调用的过程。如果不使用可变状态,就无法做到这一点,但至少我们可以将其封装在过程中(以避免全局状态):
(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
https://stackoverflow.com/questions/41796787
复制相似问题