2012-09-26 10 views
5

So che la libreria https://github.com/clojure/algo.generic fornisce modi per implementare operatori aritmetici generici + */- ma non sono riuscito a trovare un semplice esempio di come crearli e quindi come utilizzarlo come libreria.come si può usare la libreria clojure.algo.generic?

dire se volevo implementare somma di vettori, ecc:

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

come potrei fare per:

  • definire l'operatore + con algo.generic
  • utilizzando l'operatore + in precedenza definito all'interno di un altro progetto?

risposta

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

modificare 2,

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

modificare, Si può anche fare

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

- Modifica -

si dovrebbe usare (richiede [lib: come namespacehere ]) e chiama (namespacehere/+ ...). Di seguito è riportato il codice per il problema presentato.

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

Inoltre, controllare (in-ns).

Problemi correlati