所以我正在使用Racket Scheme自学编程功能,到目前为止我都喜欢它.作为我自己的练习,我一直在尝试以纯粹的功能方式实现一些简单的任务.我知道不变性是功能风格的重要组成部分,但我想知道是否有任何时候它是可以的.
我想到了一种函数在与filter一起使用时从字符串列表中删除非唯一字符串的有趣方式,如下所示:
(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)))
Run Code Online (Sandbox Code Playgroud)
如您所见,make-uniquer在一个字符串列表上返回一个闭包,以便与唯一性进行比较,这样它就可以作为过滤器的简单谓词.但我破坏性地更新了封闭式清单.这是不好的形式,还是以这种方式改变本地封闭变量?
lisp scheme functional-programming mutability purely-functional
一种方式更有效吗?一种方法与另一种方法有任何限制吗?感谢你们给我的任何意见;-)
我不太确定该怎么称呼它,因为"静态构造函数"似乎传达了静态初始化程序块的概念,但我的问题与样式有关.
假设我有一个类武器,它有你的标准构造函数来初始化武器的统计数据.这很好,但有时候我想随机生成武器.我可以创建一个名为FromRandom的静态方法,它创建一个带有随机统计数据的新武器并返回它.这样我可以做这样的事情:
Weapon randWeapon = Weapon.FromRandom();
Run Code Online (Sandbox Code Playgroud)
对此有何共识?这是可接受的代码吗?
所以我试图在Win32中初始化Common Controls和视觉样式.我构建了一个DLL,其中包含我编写的一些自定义控件,以及一个包含GUI应用程序的EXE.
通常情况下,责任分离似乎是我的DLL不应该担心我们是否启用窗口样式.它应该只生成自定义控件并将它们暴露给依赖的EXE.然后EXE可以决定它是否需要视觉样式,并且DLL不是更明智的.
问题是:我的DLL在进程附加中在DllMain中注册了它的窗口类.但是,如果我叫INITCOMMONCONTROLSEX的EXE,里面我的自定义控制按钮和诸如此类的东西显示不出来,因为自定义控件登记前的EXE可以初始化公共控件.
为了证明这一点,我在EXE调用InitCommonControlsEx 之后强制取消注册并重新注册我的自定义控件,并修复它:按钮显示在我的自定义控件上,带有视觉样式.
在理想的世界中,我希望能够在将来的程序中链接到我的共享库,并开始使用自定义控件,而无需担心修复常见控件和样式的问题.这可能吗?