2009-08-23 18 views

risposta

8

È possibile utilizzare una macro:

user=> (defmacro def-function [& args] `(defn [email protected])) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 

Oppure si può utilizzare clojure.contrib.def/defalias:

user=> (use 'clojure.contrib.def) 
nil 
user=> (defalias def-function defn) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 
+3

Non esiste più una cosa come "clojure.contrib.def". https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub

3

Per fare questo, in sostanza, si dovrebbe riscrivere la macro esattamente come l'originale, sostituendo semplicemente un nome diverso (si utilizzerà ovviamente defmacro per farlo). Questo è l'unico modo in cui ciò è possibile poiché le macro non restituiscono un valore, ma semplicemente scrivono il codice che deve essere successivamente valutato.

Def richiede di associare un nome a un valore anziché a un blocco di codice.

(DEF simbolo init?)

Crea e stagisti o individua una var globale con il nome di simbolo e uno spazio dei nomi del valore dello spazio dei nomi corrente (ns). Se viene fornito init, viene valutato e il binding root della var viene impostato sul valore risultante. Se init non viene fornito, il binding root della var non viene modificato. def si applica sempre al collegamento radice, anche se la var è legata al thread nel punto in cui viene chiamato def. def restituisce la variabile stessa (non il suo valore). Genera un'eccezione se il simbolo è già nello spazio dei nomi e non è mappato su una var interna.

da Clojure: Special Forms

macro non valutare le loro forme:

macro sono funzioni che manipolano forme, consentendo astrazione sintattica. Se l'operatore di una chiamata è un simbolo che identifica una variabile globale che è una funzione macro, viene chiamata tale funzione macro e viene inviato moduli operandi non rivalutati [corsivo mio]. Il valore di ritorno della macro viene quindi valutato al suo posto.

da Clojure: Evaluation

In sintesi, il punto della macro è quello di ritardare la valutazione, quindi non in grado di fornire un valore per def a legarsi a un simbolo.

+0

Grazie per la spiegazione! –

29

può sembrare (di linea) rumoroso ma

(def #^{:macro true} case #'cond) 

opere!

Problemi correlati