【发布时间】:2012-08-16 07:57:58
【问题描述】:
所以我正在使用 Racket Scheme 自学函数式编程,到目前为止我很喜欢它。作为我自己的练习,我一直在尝试以纯粹的功能方式实现一些简单的任务。我知道不变性是函数式风格的重要组成部分,但我想知道是否有任何时候可以。
我想到了一种有趣的方法,让函数在与过滤器一起使用时从字符串列表中去除非唯一字符串,如下所示:
(define (make-uniquer)
(let ([uniques '()])
(lambda (x)
(if (not (member x uniques))
(set! uniques (cons x uniques))
#f))))
(define (uniquify x)
(let ([uniquer (make-uniquer)])
(filter uniquer x)))
如您所见,make-uniquer 在字符串列表上返回一个闭包以比较其唯一性,这样它就可以充当过滤器的简单谓词。但我正在破坏性地更新封闭列表。这是不好的形式,还是可以以这种方式更改局部封闭变量?
【问题讨论】:
-
如果两个线程同时调用该函数会中断吗?
-
@Bill 如果两个线程使用来自
make-uniquer的自己的闭包,那么不会。但如果他们都使用同一个,是的。这是安全性的主要测试吗? -
工程决策由您决定。
-
好问题。如果
make-uniquer只从(由)(内部)uniquify调用,那么就没有问题。确保它被很好地隐藏、封装。
标签: functional-programming scheme lisp purely-functional mutability