Clojure 如何根据给定的输入编号拆分输入序列
我正在编写一个clojure函数,如:Clojure 如何根据给定的输入编号拆分输入序列,clojure,Clojure,我正在编写一个clojure函数,如: (defn area [n locs] (let [a1 (first locs)] (vrp (rest locs)))) 我基本上想输入像:区域3'[1 2][3 5][3 1][4 2],但当我这样做时,它会给我一个错误,说通过了错误数量的args 1。但我要传递两个论点 我实际上想用这个函数做的是,无论输入n的值是什么,比如输入3,那么a1应该存储[12],a2应该存储[35],a3应该存储[31][42]。我应该在函数中添加什么才能
(defn area [n locs]
(let [a1 (first locs)]
(vrp (rest locs))))
我基本上想输入像:区域3'[1 2][3 5][3 1][4 2],但当我这样做时,它会给我一个错误,说通过了错误数量的args 1。但我要传递两个论点
我实际上想用这个函数做的是,无论输入n的值是什么,比如输入3,那么a1应该存储[12],a2应该存储[35],a3应该存储[31][42]。我应该在函数中添加什么才能得到它呢?clojue的内置split at函数非常接近于解决这个问题。它在给定的点上拆分一个序列。因此,如果我们首先将数据分开,然后将后半部分包装在列表中,然后将其重新连接在一起,则应该可以解决此问题:
user> (let [[start & end] (split-at 2 sample-data)]
(concat start end))
([1 2] [3 5] ([3 1] [4 2]))
&before end in let导致列表中的最后一项上卷。这相当于:
user> (let [[start end] (split-at 2 sample-data)]
(concat start (list end)))
([1 2] [3 5] ([3 1] [4 2]))
如果我鲁莽地假设您有一个名为vrp的函数,它需要此表单中的数据,那么您可以通过以下方式完成您的函数:
(defn area [n locs]
(let [[start end] (split-at (dec n) sample-data)
a (concat start (list end))]
(apply vrp a)))
尽管请原谅我胡乱猜测vrp的性质,但我可能在这里完全偏离了基准。vrp做什么?“你能把它写进defn吗?”@Arthurlfeldt vrp毫无疑问代表着。我怀疑n是可用的车辆数量,locs是要访问的地点列表,其中前n是各个车辆段的位置。可能更容易处理为defn区域[车辆LOC访问LOC]。