2011-12-13 57 views
5

我有DrRacket版本5.0.2,我花了3個小時已經在尋找合適的庫,使while,dolistdotimes工作。我知道如何使用它們,但我找不到合適的庫。例如,當我輸入dotimes時,它會告訴我未知的標識符。方案(球拍) - 循環庫

PS:您是否必須使用define-syntax來定義這些循環?我試過(require srfi/42)但它不起作用。我正在使用#lang scheme

+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代替:

相反的(dolist (x some-list) body-forms ...),你可以寫(for ((x some-list)) body-forms ...)

相反的(dotimes (i n) body-forms ...),你可以使用(for ((i (in-range 0 n))) body-forms ...)甚至根本(for ((i n)) body-forms ...),只要n是一個非負整數。

您可以編寫語法規則宏來將CL風格的循環轉換爲球拍風格的循環,但它可能不值得。球拍的for-形式本身比dotimesdolist更靈活,因爲您可以輕鬆地使用它們一次迭代多個序列。

+0

謝謝;)我會嘗試 –

+0

請注意,文檔鏈接是最新版本的球拍,在這個評論時是5.2。你提到你正在使用5.0.2,所以要注意版本的差異。 – dyoo

+0

我只注意到對於整數'n',你可以使用'(for((in))...)'作爲'(for((i(in-range 0 n)))...) '。整齊! –

0

數字實際上是一個序列。

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

(for ((i (in-range n))) body-forms ...)也適用。 in-range更快。

0

現在還有一個用於Racket的Common Lisp loop宏的實現。像這樣導入:

(require (planet jphelps/loop))