2012-10-16 15 views

risposta

8

Cercare iota (come definito nella SRFI-1).

Esempio: (iota 10 1) fornisce 10 numeri interi consecutivi a partire da 1 (anziché il valore predefinito di 0).

iota non prende gli stessi argomenti gamma ma duplica tutte le funzionalità - gamme crescente, decrescente intervalli, partendo da 0 se solo un salto è dato, capacità di specificare l'intervallo.

+0

Non sono esperto, ma l'intervallo in python3 restituisce un oggetto intervallo e lo valuta pigramente tramite la funzione successiva, seguendo il protocollo del generatore. Vedo che posso fare (ritardo (iota 5 1)) e più tardi la forza può valutarlo. La mia domanda è: una volta valutata, tutta la lista viene messa in una sola volta in memoria? Si può ottenere esattamente lo stesso effetto dell'intervallo di python? Voglio dire, valutare un valore alla volta. –

3

Se non c'è niente di built-in, è banale per scrivere il proprio:

(define (range first last) 
    (if (>= first last) 
     '() 
     (cons first (range (+ first 1) last)))) 

valutatore schema Online: http://eval.ironscheme.net/?id=71

+0

'(considerando per primo (intervallo ((se ( itsbruce

+0

@itsbruce che non termina mai. – nibot

+0

Sì, sì. Provalo. Dà un campo discendente se il primo numero è più alto del più basso, o un campo crescente se il primo è più basso. Ah, dovresti cambiare la tua condizione in (if (= prima l'ultima)) – itsbruce

5

Ecco una versione che fa una gamma ascendente se il primo numero è inferiore o un intervallo discendente se è superiore:

(define range 
    (lambda (n m) 
    (cond 
     ((= n m) (list n)) 
     (else (cons n (range ((if (< n m) + -) n 1) m)))))) 

Ed ecco una versione migliorata che può richiedere 1 o 2 argomenti; Se viene dato solo uno, che fa un range da 0 al numero indicato:

(define range 
    (lambda (n . m) 
    (let 
     ((n (if (null? m) 0 n)) (m (if (null? m) n (car m)))) 
     (cond 
    ((= n m) (list n)) 
    (else (cons n (range ((if (< n m) + -) n 1) m))))))) 
1

Sto solo elevando @ commento di Ankur ad una risposta. In Racket, si dispone di "in-range":

#lang racket 

(in-range 7) ;; produces #<stream> 

;; used in a loop: 
(for/list ([i (in-range 7)]) 
    i) 
;; produces (list 0 1 2 3 4 5 6) 


;; and, for the lazy among us: 

(for/list ([i 7]) 
    i) 

;; produces the same 

può anche accettare un limite inferiore, un incremento (compreso negativo), ecc

1

V'è un built-in range funzione nel racket che si comporta come quello di Python.

> (range 10) 
'(0 1 2 3 4 5 6 7 8 9) 
+0

Penso che sia meglio della risposta accettata. Non c'è nemmeno bisogno di una frase '(require ...)' –

Problemi correlati