2009-03-24 5 views
15

würde Ich mag, dies zu tun (in REPL oder überall)Wie definiere ich eine Funktion von String in Clojure?

(defn (symbol "print-string") [k] (println k)) 

und dann in der Lage seiner

(print-string "lol") 

Oder zu tun, wenn eine andere Art und Weise gibt es defn von benutzerdefinierten Zeichenkette zu schaffen, in Makros, könntest du mich bitte in die richtige Richtung drängen?

Antwort

21
(defmacro defn-with-str [string args & body] 
`(defn ~(symbol string) ~args [email protected])) 

(defn-with-str "print-string" [k] (println k)) 

(print-string "lol") 
+0

1. was die ~ vor args ist? 2. Was ist das ~ @ vor dem Körper? – Belun

+1

@Belun 1. ~ = unquote 2. ~ @ = expand sequenz – Surya

+0

warum ist das, wenn ich (defn defns [] (doall (map (fn [s] (defn-mit-str s [k] (println k))) ["print-string"]))) Ich bekomme ein Fn namens 's'? – Hendekagon

14

Ich mag besser dnolen Antwort, aber man kann dies auch tun:

(defn #=(symbol "print-string") [k] (println k))

#=() bei Lesezeit ausgewertet wird. Ich weiß nicht, wie stabil eine Funktion von Clojure ist, ich würde mich nicht darauf verlassen, dass es sich in Zukunft nicht ändert. Makros sind, wie ich es machen würde.

17

Die Lösung von dnolen arbeitet bei der Makroexpansionszeit, Brian Carper bei der Lesezeit. Nun, hier ist eine für Laufzeit:

(intern *ns* (symbol "a") (fn [k] (println k))) 
+0

Cool wusste nicht darüber. Eine Einschränkung besteht darin, dass die Variable var die Funktionsmetadaten verfehlt, die Sie mit defn erhalten. – dnolen

7

FYI - dnolen Antwort wird nur für Zeichenketten arbeiten und nicht für Strings in def'd oder let'd Variablen.

(defmacro defn-mit-str [string args & body] `(defn ~ (Symbol string) ~ ~ @ args Körper))

(def hisym "hallo") (defn-mit- str hisym [] ("hallo" println))

Sie haben nun eine Funktion "hisym" genannt

(hallo) -> java.lang.Exception: Kann Symbol zu beheben: hallo in diesem Zusammenhang (NO_SOURCE_FILE : 6) (hisym) -> druckt "hi"

dies zu vermeiden, eval den Funktionsnamen Zeichenfolge im Makro

(defmacro defn-with-str [string args & body]
`(defn ~(symbol (eval string)) ~args [email protected]))

Verwandte Themen