2017-03-18 1 views
0

나는 한 번에 하나씩 값을 얻기 위해 재귀 적으로 맵을 팝하는 함수를 작성하려고합니다. 다음은 지금까지있어 무엇Clojure에서 값을 얻기 위해 재귀 적으로 맵을 엿보기

..

(defrecord Stoptest [&args]) 

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

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

(stopPop test) 

나는 다음과 같은 말을 오류가 :

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

이 문제의 원인은 무엇?

건배

+0

[CodeReview] (http://codereview.stackexchange.com/)에 더 적합합니다. – Thumbnail

+0

@Thumbnail 음, 아니야? 오류 메시지로 판단하면이 질문의 코드가 "작동 중"으로 간주되는 것처럼 보이지 않습니다. –

+0

@SamEstep 분명히 사실입니다. – Thumbnail

답변

1

rest 반환하지 벡터하지만 게으른 서열. 당신은 재귀의 각 단계에 다른 종류의 객체를 가지고 있기 때문에

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

문제는 여기서 발생 : 당신이에 peek하려고 할 때 오류가 나타납니다. 맨 위에는 Stoptest 인스턴스가 있습니다. 다음으로, 당신은 다른 방식으로 행동하는 게으른 순서를가집니다.

입력 한 레코드에 벡터를 래핑 할 이유가 없습니다. 언제든지 벡터에서 쉽게 반복 할 수 있습니다.

+0

좋아, 내가 나중에 호출 할 수 있기를 원하는대로 defrecord를 사용하고있다. ("Notepad", "Shoes") [0.1 1] 모든 작업은 다음과 같이 보입니다 (def task 6 (로봇 : main-office (정지 : r131 : 본사 없음)) false)) 메소드에 전달됩니다. 입력 된 레코드를 반복 할 수있는 방법이 있습니까? – CS456

+0

' (doseq [ARG (: 및 인수 시험)] (에 println ARG)) : C101 : 메인 사무실 : 전무 ' –

+1

가 BTW 자바와 같은 Clojure의 쓰기 a1 내지. 개인적으로 벡터와지도 같은 일반 데이터 구조에 데이터 (로봇, 패키지 등)를 보관할 것입니다. –