2012-06-10 13 views
8

He estado trabajando en Clojure question 135 Infix Calculator, básicamente un infija simplificada para prefijar calculadora aritmética:¿Cómo convertir una cadena a una función en Clojure?

(= 7 (__ 2 + 5)) 

He resuelto el problema como se especifica. Pero eso me hizo preguntarme: ¿y si el argumento hubiera sido suministrado como una cadena? ¿Cómo lo haría funcionar?

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

Obviamente me gustaría empezar con un dividir, a continuación, Munch a través del resultado:

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

Pero ¿cómo iba a convertir el "+" para una llamada de función? Esto no va a funcionar:

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

Ilustración buscó ....

Respuesta

14

mirada a la función de determinación

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

Genial, gracias dAni! –

2

puede utilizar load-string o read-string. Es algo así como READ-FROM-STRING en el ceceo común, que se adhiere al principio de 'Código es datos', trata la cadena como códigos - evalúa y devuelve el valor.

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

entonces simplemente puede usarlo.

Cuestiones relacionadas