Próbuję tłumaczyć następujące makro z ziemi Lisp w Clojure:Analizowanie makro argumenty Clojure
(defmacro tag (name atts &body body)
`(progn (print-tag ',name
(list ,@(mapcar (lambda (x)
`(cons ',(car x) ,(cdr x)))
(pairs atts)))
nil)
,@body
(print-tag ',name nil t)))
ale wciąż utknięcie z atts wymagając 1 poziom oceny. Na przykład. następujące potrzeby oceny T #:
(defmacro tag [tname atts & body]
`(do (print-tag '~tname '[[email protected](map (fn [[h# t#]] [h# t#]) (pair atts))] nil)
[email protected]
(print-tag '~tname nil true)))
ponieważ wytwarza rzeczy jak:
(tag mytag [color 'blue size 'big])
<mytag color="(quote blue)" size="(quote big)"><\mytag>
gdzie chcę atrybut do oceny. Jeśli użyję "(eval t #)" w powyższym, będę miał problemy takie jak to:
(defn mytag [col] (tag mytag [colour col]))
java.lang.UnsupportedOperationException: Can't eval locals (NO_SOURCE_FILE:1)
Jakieś sugestie?
Dlaczego w Clojure zdarza się mniejszy poziom oceny?
Definicje funkcji wspomagających:
;note doesn't handle nils because I'm dumb
(defn pair [init-lst]
(loop [lst init-lst item nil pairs []]
(if (empty? lst)
pairs
(if item
(recur (rest lst) nil (conj pairs [item (first lst)]))
(recur (rest lst) (first lst) pairs)))))
(defn print-tag [name alst closing]
(print "<")
(when closing
(print "\\"))
(print name)
(doall
(map (fn [[h t]]
(printf " %s=\"%s\"" h t))
alst))
(print ">"))
(Z jakiegoś powodu nie zrobił funkcję pary w taki sam sposób, jak w książce, co oznacza, że nie obsługuje Nils poprawnie)
Jak '' pair' i druku tag' zdefiniowane? –
@ Brian Dodałem te definicje do posta –
wydaje mi się, że 'pair' jest to samo' '(partycja 2 seq)', prawda? – skuro