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

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

+3

我觉得与宏 `if` 和 `cond` 相配套的宏忽略了 `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` 变体(不引入太多新语法)的宏,但总体来看,它对于 `clolure.core` 来说是很自然的。

2 个答案

0

您会什么时候使用它?

我处理过具有多个嵌套 `if-let` 的代码,并发现了这个模式。
```
(if-let [a ...]
  (do a)
  (if-let [b ...]
    (do b)
    (do :default))
```
后来我意识到这种情况很少见,并且这样的宏并不十分实用。
抱歉打扰。
让我们忘记这次事件吧 :-)
0

为这加分。

这当你想条件表达式返回一个有用的值而不是true/false,并将该值用在身体中时。
如果有多个条件,if-let嵌套着,但尝试将其平铺描述被认为是提高了可读性。

...