2024年Clojure状态调查 中分享您的想法!

欢迎!请查看 关于 页面以了解更多关于此如何工作的小信息。

+3

我觉得在与宏 ifcond 配对时,我们遗漏了 if-let 的配对宏

(defmacro cond-let
  [& clauses]
  (when clauses
    (if (next clauses)
      (list 'if-let (first clauses)
            (second clauses)
            (cons 'cond-let (nnext clauses)))
      (first clauses))))

(cond-let [a nil] {:a a}
          [b false] {:b b}
          :default)

我没有找到有关过去是否讨论过这种变体 cond-let (不引入很多新的语法) 宏的记录,但总的来说,它看起来对 clojure.core 是自然而然的。

2 个答案

0

在什么情况下你会使用它?

我处理过具有多个嵌套 `if-let` 的代码,并发现了这个模式。
```
(if-let [a ...]
  (do a)
  (if-let [b ...]
    (do b)
    (do :default))
```
后来我意识到这是一种罕见的情况,这样的宏不太有用。
对此造成的打扰表示歉意。
让我们忘掉这件事吧 :-)
0
by

为这个额外加1。

当你想要条件表达式返回一个有用的值而不是true/false,并在主体中直接使用这个值时。
如果有多个条件,if-let是嵌套的,但能够将它们扁平化描述可视为有助于可读性。

...