【问题标题】:Help me write Cond Macro in Clojure帮我在 Clojure 中编写 Cond 宏
【发布时间】:2009-08-11 17:30:14
【问题描述】:

我正在学习 Clojure 中的宏,并想编写“cond”宏。

我在将参数解构为(条件)(参数)和编写递归宏时遇到问题。

请帮帮我。

【问题讨论】:

    标签: macros clojure


    【解决方案1】:

    我写这篇文章是为了说明这个过程。这段代码有很多错误,但这个过程会让你尽快进入有趣的部分:) 写出对宏的调用以及您希望将该调用转换为的内容(此步骤不是可选的;)

    (my-cond (even? 4) 42 (odd? 4 24))
    
    (if (even? 4) 42 (if (odd? 4) 24)))
    

    为最简单的情况编写一个模板,然后将其提供给 (macroexpand-1 ... ) 并旋转直到匹配为止

    (defmacro my-cond [test result] `(if ~test ~result nil))
    
    (macroexpand-1 '(my-cond (even? 4) 42) ==> (if (even? 4) 42)
    

    现在让它更通用

    (defmacro my-cond [& cases]
      `(if (if ~(first cases) ~(second cases) ~(my-cond (drop 2 cases))
    

    然后在macroexpand-1 中使用它,然后在macroexpand 中使用它(不带“-1”),以确保它完全扩展到正确的情况下
    然后通过并清理存在奇数个术语等的极端情况......

    然后查看 core.clj ,看看你有多接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2018-05-23
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多