我有DrRacket版本5.0.2,我花了3個小時已經在尋找合適的庫,使while
,dolist
和dotimes
工作。我知道如何使用它們,但我找不到合適的庫。例如,當我輸入dotimes
時,它會告訴我未知的標識符。方案(球拍) - 循環庫
PS:您是否必須使用define-syntax
來定義這些循環?我試過(require srfi/42)
但它不起作用。我正在使用#lang scheme
。
我有DrRacket版本5.0.2,我花了3個小時已經在尋找合適的庫,使while
,dolist
和dotimes
工作。我知道如何使用它們,但我找不到合適的庫。例如,當我輸入dotimes
時,它會告訴我未知的標識符。方案(球拍) - 循環庫
PS:您是否必須使用define-syntax
來定義這些循環?我試過(require srfi/42)
但它不起作用。我正在使用#lang scheme
。
你可以使用球拍的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
-形式本身比dotimes
或dolist
更靈活,因爲您可以輕鬆地使用它們一次迭代多個序列。
謝謝;)我會嘗試 –
請注意,文檔鏈接是最新版本的球拍,在這個評論時是5.2。你提到你正在使用5.0.2,所以要注意版本的差異。 – dyoo
我只注意到對於整數'n',你可以使用'(for((in))...)'作爲'(for((i(in-range 0 n)))...) '。整齊! –
數字實際上是一個序列。
> (sequence->list 5)
'(0 1 2 3 4)
(for ((i (in-range n))) body-forms ...)
也適用。 in-range
更快。
現在還有一個用於Racket的Common Lisp loop
宏的實現。像這樣導入:
(require (planet jphelps/loop))
'while','dolist'和'dotimes'是Common Lisp的形式。您當然可以在Scheme中爲它們編寫宏,但是您可能真的想要一個Common Lisp環境呢? –
順便提一句,'#lang scheme'是一種向後兼容的語言,因此您可能希望使用'#lang racket'。另外,我建議閱讀[指南](http://pre.racket-lang.org/docs/html/guide/index.html)(這對於這類問題來說很好)。 –