2013-04-13 6 views
2

나는 휴식에 대한 설명을 읽고다음을 클로저로 읽습니다. 내가 이해하는대로 next 시퀀스의 꼬리를 평가/실현하고 은 nil을 반환해야하며 그렇지 않은 경우 rest은 항상 시퀀스를 반환하므로 lazier입니다.다음으로 휴식을 취하십시오

그러나, 내가 이해하지 못하는 것은 이것입니다 : 두 기능 모두가 더 축축하다는 것을 알아야하는데, 꼬리에 무엇인가 이 있습니다. 아무 것도 남지 않으면 nil을 반환하고 다른 하나는 ()을 반환합니다.

근본적으로, 그들은 둘 다 남겨진 것을 확인/평가해야합니다. 심지어 rest을 반환하려면 ()을 반환해야합니다. 예를 들어 (2)이라고 말하면 반환 할 필요가 없습니다.

심지어 rest도 평가가 필요합니다.

그러나 설명은 그 반대입니다. 그 평가는 next 뿐이며, rest은 아니므로 lazier입니다.

누구든지 설명 할 수 있습니까?

답변

7
user> (def test-seq (lazy-cat [1] [(do (print "Hi!") 2)])) 
#'user/test-seq 
user> (def rest-test (rest test-seq)) 
#'user/rest-test 
user> (def next-test (next test-seq)) 
Hi! 
#'user/next-test 

rest 요소를 평가해야하는 경우 "안녕하세요!" 내가 (rest test-seq)라고 부른 후에 인쇄해라. 분명히 rest은 작동하기 위해 평가할 필요가 없습니다.

이유는 rest이() 또는 (2) 또는 이와 유사한 것을 반환하지 않기 때문입니다. 그것은 호출 될 때마다 평가되지 않은 지연 시퀀스를 반환하고 반환 할 것이 있는지 없는지에 대한 질문은 그 시퀀스가 ​​나중에 평가 될 때만 응답됩니다.

+0

나는 그것을 얻었습니다. Clojure는 실제로 놀랍도록 간단합니다. –