如何根据给定的输入数字拆分输入序列

时间:2014-10-21 05:44:37

标签: clojure

我正在写一个类似的clojure函数:

(defn area [n locs]
  (let [a1 (first locs)]
    (vrp (rest locs))))

我基本上想输入:(area 3 '([1 2] [3 5] [3 1] [4 2]))但是当我这样做时,它会给我一个错误Wrong number of args (1) passed。但我传递了两个论点。

我真正想要用这个函数做的是无论输入n的值是什么(比如输入3),a1应该存储[1 2],a2应该存储[3 5],a3应该存储([3] 1] [4 2])。我应该在函数中添加什么来获得它?

1 个答案:

答案 0 :(得分:0)

clojue在split-at函数中的构建非常接近解决这个问题。它将一个序列“分配”给定点。因此,如果我们首先将数据拆分,然后将后半部分包装在一个列表中并将其再次连接在一起,它应该可以解决这个问题:

user> (let [[start & end] (split-at 2 sample-data)] 
        (concat start end))
([1 2] [3 5] ([3 1] [4 2]))

结束前的&导致最后一项在列表中汇总。它相当于:

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的性质进行猜测,但我可能完全偏离这里。