2012-09-26 42 views
5

Sé que la biblioteca https://github.com/clojure/algo.generic proporciona formas de implementar operadores aritméticos genéricos + */- pero no pude encontrar un ejemplo simple de cómo crearlos y cómo usarlo como biblioteca.¿cómo se puede usar la biblioteca clojure.algo.generic?

dicen que si quería poner en práctica la suma de vectores, etc:

> (+ [1 2 3 4 5] 5) 
;; => [6 7 8 9 10] 

cómo hago para:

  • definir el operador + con algo.generic
  • usando el operador + previamente definido dentro de otro proyecto?

Respuesta

4
(ns your.custom.operators 
    (:import 
    clojure.lang.IPersistentVector) 
    (:require 
    [clojure.algo.generic.arithmetic :as generic])) 

(defmethod generic/+ 
    [IPersistentVector Long] 
    [v x] 
    (mapv + v (repeat x))) 

(ns your.consumer.project 
    (:refer-clojure :exclude (+)) 
    (:use 
    [clojure.algo.generic.arithmetic :only (+)]) 
    (:require 
    your.custom.operators)) 

(defn add-five 
    [v] 
    (+ v 5)) 
1

edición 2,

user=> (defn + [coll i] (map #(clojure.core/+ % i) coll)) 
#'user/+ 
user=> (+ [1 2 3 4 5] 5) 
(6 7 8 9 10) 

edición, También puede hacer

(in-ns 'algo.generic) 
(defn + [& args]) 

- Editar -

que puedes usar (requiera [lib: como namespacehere ]) y llamada (namespacehere/+ ...). Debajo está el código para el problema presentado.

user=> (map #(+ % 5) [1 2 3 4 5]) 
(6 7 8 9 10) 

Además, mira (in-ns).

Cuestiones relacionadas