2009-10-16 22 views
6

Observé que casi todas las funciones de esquema solo pueden devolver una lista como salida.Esquema ¿Cómo devolver valores múltiples?

A continuación, me gustaría devolver varios valores de todos los nodos adyacentes de los vecinos.

(define (neighbors l w) 
    (if (and (= 1 l) (= 1 w)) 
    (list (and (l (+ 1 w))) (and (+ 1 l) w)))) ; how to output 2 or more values? 

En este caso estoy primera prueba si el nodo está en la esquina, si es así, volver 2 valores de las coordenadas donde (l y w + 1), (l + 1 y w), básicamente, si estoy en (1,1) return me (1,2) y (2,1)

Lo mismo se aplica cuando el nodo tiene solo 1 vecino cerca del borde, en este caso tendré 3 valores.

Cuando no haya bordes cerca tendré 4 valores de retorno.

Intenté usar cons, append, list, display, write ninguno de ellos parece funcionar con valores adicionales. Necesito esto como una función secundaria de this question. ¿Cómo debo implementarlo para poder pasar el valor de retorno y usarlo recursivamente para devolverme todos los nodos adyacentes?

Editar: He encontrado la respuesta: utilice la palabra clave "values" para devolver valores múltiples. Ejemplo:

(define (store l w) 
    (values (write l) 
      (write w) 
      (newline) 
      (list (+ 1 w) l) 
      (list w (+ 1 l)))) 
+2

¿Sabías de enviar una respuesta a su propia pregunta? (Si te gusta obtener puntos en Stack Overflow. :) –

+0

gracias por señalarlo, no me di cuenta que puedo hacerlo – Jonathan

Respuesta

2

Puede volver un par de valores en una celda contras:

(define (foo) 
    (cons 'a 5)) 

(let* ((r (foo)) 
     (x (car r)) 
     (y (cdr r))) 
    (display x) (display y) (newline)) 

Puede generalizar esto a devolver múltiples valores en una lista, también.

+1

gracias Acabo de encontrar una mejor manera, uso "valores" Puedo devolver cualquier número de valores de retorno que desee :) (define (tienda lw) (valores (escribir l) (w escritura) (nueva línea) (lista (+ 1 w) l) (lista w (+ 1 l)))) – Jonathan

+1

Y esto no 'imprime' bastante bien, especialmente si almacena pares o listas en su automóvil/cdr. – ulidtko

10

valores, la continuación del estilo que pasa, y la lista de por lo menos tres maneras de devolver varios valores:

(import (rnrs)) 


; let-values + values 
(define (foo1) 
    (values 1 2 3)) 

(let-values (((a b c) (foo1))) 
    (display (list a b c)) 
    (newline)) 

; cps 
(define (foo2 k) 
    (k 1 2 3)) 

(foo2 (lambda (a b c) 
     (display (list a b c)) 
     (newline))) 

; list 
(define (foo3) 
    (list 1 2 3)) 
(let ((result (foo3))) 
    (display result) 
    (newline)) 
Cuestiones relacionadas