【问题标题】:Clojure macro that returns a lambda返回 lambda 的 Clojure 宏
【发布时间】:2018-08-13 12:21:58
【问题描述】:

有人可以发布正确的语法来编写返回 lambda 的 clojure 宏吗?例如

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

【问题讨论】:

  • lambda 应该返回什么?您的示例等效于身份功能。
  • 我决定删除我的答案,因为李是对的。乍一看,不清楚你想要什么。是想让函数返回给宏的参数,还是给函数的参数,还是根据给宏的参数命名函数的参数?
  • 我的示例显然需要澄清一下——我对 lambda 函数的内容并不太感兴趣,因为我对从宏生成一个的正确语法不太感兴趣,这让我感到困惑。对于由此产生的混乱,我们深表歉意。
  • 为什么 m 被用作宏和 lambda 参数,这是同时发生的吗?我打算写一个示例宏,但我想不出这个结构有什么用处。

标签: clojure macros


【解决方案1】:

我相信你想要“不断地”。

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

【讨论】:

  • 见我上面的评论。我对生成 lambda 的宏更感兴趣——看起来像一个常量函数实际上只是我在填充“占位符”时的蹩脚尝试。
【解决方案2】:

请求了一个宏,尽管在此示例中不是必需的,因为此 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多