如何使用clojure.algo.generic库?

时间:2012-09-26 01:50:32

标签: clojure

我知道库https://github.com/clojure/algo.generic提供了实现泛型算术运算符+ * / -的方法,但在那里我找不到一个如何创建它们然后如何将它用作库的简单示例。

如果我想实现向量添加等,请说:

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

我该怎么做:

  • 使用algo.generic
  • 定义+运算符
  • 使用先前在另一个项目中定义的+运算符?

2 个答案:

答案 0 :(得分:5)

(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 :(得分:1)

编辑2,

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

编辑,你也可以做

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

- 编辑 -

你应该使用(require [lib:as namespacehere])并调用(namespacehere / + ...)。以下是问题的代码。

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

另外,请查看(in-ns)