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` 变体的讨论(没有引入太多新语法),但对 clojure.core 而言这似乎很自然。

2 答案

0

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

我处理过一些包含多个嵌套 `if-let` 的代码。
```
(if-let [a ...]
  (do a)
  (if-let [b ...]
    (do b)
    (do :default))
```
后来我意识到这种情况很少见,这样的宏并不非常有用。
抱歉打扰。
让我们忘记这件事吧 :-)
0

为此加1。

这是当你想要条件表达式返回一个有用的值,而不是true/false,并在体中直接使用这个值时的情况。
如果有多个条件,if-let是嵌套的,但平实地描述它被认为有助于可读性。

...