在clojure宏中嵌套#/%

5 macros clojure

我知道嵌套#,%是坏的 - 然而,我经常发现自己编写简短的在线匿名函数,最终只有2个级别的#/%.

因此,我很好奇,有没有办法告诉clojure每个%绑定到最近(最小的封闭)#?

谢谢!

rae*_*aek 8

嵌套匿名函数完全没问题.您只需使用非简写语法.

#(foo (bar %1)
      (baz %2))
Run Code Online (Sandbox Code Playgroud)

相当于

(fn [x y]
  (foo (bar x)
       (bax y)))
Run Code Online (Sandbox Code Playgroud)

完整变体可以任意嵌套.另外,如果你倾向于使用mapfn很多,可以考虑使用for,而不是(这往往看起来更清晰,在我看来):

(map (fn [row]
       (map (fn [col]
              (+ (* 10 row) col))
            (range 3)))
     (range 3))
Run Code Online (Sandbox Code Playgroud)

做同样的事情

(for [row (range 3)]
  (for [col (range 3)]
    (+ (* 10 row) col)))
Run Code Online (Sandbox Code Playgroud)


Ale*_*art 6

clojure不支持嵌套匿名函数.

编辑:我的意思是"匿名函数" #(...),而不是(fn ...).为混乱道歉.

  • `(((fn [x](fn [y] [xy]))1)2)` (5认同)
  • 如danlei所示,这是不正确的.不支持对匿名函数嵌套使用#(...)阅读器宏; 使用'fn'嵌套很好. (5认同)
  • 当然是.我的评论是针对读者宏,这是问题的主题. (2认同)