2012-06-10 10 views
8

pracuję na Clojure question 135 Infix Calculator zasadniczo uproszczony Infix poprzedzający arytmetycznego kalkulatora:Jak przekonwertować ciąg znaków na funkcję w Clojure?

(= 7 (__ 2 + 5)) 

I rozwiązać problem zgodnie ze specyfikacją. Ale to mnie zastanowiło - co, jeśli argument został dostarczony jako ciąg znaków - jak mógłbym go uruchomić?

(= 7 (__ "2 + 5")) 

Oczywiście zacząłbym z podzielić, potem chrupać przez wynik:

(clojure.string/split "2 + 5" #"\s") 
user=> ["2" "+" "5"] 

Ale w jaki sposób przekonwertować znak „+” do wywołania funkcji? To nie będzie działać:

("+" 2 5) 
user=> java.lang.ClassCastException: java.lang.String cannot be 
cast to clojure.lang.IFn <snip> 

Oświecenie szukał ....

Odpowiedz

14

Spójrz funkcji resolve

((resolve (symbol "+")) 1 2) 
+0

Świetnie, dzięki dAni! –

2

można użyć load-string lub read-string. To jest coś takiego jak READ-FROM-STRING w typowym seplenieniu, które jest zgodne z zasadą "Code is Data", traktuje ciąg jako kody - oceń i zwróć wartość.

user=> (class (load-string "+")) 
clojure.core$_PLUS_ 
user=> (read-string "+") 
+ 
user=> 

to można go po prostu użyć.

Powiązane problemy