在clojure中我使用以下函数初始化2d向量:
(defn vec2d [x y init]
(vec (map
#(vec (map init (range x))) (range y))))
用法:
(def grid (vec2d 40 30 (fn [] "x")))
由于我是这门语言的新手,我问自己这是否是最直接的方式。有没有人想要优化这个?
答案 0 :(得分:3)
假设您总是希望将向量的条目初始化为常量,以下是我的方法:
(defn vec2d
"Return an x by y vector with all entries equal to val."
[x y val]
(vec (repeat y (vec (repeat x val)))))
答案 1 :(得分:2)
如果您希望能够根据坐标进行初始化,则可以执行此操作
(defn vec2d [sx sy f]
(mapv (fn[x](mapv (fn[y] (f x y)) (range sx))) (range sy)))
如果你这样做,你可以拥有一个恒定的值
(vec2d 4 3 (constantly 2))
;; [[2 2 2 2] [2 2 2 2] [2 2 2 2]]
或根据坐标初始化,例如:
(vec2d 4 3 (fn[x y] (+ x y)))
(vec2d 4 3 +) ;; or more concisely
;;[[0 1 2 3] [1 2 3 4] [2 3 4 5]]
答案 2 :(得分:1)
使用mapv
并设置
(defn vec2d [x y init]
(mapv #(mapv init (range x)) (range y)))
如果您想要初始化坐标:
(defn vec2d [x y init]
(mapv (fn [y] (mapv #(init % y) (range x))) (range y))
如果您只想要所有单元格,嵌套它对于板生成也非常易读:
(defn vec2d [cols rows init]
(for [x (range rows) y (range cols)]
(init x y)))
或者如果你不介意seqs:
(defn vec2d [cols rows init]
(for [x (range rows)]
(for [y (range cols)]
(init x y))))