2011-12-13 4 views
5

DrRacket 버전 5.0.2를 사용하고 있습니다. 이미 3 시간 동안 while, dolistdotimes이되도록 올바른 라이브러리를 찾고 있습니다. 나는 그것들을 사용하는 방법을 안다. 그러나 나는 적절한 라이브러리를 찾을 수 없다. 예를 들어 dotimes을 입력하면 알 수없는 식별자가 표시됩니다.Scheme (Racket) - 루프 라이브러리

추신 : 이러한 루프를 정의하려면 define-syntax을 사용해야합니까? 나는 (require srfi/42)을 시도했지만 작동하지 않습니다. 나는 #lang scheme을 사용하고 있습니다. n는 음수가 아닌 정수입니다 당신이 한, 심지어 (for ((i (in-range 0 n))) body-forms ...)하거나 (for ((i n)) body-forms ...)을 사용할 수 있습니다, 대신 (dolist (x some-list) body-forms ...)

, 당신이 대신 (dotimes (i n) body-forms ...)(for ((x some-list)) body-forms ...)

을 작성할 수 있습니다

+1

'while', 'dolist' 및'dotimes'는 Common Lisp 양식입니다. Scheme에서 매크로를 작성할 수는 있지만 Common Lisp 환경을 원할 수도 있습니다. –

+1

그런데,'#lang scheme'은 하위 호환성 언어이고 더 이상 사용되지 않으므로 아마'#lang racket '을 사용하고 싶을 것입니다. 또한 [이 가이드] (http://pre.racket-lang.org/docs/html/guide/index.html)도 읽어 보는 것이 좋습니다 (이러한 종류의 질문에는 상당히 유용합니다). –

답변

9

당신은 라켓의이 built-in iteration forms 대신 사용할 수 .

CL 스타일 루프를 라켓 스타일의 매크로로 변환하기 위해 구문 규칙 매크로를 작성할 수는 있지만 가치가 없을 것입니다. Racket의 for -forms는 dotimes 또는 dolist보다 더 유연합니다. 여러 시퀀스를 한꺼번에 반복 할 수 있으므로 쉽게 사용할 수 있습니다.

+0

고마워;) 나는 그걸 시도 할 것이다 –

+0

설명서 링크는이 코멘트의 시점에 5.2 인 라켓의 최신 버전입니다. 5.0.2 버전을 사용 중이라고 언급 했으므로 버전 차이에 유의하십시오. – dyoo

+0

정수'n'에 대해'(for i (in-range 0 n))) ...) ...)에 해당하는 것으로'(for ((in)) ...) '. 산뜻한! –

0

숫자는 실제로 시퀀스입니다.

> (sequence->list 5) 
'(0 1 2 3 4) 

(for ((i (in-range n))) body-forms ...)도 마찬가지입니다. in-range이 빠릅니다.

0

라켓 용 Common Lisp loop 매크로도 구현되었습니다. 다음과 같이 가져 오기 :

(require (planet jphelps/loop))