2010-03-30 16 views
10

Bien, esto puede sonar como una pregunta ridícula, pero ¿cómo se devuelve una lista en el esquema ?.Esquema de cómo crear una lista

+0

Puede que le sea útil: http://www.r6rs.org/. No es excesivamente técnico en su mayor parte y puede responder muchas preguntas como esta. Es una guía muy útil para entender cómo los programas Scheme están hechos de las estructuras de datos más comunes en Scheme. – avpx

Respuesta

9

Probablemente quiera simplemente: '(2 3 5 7 11) o (list 2 3 5 7 11)?

También puede construir listas mediante la especificación de un elemento y una lista para añadirlo a: (cons 2 (cons 3 '()))

He aquí un ejemplo de devolver una lista de una función:

(define returnlist 
    (lambda(a b c) 
    (cons a (cons b (cons c '()))) 
)) 

(returnlist 2 3 4) 

Valor de retorno será la lista : (list 2 3 4)

4

Otra forma no tan bien conocido para hacer esto:

> ((lambda x x) 2 3 5 7 11) 
(2 3 5 7 11) 

, es decir, la función de "lista" sí se puede definir como:

> (define list (lambda x x)) 
19

Sobre la base de ver algunas de sus otras preguntas, creo que puede estar teniendo problemas para conseguir su cabeza envuelta en torno a los conceptos centrales a un funcional lenguaje como Scheme.

En el nivel que está aprendiendo Scheme (novato), cada función que escribe tiene una entrada y una salida, y el cuerpo de cada función es una sola expresión. Cualquier valor que la expresión evalúa es devuelto por la función. No es necesario "devolver" explícitamente nada como lo haría en un lenguaje imperativo como Java o C; simplemente sucede como una consecuencia directa de la evaluación de la expresión.

El cuerpo de una función es una expresión única. No es como Java, donde el cuerpo de un método consiste en una serie de instrucciones:

do this 
then do that 
then do something else 
then return something (maybe) 

funcionamiento del Esquema evalúan una sola expresión; nada mas. He aquí una simple función que añade 5 a cualquier número se pasa como argumento:

(define (add5 x) 
    (+ x 5)) 

El cuerpo de la función es (+ x 5), que es sólo una expresión a evaluar. El valor de x está conectado, la función + (adición) se aplica a x y 5, y se devuelve el resultado.

Las listas no son muy diferentes. Todo lo que necesitas es una expresión que construirá una lista. Dos ya se han mencionado: list se utiliza para crear una lista desde cero si ya tiene todos los elementos; cons se usa para agregar un solo elemento a una lista existente y se usa a menudo de forma recursiva.

Aquí es una función que consume un número n y construye la lista (n n-1 n-2 ... 0)

(define (makelist n) 
    (if (= n 0) 
    (list 0)      ; base case. Just return (0) 
    (cons n (makelist (- n 1))))) ; recursive case. Add n to the head of (n-1 n-2 ... 0) 

En la base y en los casos recurrentes, se devuelve una lista con sólo evaluar una expresión que utiliza una de las funciones de fomento de la lista .

Aquí hay otro ejemplo.Éste utiliza nuestra función add5 añadir 5 a cada elemento de una lista de números (lon):

(define (add5list lon) 
    (if (null? lon) 
    `()     ; base case: lon is empty. Return an empty list. 
    (cons (add5 (car lon)) (add5list (cdr lon))))) ; recursive case. 
                ; Add 5 to the head of lon and prepend it to the tail of lon 

Una vez más, la base y en los casos recurrentes están regresando listas mediante la evaluación de expresiones que resultan en las listas.

La clave para recordar sobre Scheme es que todas las funciones devuelven algo, y ese algo es simplemente el resultado de evaluar una expresión. El cuerpo de una función Scheme es una expresión única.