diff options
| author | eltrac <hi@eltr.ac> | 2026-05-25 20:03:42 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-05-25 20:03:45 +0800 |
| commit | 779b4d81f3999e8aa0aca3763d49016a9023e717 (patch) | |
| tree | 3c6b987c2e14b459917594d345da4039b07fe2ce | |
| parent | ee7739d69b9c92ca45c85c942bc6d5930395fc9c (diff) | |
[edit/weekly/82] fix factual flaw
| -rw-r--r-- | content/weekly/82.md | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/content/weekly/82.md b/content/weekly/82.md index 25ea5dc0..8d4cb402 100644 --- a/content/weekly/82.md +++ b/content/weekly/82.md @@ -189,7 +189,7 @@ h.Document{ 首先是允许后端成为软件的插件(也就是随时更换具体实现)的 Protocols(协议)和 Monkey Patching(猴子补丁)。Common Lisp 和 Clojure 都支持 Protocol(`defgeneric` 和 `defprotocol`),这和 OOP 语言的 Interface 差不多,可以把面向接口编程的经验复用到一些 Lisp 中。至于 Monkey Patching,是指一些语言允许用户改写已有的函数,比如 Emacs Lisp 的 Adivces 和 Common Lisp 的 `:around` 方法,也就允许用户自己编写并替换软件的部分实现。 -然后是 Hooks(钩子),这就更接近设计模式了,把函数存放在一个列表(或别的什么数据结构里),当有事件发生时,就调用这里面的函数。我想起某本 Java 设计模式里也有类似的案例,叫作观察者模式(Oberver Pattern)或监听者模式,被监听对象储存一系列监听者的引用,当事件发生时,由监听对象调用监听者的方法。在大多数 Lisp 里,我们直接储存函数本身,不和对象打交道。 +然后是 Hooks(钩子),这就更接近设计模式了,把函数存放在一个列表(或别的什么数据结构里),当有事件发生时,就调用这里面的函数。我想起某本 Java 设计模式里也有类似的案例,叫作观察者模式(Oberver Pattern)或监听者模式,被监听对象储存一系列监听者的引用,当事件发生时,由监听对象调用监听者的方法。不过在函数式编程中,我们直接储存函数本身,不和对象打交道。 其次是 Fail Fast, Fail Often(快错常错),这更像是开发模式。简而言之,作者表示他在非 Lisp 语言里很害怕看到报错,但在 Lisp 里就不会,因为以 Common Lisp 为首的部分 Lisp 方言有类似的语言特性,可以快速在报错之后快速重启程序,如果遇到暂时不想处理的错误,可以直接忽略,还能使用 `use-value` 这样的特性临时替换有问题的参数。在 Common Lisp 以外的方言,程序员也可以使用 REPL(可以理解为直接与代码库交互的命令行程序)调试程序,在 REPL 里也可以重新定义函数和变量,重新运行程序,非常方便。 |
