2009-10-16 14 views
6

私はほとんどすべてのスキーム関数が1つのリストだけを出力として返すことができることに気付きました。スキーム複数の値を返す方法

以下では、隣接ノードのすべての隣接ノードの複数の値を返したいと思います。ノードは角にある場合ので、座標(LおよびW + 1)の2つの値を返すこの場合

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

私は、第1の試験だ、(L + 1、W)は、基本的にIもし(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

あなたがあなた自身の質問に答えを投稿することができます知っていましたか? (Stack Overflowでポイントを取得するのが好きなら:) –

+0

それを指摘してくれてありがとう、私はそれを行うことができないことを理解していませんでした – Jonathan

答えて

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 W)L) (リストW(+ 1L)))) – Jonathan

+1

そしてこれは、あなたがcar/cdrにペアやリストを格納している場合、特にうまく印刷されません。 – ulidtko

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)) 
関連する問題