2009-10-08 22 views
15

Incluso mirando de cerca la documentación sobre Clojure, no veo ninguna confirmación directa confirmando si Clojure admite o no la sobrecarga del operador.Sobrecarga del operador en Clojure

Si lo hace, ¿podría alguien darme un breve vistazo de cómo sobrecargar, digamos, el operador "+" para delegar en algún método predefinido al que podamos llamar myPlus.

Soy muy nuevo en Clojure, por lo que la ayuda de alguien aquí sería muy apreciada.

Respuesta

23

Los operadores de Clojure (como cualquier Lisp) son funciones simples; se puede definir un "operador" como una función:

(defn ** [x y] (Math/pow x y)) 

El operador "+" (y algunos otros matemáticas-operadores) es un caso especial en Clojure, ya que se colocarán en línea (para el caso binario, por lo menos) En cierta medida puede evitar esto al no referirse al clojure.core (o excluyendo clojure.core/+) en su espacio de nombres, pero esto puede ser muy peludo.

Para crear un espacio de nombres donde se redefine +:

(ns my-ns 
    (:refer-clojure :exclude [+])) 

(defn + [x y] (println x y)) 

(+ "look" "ma") 

Una buena estrategia sería probablemente para hacer su + a multimethod y llamar a la función + de núcleo para los casos numéricos.

+0

Por lo tanto, si tuviera que excluir clojure.core/+, podría hacer lo siguiente (defn + [xy] (myPlus xy)) ¿correcto? Si es así, eso es exactamente lo que quiero hacer. ¿Cómo excluyo clojure.core/+ de mi espacio de nombres? –

+0

He agregado esto a mi respuesta. – pmf

+0

Bingo, ¡exactamente lo que estoy buscando! Gracias. –

4

Tome un vistazo a esto: http://clojure.org/multimethods

Ciertas funciones, como son + núcleo y no puede ser redefinido.

Puede hacer una nueva función y llamarla ". +" O "! +" Por ejemplo, que es similar en términos de legibilidad.

Usando la información en la URL multimétodos incluida anteriormente, puede crear una función que le indique a su. + Qué implementación usar.

+0

No respondió su pregunta de una forma u otra. – chollida

+0

He agregado más información. – z5h

+0

¡Las actualizaciones realmente ayudan a que esta sea una mejor respuesta! – chollida