2009-11-06 4 views
5

私は、値や複数の値を返して消費する定義値などの関数のドキュメントを読んでいます。彼らが何をしているのか理解している。あなたがそのようなことをしたいときは、私には分かりません。スキームで(values ...)(define-values ...)を使用する場合

単一の値リストを作成し、代わりに単一の値リストを消費するのは悪い/不可能なのはいつですか?

答えて

5

define-valuesは、変数を式の結果に直接バインドできる便利な機能です。明示的にリストを展開する必要がないので、入力を省くことができます。単一の値リストを作成することが悪い、または不可能な状況があるとは思わない。実際、の定義値より移植性が高くなります。

+0

このようなリストを使用すると、マッチライブラリを使用してリストをすぐに非構造化することができます。 – grettke

+0

@grettkeしかし、すべてのスキームにマッチライブラリがあるわけではありません:( –

+0

@Vijay:合意。 – grettke

5

Hereは、私のオリジナル投稿です。それは下にコピーされます。

this comp.lang.schemeのスレッドでは、複数の値を返す手段について説明します。 R6RSには明らかに3つの解決策があります:

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

アジズとアロンのポイント;読者に最も多くの情報を伝えるアプローチを使用する必要があります。

関連する問題