2011-12-13 6 views
5

Ho DrRacket versione 5.0.2, ho speso come 3 ore già cercando le librerie giuste per rendere while, dolist e dotimes lavoro. So come usarli ma non riesco a trovare le librerie giuste. Quando digito il dotimes ad esempio mi dice un identificatore sconosciuto.Schema (racket) - Librerie loop

PS: È necessario utilizzare define-syntax per definire questi loop? Ho provato (require srfi/42) ma non funziona. Sto usando #lang scheme.

+1

'while',' dolist' e 'dotimes' sono moduli Lisp comuni. Certamente potresti scrivere macro per loro in Scheme, ma forse vuoi davvero un ambiente Common Lisp? –

+1

A proposito, '#lang scheme' è una lingua di retrocompatibilità ed è deprecato, quindi probabilmente vorrai usare' #lang racket'. Inoltre, suggerisco di leggere [la guida] (http://pre.racket-lang.org/docs/html/guide/index.html) (è abbastanza buono per questo tipo di domande). –

risposta

9

Si potrebbe usare di Racket built-in iteration forms invece:

Invece di (dolist (x some-list) body-forms ...), è possibile scrivere (for ((x some-list)) body-forms ...)

Invece di (dotimes (i n) body-forms ...), si potrebbe usare (for ((i (in-range 0 n))) body-forms ...) o anche semplicemente (for ((i n)) body-forms ...), finché n è un intero non negativo .

È possibile scrivere macro di regole di sintassi per trasformare i loop in stile rack in quelli in stile racket, ma probabilmente non ne vale la pena. Le forme di rack for sono più flessibili di dotimes o dolist da sole, poiché è possibile utilizzarle facilmente per scorrere più sequenze contemporaneamente.

+0

Grazie;) Proverò che –

+0

Nota che il collegamento della documentazione è all'ultima versione di Racket, che al momento di questo commento è 5.2. Hai detto che stai usando 5.0.2, quindi tieni presente la differenza di versione. – dyoo

+0

Ho appena notato che per l'intero 'n' puoi usare' (for ((in)) ...) 'come equivalente per' (for ((i (in-range 0 n)) ...) '. Neat! –

0

Il numero è in realtà una sequenza.

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

(for ((i (in-range n))) body-forms ...) funziona anche. in-range è più veloce.

0

Esiste ora anche un'implementazione della macro Common Lisp loop per Racket. Importa in questo modo:

(require (planet jphelps/loop))