6

我知道库https://github.com/clojure/algo.generic提供了实现通用算术运算符的方法,+ * / -但是我找不到一个简单的示例来说明如何创建它们以及如何将其用作库。

说如果我想实现向量加法等:

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

我该怎么做:

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

2 回答 2

6
(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))
于 2012-09-26T06:32:39.627 回答
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)

于 2012-09-26T03:37:46.063 回答