Scheme如何返回多个值?

时间:2009-10-16 10:21:15

标签: algorithm scheme return-value

我注意到几乎所有的方案函数都只能返回一个列表作为输出。

在下文中,我想返回邻居所有相邻节点的多个值。

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

在这种情况下,我首先测试节点是否在拐角处,如果是,如果我在(如果我在的话),则基本返回坐标的2个值(l和w + 1),(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))))

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:2)

您可以在cons单元格中返回一对值:

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

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

您可以对此进行概括,以便在列表中返回多个值。

答案 2 :(得分:2)

Scheme的Guile实现具有receive语法,它说它比values“更方便”。但是,我还没有使用它,但这可能很有用:

http://www.gnu.org/software/guile/manual/html_node/Multiple-Values.html