무한 루프를 만드는 관용적 인 방법은 무엇입니까?Clojure 무한 루프
저는 calc 함수를 영원히 호출하려고합니다. 하나의 함수 만 반복해서 호출됩니다.
편집 : 내가 언급 한 것을 잊어 버린 또 하나의 사실은 calc가 부작용이 있다는 것입니다. 몇 가지 계산을 수행하고 바이트 배열을 수정합니다.
무한 루프를 만드는 관용적 인 방법은 무엇입니까?Clojure 무한 루프
저는 calc 함수를 영원히 호출하려고합니다. 하나의 함수 만 반복해서 호출됩니다.
편집 : 내가 언급 한 것을 잊어 버린 또 하나의 사실은 calc가 부작용이 있다는 것입니다. 몇 가지 계산을 수행하고 바이트 배열을 수정합니다.
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))))
(루프 [] (CALC) (재발))
이것은 내가 곧 떠올리지 못하는 단순한 꼬리 재귀를위한 구문입니다. –
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을 피할 수 있습니다.
다른 용액과 같은 repeatedly
사용하는 것이다 :
(repeatedly calc)
보다는 infinte 루프이 무한 시퀀스를 반환한다. 지연 시퀀스는 단단한 루프보다 약간 느리지 만 루프의 일부 제어도 허용합니다.
이렇게하면 지연된 시퀀스가 생성되므로 부작용이 실행되지 않을 수 있습니다. 그래서 답에는 'doall' –
(while (calc) nil)이 더 유용 할 것 같습니다. – Kzqai