我正在使用Clojure中的矩阵实现,我正在做的是为了实现它的乐趣并学习更多有关Clojure的知识,而不是因为我想创建世界上最快最最酷的矩阵实现。
像这样的代码中需要的主要操作之一是能够在矩阵中的给定行和列处返回值,这当然是我作为函数编写的
(mat-getrc m 2 3)
说“给我第2行的值,矩阵m的第3列”。非常好的Clojure,但是冗长而且丑陋。我而不是写
(m 2 3)
但当然A)向量(在我的包矩阵中只是向量)只响应单个参数,而B)向量不知道如何使用行号和列号来确定存储正确值的位置
通过查看the docs for IFn
(哪些向量应该实现),似乎存在invoke
的双参数版本 - 但是如何让我的“矩阵”向量来实现和响应它?
任何建议和指向正确的方向都会受到赞赏。
答案 0 :(得分:2)
(def matrix [[1 2 3 4][5 6 7 8][9 10 11 12]])
正如你在问题中所说,这是可能的:
(matrix 2)
但这不是:
(matrix 2 3)
这是获取索引索引的标准方法:
(get-in matrix [2 3])
你已经几乎可以获得你想要的东西,只需要更多的内容:
((matrix 2) 3)
您可以定义更高阶的函数:
(defn matrix-hof [matrix]
(fn [x y]
(get-in matrix [x y])))
然后将函数而不是矩阵放在函数位置:
(let [m (matrix-hof matrix)]
(m 2 3))
我不相信使用函数或宏可以确切地询问您的内容。
答案 1 :(得分:2)
你不能修改向量的实现方式中调用向量的方式,但是你可以定义自己的类型来包装向量,充当向量,并且可以调用applicationIDSuffix '.flavor'
。您需要扩展矢量实现的许多相同接口(但这是一个很大的列表):
deftype