2009-10-16 46 views
6

我注意到幾乎所有的方案函數都只能返回一個列表作爲輸出。計劃如何返回多個值?

在下面,我想返回鄰居的所有相鄰節點的多個值。

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

在這種情況下我第一測試,如果該節點是在拐角處,如果是的話,返回的座標,其中(L和W + 1)的2個值,(L + 1和w)基本上,如果我(1,1)返回我(1,2)和(2,1)

當節點在邊緣附近只有1個鄰居時,同樣適用,在這種情況下,我將有3個值。

當附近沒有邊時,我將有4個返回值。

我試圖使用cons, append, list, display, write他們都沒有似乎與額外的價值。我需要這個作爲this question的子功能。我應該如何實現它,所以我可以傳遞返回值並遞歸地使用它返回所有相鄰節點?

編輯:我找到了答案:使用關鍵字「values」返回多個值。例如:

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

你知道你可以發佈一個答案,你自己的問題? (如果你喜歡得到堆棧溢出點:) – 2009-10-16 15:34:11

+0

感謝指出,沒有意識到我可以做到這一點 – Jonathan 2009-10-16 17:42:13

回答

2

您可以返回一對值的利弊細胞:

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

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

可以概括這個在列表中返回多個值了。

+1

謝謝我剛剛找到了一個更好的方法,使用「值」我可以返回任何數量的返回值,我想:) (定義(存儲LW) (值(寫入升) (寫瓦特) (換行) (列表(+ 1 w)的升) (列表瓦特(+ 1升))))和 – Jonathan 2009-10-16 10:47:51

+1

這並不能很好地打印出來,特別是當你在car/cdr中存儲對或列表時。 – ulidtko 2011-03-01 04:39:30

10

值,延續傳遞風格,並列出至少三種方式返回多個值:

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