2009-10-03 4 views
14

무한 루프를 만드는 관용적 인 방법은 무엇입니까?Clojure 무한 루프

저는 calc 함수를 영원히 호출하려고합니다. 하나의 함수 만 반복해서 호출됩니다.

편집 : 내가 언급 한 것을 잊어 버린 또 하나의 사실은 calc가 부작용이 있다는 것입니다. 몇 가지 계산을 수행하고 바이트 배열을 수정합니다.

답변

23

while 코어 라이브러리이다.

(while true (calc)) 

이 내용은 간단한 recur으로 확장됩니다.

(defmacro while 
    "Repeatedly executes body while test expression is true. Presumes 
    some side-effect will cause test to become false/nil. Returns nil" 
    [test & body] 
    `(loop [] 
    (when ~test 
     [email protected] 
     (recur)))) 
+2

(while (calc) nil)이 더 유용 할 것 같습니다. – Kzqai

12

(루프 [] (CALC) (재발))

+0

이것은 내가 곧 떠올리지 못하는 단순한 꼬리 재귀를위한 구문입니다. –

16

Brian 그것은 아무것도하지 않는 forever 매크로를 작성하는 간단한 작업은 그의 대답에 제공하지만 while에서 부울 테스트 강하하는 while 매크로 사용 :

 
(defmacro forever [& body] 
    `(while true [email protected])) 

user=> (forever (print "hi "))       
hi hi hi hi hi hi hi hi hi hi hi .... 

이 재미있는 부분입니다 모든 Lisp 중 자신의 제어 구조를 만들 수 있고 그 대가로 boilerplate code을 피할 수 있습니다.

+0

주위에있는 동안 똑같은 일을하는 영원한 매크로를 작성하는 것은 무의미합니다. 이름에 대한 설명이 필요하지 않은 경우와 그 경우에는 누군가가 함수 동의어 매크로를 작성해야합니다. : p – Rayne

+2

동의하지 않습니다. 'dosync'는 무의미하다고 생각합니까? 당신은 쓰기도 할 수 있습니다 (nil sync ...). – Jonas

2

다른 용액과 같은 repeatedly 사용하는 것이다 :

(repeatedly calc) 

보다는 infinte 루프이 무한 시퀀스를 반환한다. 지연 시퀀스는 단단한 루프보다 약간 느리지 만 루프의 일부 제어도 허용합니다.

+1

이렇게하면 지연된 시퀀스가 ​​생성되므로 부작용이 실행되지 않을 수 있습니다. 그래서 답에는 'doall' –