如何从向量中获取奇数索引值?

时间:2014-11-17 15:31:04

标签: clojure

假设有一个名字矢量:

(def noms ["Tim" "Joseph" "Steven" "Michael"])

如何从奇数索引中获取名称?

更新: 实际上,我试图在Clojure中重写这个Rust代码:

fn main() {
    let nums = [1, 2];
    let noms = ["Tim", "Eston", "Aaron", "Ben"];

    let mut odds = nums.iter().map(|&x| x * 2 - 1);

    for num in odds {
        spawn(proc() {
            println!("{:s} says hello from a lightweight thread!", noms[num]);
        });
    }
}

有没有惯用的方法呢?

编辑: 这是Clojure代码,与上面提到的Rust代码几乎完全相同:

(def  noms ["Tim", "Eston", "Aaron", "Ben"])
(doseq [i (take-nth 2 (rest noms))]
    (println i "says hello from a lightweight thread!"))

新问题是:如何编写“轻量级”线程(或Clojure术语中的等效线程)?

3 个答案:

答案 0 :(得分:4)

您可以使用take-nth

(take-nth 2 (rest ["Tim" "Joseph" "Steven" "Michael"]))

答案 1 :(得分:1)

如果我理解你的问题,这是一种方法。

user=> v
[:a :b :c :d :e :f :g]
user=> (map #(v %) (filter odd? (range (count v))))
(:b :d :f)
user=>

可能有一种更优雅的方式来做到这一点,但这个方法非常简单,并且相当清楚。

我发现真正专注于clojure的map / filter / reduce模式非常有用。我很少需要使用循环,等等,并且远离那些用其他语言学习的主食需要花费一些精力。

答案 2 :(得分:0)

您可以使用map-indexed和remove。

user> (def noms ["Tim" "Joseph" "Steven" "Michael"])
#'user/noms
user> (->> noms
           (map-indexed (fn [idx x]
                          (if (odd? idx) x)))
           (remove nil?))

;=> ("Joseph" "Michael")