我注意到几乎所有的方案函数都只能返回一个列表作为输出。
在下文中,我想返回邻居所有相邻节点的多个值。
(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))))
答案 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