2012-12-04 12 views
5

Właśnie nauka makr i makr Clojure w szczególności i jestem ciekawy czy można zrobić coś takiego:Clojure var definiując makro

(defmacro with-a=hello [f] 
    `(let [a "hello"] ~f)) 

(with-a=hello (println a)) 

To nie działa na mnie i wyrzuca błąd: CompilerException java.lang.RuntimeException: Can't let qualified name: user/a, compiling:(NO_SOURCE_PATH:1)

Jak undelstand teraz, schemat „s zdefiniowania składni pozwoli zrobić coś takiego, ale jest tam clojure sposób na to?

Odpowiedz

8

Domyślnie formularz zapytania ofertowego " zapobiega wprowadzaniu symboli bez nazwy i przechwytywania symboli w makrach. Kiedy celowo to zrobisz, możesz użyć sekwencji ~', aby wprowadzić niewykwalifikowany symbol do makra.

(defmacro with-a=hello [f] 
    `(let [~'a "hello"] ~f)) 

user> (with-a=hello (println a)) 
hello 
nil 

makra, które mają to mają fantazyjne nazwy anaforycznego makr

+4

Jest to użyteczne, aby pamiętać, że '~ '' nie jest jakaś konkretna specjalną sekwencję, lecz tylko kombinacja '~' (opuścić składni cytatem) i '' '(rozpocznij normalny cytat). – amalloy

+0

dobry punkt, dzięki :) –

Powiązane problemy