3

既知の順序で、他の場所から取得した一連の値があります。また、1つの個別の値があります。これらの両方を構造体に入れたいと思います。つまり

(defstruct location :name :id :type :visited)

今私はリストを持っています

(list "Name" "Id" "Type")

これは正規表現の結果です。

次に、ブール値を:visited;に入れたいと思います。次のような構造体を生成します。

{:name "Name" :id "Id" :type "Type" :visited true}

どうすればよいですか?applyとstruct-mapのさまざまな組み合わせを試しました。私は次のようになりました:

(apply struct-map location (zipmap [:visited :name :id :type] (cons true (rest match))))

しかし、それはそれを完全に回避するための間違った方法かもしれません。

4

3 に答える 3

3

どうですか:

(def l (list "Name" "Id" "Type"))
(defstruct location :name :id :type :visited)
(assoc
   (apply struct location l)
   :visited true)
于 2010-09-30T22:29:36.023 に答える
3

1.2を使用している場合は、構造体ではなくレコードを使用する必要があります。

(defrecord location [name id type visited])

(defn getLoc [[name type id] visited] (location. name id type visited))

(getLoc (list "name" "type" "id") true)
#:user.location{:name "name", :id "id", :type "type", :visited true}
于 2010-10-01T00:01:47.207 に答える
0

お使いのバージョンは問題ないようです。経由の1つの小さなショートカットinto

user> (let [match (list "Name" "Id" "Type")]
        (into {:visited true} 
              (zipmap [:name :id :type] match)))
{:visited true, :type "Type", :id "Id", :name "Name"}

mergeまた働いていただろう。

于 2010-09-30T22:16:46.180 に答える