2009-10-16 15 views
6

Zauważam, że prawie wszystkie funkcje schematu mogą zwracać tylko jedną listę jako wynik.Schemat Jak zwrócić wiele wartości?

Poniżej chciałbym zwrócić wiele wartości wszystkich sąsiednich węzłów sąsiadów.

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

W tym wypadku mówić pierwszy badania, jeśli węzeł w narożniku, a jeśli tak, powrót 2 wartości współrzędnych, w którym (L i W + 1), (L + 1 i W), w zasadzie, jeśli I 'm at (1,1) zwraca mi (1,2) i (2,1)

To samo dotyczy sytuacji, gdy węzeł ma tylko 1 sąsiada blisko krawędzi, w tym przypadku będę miał 3 wartości.

Gdy w pobliżu nie ma krawędzi, będę mieć 4 wartości zwracane.

Próbowałem użyć cons, append, list, display, write żaden z nich nie działa z dodatkowymi wartościami. Potrzebuję tego jako podfunkcji this question. Jak powinienem go zaimplementować, abym mógł przekazać wartość zwracaną i użyć jej rekursywnie do zwrócenia mi wszystkich sąsiednich węzłów?

Edytuj: Znalazłem odpowiedź: użyj słowa kluczowego "values", aby zwrócić wiele wartości. Przykład:

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

Czy wiesz, że możesz pisać odpowiedzi na swoje pytanie? (Jeśli lubisz dostawać punkty na Stack Overflow. :) –

+0

dziękuję za wskazanie tego, nie zdawałem sobie sprawy, że mogę to zrobić – Jonathan

Odpowiedz

2

Możesz powrócić parę wartości w komórce cons:

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

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

Można uogólnić to zwracać wiele wartości na liście, też.

+1

dzięki, że znalazłem lepszy sposób, użyj "wartości" Mogę zwrócić dowolną liczbę zwracanych wartości, które chcę :) (define (sklep LW) (wartości (zapis l) (zapis w) (znak nowej linii) (lista (+ 1 W) l) (lista w (l + 1)))) I – Jonathan

+1

to nie "drukuje" całkiem dobrze, szczególnie jeśli przechowujesz pary lub listy w tobie samochód/cdr. – ulidtko

10

wartości, kontynuacja przechodzącą styl, a liście są co najmniej trzy sposoby zwracania wielu wartości:

(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)) 
Powiązane problemy