2009-08-23 11 views

Antwort

8

können Sie ein Makro verwenden:

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

Oder Sie können clojure.contrib.def/defalias verwenden:

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

So etwas wie 'clojure.contrib.def 'gibt es nicht mehr. https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub

3

Um dies zu tun, müssten Sie im Wesentlichen das Makro genau wie das Original neu schreiben, nur einen anderen Namen ersetzen (Sie würden natürlich defmacro verwenden, um dies zu tun). Nur so ist dies möglich, da Makros keinen Wert zurückgeben, sondern einfach Code ausschreiben, der anschließend ausgewertet werden soll.

Def erfordert die Bindung eines Namens an einen Wert anstelle eines Codeblocks.

(def Symbol init?)

Erstellt und Praktikanten oder sucht einen globalen var mit dem Namen des Symbols und einem Namensraum des Wertes des aktuellen Namensraum (ns). Wenn init übergeben wird, wird es ausgewertet, und die Root-Bindung der Variablen wird auf den resultierenden Wert gesetzt. Wenn init nicht angegeben wird, ist die Root-Bindung der Variablen nicht betroffen. def gilt immer für die Root-Bindung, auch wenn die var Thread-gebunden ist an dem Punkt, wo Def aufgerufen wird. def ergibt die Var selbst (nicht ihren Wert). Es wird eine Ausnahme ausgelöst, wenn das Symbol bereits im Namespace vorhanden und keinem intern gespeicherten var zugeordnet ist.

von Clojure: Special Forms

Makros nicht auswerten ihre Formen:

Makros Funktionen sind, die Formen zu manipulieren, für syntaktische Abstraktion ermöglicht. Wenn der Operator eines Aufrufs ein Symbol ist, das eine globale Variable bezeichnet, die eine Makrofunktion ist, wird diese Makrofunktion aufgerufen, und wird an die nicht ausgewerteten Operandenformen [kursiv meins] übergeben. Der Rückgabewert des Makros wird dann an seiner Stelle ausgewertet.

von Clojure: Evaluation

Zusammengefasst ist der Punkt, der Makro Auswertung zu verzögern, so dass es keinen Wert sorgen für def auf ein Symbol zu binden.

+0

Danke für die Erklärung! –

29

klingen mag (Line-) laut, aber

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

funktioniert!