假设有一个名字矢量:
(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术语中的等效线程)?
答案 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")