我正在尝试实现一个带有参数x的函数(见x),并检查该函数先前是否已使用相同的参数调用。
例如: (begin (seen 5) (seen 10)) => #f
我不知道如何获取先前调用的函数,因为该函数seen
仅接受一个参数。
我们必须编写一个“记住”先前调用的过程。不使用可变状态就无法做到这一点,但至少我们可以将其封装在过程中(以避免全局状态):
(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
关闭了它的定义上下文,所以它可以访问该状态,并在必要时对其进行更改。
我们可以将已经看到的值存储在任何支持成员资格测试的数据结构中-列表,哈希(命名)。但是aset
更自然,这就是我所使用的。该行为是预期的:
(seen 5)
=> #f
(seen 5)
=> #t
(seen 10)
=> #f
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句