2009-10-16 47 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))