In clojure
, apply
non può essere applicato a una macro. Ad esempio, (apply and [true false])
solleva un'eccezione. Stavo pensando seguente soluzione:In clojure, come applicare una macro a un elenco?
(defmacro apply-macro[func args] `(~func [email protected]))
A prima vista, sembrava funzionare abbastanza bene:
(apply-macro and [true 5]); 5
(apply-macro and [true 5 0]); 0
(let [a 0] (apply-macro and [true a])); 0
Ma, quando ho passato a una variabile che punta a un vettore, è crollato.
(let [a [true]] (apply-macro and a)); java.lang.IllegalArgumentException:
;Don't know how to create ISeq from: clojure.lang.Symbol
Che delusione !!!!
Qualche idea su come risolvere apply-macro
?
@YehonathanSharvit: il punto è che '(a-macro e a) 'viene espanso a' (e) 'alla ** lettura ** volta, ma' a' viene definito solo al ** tempo ** di valutazione. Quindi il 'unquote-splicing' di' a' (es. '~ @ A') fallisce, perché' a' non è ancora stato definito. –
liwp
Certo, 'a' è un vettore in fase di esecuzione. Ma è inutile se si vuole costruire un modulo '(e ....)' con il contenuto di 'a' in fase di compilazione, poiché il compilatore non può vedere il contenuto di' a'. Quindi è necessario richiamare il compilatore * di nuovo * in fase di esecuzione una volta che si conosce cosa contiene 'a', quindi la necessità di eval. È un po 'complicato, ma spero che la logica abbia senso ..... – mikera
'Functionize' sembra fantastico !!! Sei l'autore? Ci sono dei limiti? – viebel