返回lambda的Clojure宏

时间:2018-03-05 18:41:40

标签: clojure macros

有人可以发布正确的语法来编写一个返回lambda的clojure宏吗? e.g。

(defmacro x [m]  
   --> returns (fn [m] ...)

2 个答案:

答案 0 :(得分:0)

我相信你一直想要'。

用法:(不断x) 返回一个函数,它接受任意数量的参数并返回x。

答案 1 :(得分:0)

请求了一个宏,虽然在这个例子中没有必要,因为这个multiply-by-constant-random也可以作为普通函数实现。好吧,这给你编译时随机常量而不是运行时。

(defmacro multiply-by-constant-random []
  (let [num (Math/random)]
    `(fn [m#] (* m# ~num))))

(macroexpand-1 '(multiply-by-constant-random))
; (clojure.core/fn [m__3184__auto__] (clojure.core/* m__3184__auto__ 0.45643974690448996))

(def f1 (multiply-by-constant-random))
(def f2 (multiply-by-constant-random))
(def f3 (multiply-by-constant-random))

(pprint
  (for [i (range 1 5)]
    (for [f [f1 f2 f3]]
      (f i))))
;((0.30553722493029045 0.9164995864143136 0.22367444865206332)
; (0.6110744498605809  1.8329991728286272 0.44734889730412664)
; (0.9166116747908714  2.749498759242941  0.67102334595619)
; (1.2221488997211618  3.6659983456572545 0.8946977946082533))