Scheme如何返回多个值?

Jon*_*han 6 algorithm scheme return-value

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

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

 (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?
Run Code Online (Sandbox Code Playgroud)

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

当节点在边缘附近只有1个邻居时也是如此,在这种情况下,我将有3个值.

当没有边缘附近时,我将有4个返回值.

我试图使用cons, append, list, display, write它们似乎没有其他值.我需要这个作为这个问题的子功能.我应该如何实现它,以便我可以传递返回值并递归使用它来返回所有相邻节点?

编辑:我找到了答案:使用关键字" values"返回多个值.例:

(define (store l w)
  (values (write l)
          (write w)
          (newline)
          (list (+ 1 w) l)
          (list w (+ 1 l))))
Run Code Online (Sandbox Code Playgroud)

gre*_*tke 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))
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 2

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

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

(let* ((r (foo))
       (x (car r))
       (y (cdr r)))
  (display x) (display y) (newline))
Run Code Online (Sandbox Code Playgroud)

您也可以将其概括为返回列表中的多个值。