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)
您可以在 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)
您也可以将其概括为返回列表中的多个值。