2017-03-18 9 views
0

私は、一度に1つずつ値を取得するために、マップを再帰的にポップする関数を作成しようとしています。Clojureで値を取得するために再帰的に地図を覗きます

clojure.lang.LazySeq cannot be cast to clojure.lang.IPersistentStack 

この問題を引き起こしているもの:

次は私がこれまで持っているものです。..

(defrecord Stoptest [&args]) 

(def test (Stoptest. [:c101 :main-office :a1])) 

(defn stopPop [x] 
(peek (-> x :&args)) 
(recur(peek(rest x)))) 

(stopPop test) 

は、私は次のように言ってエラーが出ますか?

乾杯

+0

[CodeReview](http://codereview.stackexchange.com/)に適しています。 – Thumbnail

+0

@サムネイルエラーメッセージで判断すると、この質問のコードが「作業中」と見なされるようなことはありません。 –

+0

@SamEstepこれは確かに当てはまります。 – Thumbnail

答えて

1

rest戻っていないベクトルが、怠惰な配列。あなたが上peekしようとするとエラーが表示されます。

(peek (seq [1 2 3])) ;; gives the same error

あなたは再帰の各段階に異なるタイプのオブジェクトを持っているので、ここでの問題は発生します。上にはStoptestのインスタンスがあります。次に、他の方法で動作する遅延シーケンスがあります。

ベクターを型付きレコードにラップする理由はありません。あなたはいつでもベクトル上で簡単に反復処理を行うことができます。

+0

さて、私は後でそれを呼び出すことができるようにdefrecordを使用しています。 [メモ帳]、[靴]、[0.1 1]などのようになります(def task6(ロボット:main-office(停止:r131:メインオフィスnil nil):r111 )false))、メソッドに渡されます。型付きレコードを繰り返し処理する方法はありますか? – CS456

+0

' (doseq [引数(:&引数テスト)] (printlnの引数)) :C101 :メインオフィス : ゼロ ' –

+1

a1とところで、あなたは、JavaのようなClojureのを記述します。個人的に私はあなたのデータ(ロボット、パッケージなど)をベクタやマップのような単純なデータ構造に保ちます。 –

関連する問題