2009-10-16 7 views
6

Je remarque que presque toutes les fonctions de schéma ne peuvent renvoyer qu'une liste en sortie.Schéma Comment retourner plusieurs valeurs?

Dans ce qui suit, je voudrais retourner plusieurs valeurs de tous les nœuds voisins de voisins.

(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? 

Dans ce cas, je suis premier test si le noeud est dans le coin, si oui, revenir 2 valeurs des coordonnées où (l, w + 1), (l + 1 et w), fondamentalement, si I m vaut (1,1) me renvoie (1,2) et (2,1)

Il en va de même lorsque le nœud n'a qu'un seul voisin proche du bord, dans ce cas j'aurai 3 valeurs.

Si aucun front n'est à proximité, j'aurai 4 valeurs de retour.

J'ai essayé d'utiliser cons, append, list, display, write aucun d'entre eux semble travailler avec des valeurs supplémentaires. J'ai besoin de cela comme une sous-fonction de this question. Comment dois-je l'implémenter pour pouvoir transmettre la valeur de retour et l'utiliser récursivement pour me renvoyer tous les nœuds adjacents?

Modifier: J'ai trouvé la réponse: utilisez le mot-clé "values" pour renvoyer plusieurs valeurs. Exemple:

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

Saviez-vous que vous pouvez poster une réponse à votre question? (Si vous aimez obtenir des points sur Stack Overflow.) –

+0

merci de souligner cela, ne s'est pas rendu compte que je peux le faire – Jonathan

Répondre

2

Vous pouvez retourner une paire de valeurs dans une cellule contre:

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

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

Vous pouvez généraliser ce pour renvoyer des valeurs multiples dans une liste, aussi.

+1

merci je viens de trouver un meilleur moyen, utilisez "valeurs" Je peux retourner un certain nombre de valeurs de retour que je veux :) (définie (magasin lw) (valeurs (écriture l) (écriture w) (saut de ligne) (liste (+ 1 w) l) (liste w (+ 1 l)))) Et – Jonathan

+1

Cela ne fonctionne pas très bien, surtout si vous stockez des paires ou des listes dans votre voiture/cdr. – ulidtko

10
valeurs

, le style passe de continuation, et la liste sont au moins trois façons de retourner plusieurs valeurs:

(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)) 
Questions connexes