3

ベクトルをインデックスで分解する方法があるかどうか知りたいです。基本的に、私が避けることを可能にする略記:

(defn f [v]
    (let [x (nth v 4)
          y (nth v 5)]
        (println x y)))

これは私の基本的な問題です:

user=> (defn f [{x 4 y 5}] (println x y))
#'user/f
user=> (f [0 1 2 3 4 5 6])
4 5
nil
user=> (f (apply vector (range 10)))
4 5
nil
user=> (f (range 10))
5 nil
nil
user=>
4

1 に答える 1

8

ベクトルの分解に関する元の質問への回答:

ベクトルは連想的であるため、連想破壊を使用できます。

(let [{x 4 y 5} [0 1 2 3 4 5 6]]
  [x y])
;= [4 5]

fn以下のコメントに応えて、これは、パラメータリストを含め、構造化フォームが機能するすべての場所で機能します。

((fn [{x 4 y 5}] [x y]) [0 1 2 3 4 5 6])
;= [4 5]

seq の構造化に関する新しい質問への回答:

上記のように定義された関数にベクトルの代わりに seq を渡すと、seq の連想破壊の規則が適用されます。つまり、最初に seq がハッシュ マップに注がれ(この段階で に(range 10)なり{0 1 2 3 4 5 6 7 8 9}ます)、次にこのハッシュ マップがマップとして分解されます。

インデックスによって seq を分解する方法はありません。seq は高速ランダム アクセスを必要とするアプリケーション向けではないため、これは仕様によるものです。

于 2013-05-03T16:55:28.677 に答える