我想更好地瞭解listing 13.3 in The Joy of Clojure。它是一個生成其他宏的宏(很像在Clojure 1.4中如何實現原始數組函數)。如何編寫打印自己的後綴的嵌套宏?
我想寫一個宏,它在運行時只是打印生成的宏的後綴。即
user=> (nested-macro joe)
user=> (nested-macro-named-joe)
hello from joe
nil
我無法使這項工作。
這裏是我試過:
嘗試1
(defmacro nested-macro [name]
`(defmacro ~(symbol (str "nested-macro-named-" name))
[]
`(println "hello from " ~name)))
輸出:
hello from #<core$name [email protected]>
嘗試2
(defmacro nested-macro [name]
(let [local-name name]
`(defmacro ~(symbol (str "my-custom-macro-named-" ~local-name))
[]
`(println "hello from " ~local-name))))
錯誤
IllegalStateException Attempting to call unbound fn: #'clojure.core/unquote clojure.lang.Var$Unbound.throwArity (Var.java:43)
嘗試3:
(defmacro nested-macro [name]
(let [local-name name]
`(defmacro ~(symbol (str "nested-macro-named-" name))
[]
`(println "hello from " ~(symbol local-name)))))
編譯器錯誤:
CompilerException java.lang.RuntimeException: No such var: joy.dsl/local-name
只爲它赫克,我也嘗試添加#
的局部變量,以類似結果同上,但與「汽車」的名稱,如local-name__1127__auto__
我沒有看到然而,作爲解決方案的一部分。
我該如何做這項工作?
''〜 〜name'是在類似情況下引用的更一般的解決方案 - 並不總是如此,您很樂意獲取值的字符串表示形式。 – amalloy
將'~~名稱替換爲~~名稱導致CompilerException java.lang.RuntimeException:無法在此上下文中解析符號:joe編譯:(NO_SOURCE_PATH:1)'。 – DanLebrero
呃,嵌套的引用很難。我想這是'〜'〜name'來停止內部宏試圖解析名稱。 – amalloy