表題

receive による多重値の束縛

著者

John David Stone

住所は Department of Mathematics and Computer Science, Grinnell College, Grinnell, Iowa 50112、 メールはこちら

状態

この SRFI は現在「確定」の状態である。 SRFI の各状態の説明については ここ を参照せよ。 この SRFI に関する議論については メーリングリストのアーカイブ を参照せよ。

関連する SRFI

この SRFI で提案する構文は、SRFI-1「リスト ライブラリ」の参照実装において使用される。

概要

多重値を識別子に束縛するために、R5RS では call-with-values プリミティブという唯一の方法を提供している。この SRFI では、このような束縛を行うための、 より簡潔でより読みやすい構文を提案する。

論拠

R5RS は多重値を返す式をサポートするが、その骨格となる values 手続きと call-with-values 手続きを提供するのみである。 この SRFI の目的は、これらの手続きを使用する際の共通パターンを抽象化することで、 新しい構成要素を定義することにある。

そのような使用パターンの 1 つに、式の多重値の各々を識別子に束縛し、 その束縛のスコープ内で別の式を評価するというパターンがある。 このパターンの例として、次のようなクイック ソート手続きの一部を考えてみよう。


(call-with-values
  (lambda ()
    (partition (precedes pivot) others))
  (lambda (fore aft)
    (append (qsort fore) (cons pivot (qsort aft)))))

ここで partition は多重値を返す手続きで、 述語とリストの 2 つの引数をとり、2 つのリストを返す。 戻り値のリストの 1 つは述語を満たす要素からなり、 もう 1 つは述語を満たさない要素からなる。 上記の式の目的は、リスト others を分割し、 その各部分リストをソートし、それを再結合してソート済みリストを作成することにある。

この目的を達成するために重要なことは、識別子 foreaftpartition の戻り値に束縛することである。これを行うために call-by-values プリミティブを使用するのは面倒である。 多重値を返す式を引数なしの手続きとして明示的に書き、 また、その多重値の束縛スコープで評価される式を別の手続きとして明示的に書き、 値を受け取る識別子を引数に指定しなくてはならない。

このように式を手続きとして埋め込むことは決まり文句であり、 背後にある束縛の仕組みを露出してはいるが、 それによりプログラム固有の仕組みを表しているわけではない。 それゆえ、構文抽象化を利用して重要な部分だけを記述すれば、 コードがより簡潔で読みやすいものとなる。 束縛される識別子、多重値を返す式、その値を受け取る本体だけを記述すればよいのである。


(receive (fore aft) (partition (precedes pivot) others)
  (append (qsort fore) (cons pivot (qsort aft))))

この構文の優位性は、lambda-式をオペレータとして使用する手続き呼び出しに対する let-式の優位性に類似している。 いずれの場合も、束縛が確立される「ヘッダ部」を、それを使用する「本体部」と分離することで、 コードを理解するのが容易になっている。

仕様

(receive <formals> <expression> <body>)     ライブラリ構文

<formals>、<expression>、<body> は R5RS で説明されている。特に <formals> は以下の 3 つのうちの 1 つの形式をとることができる。

いずれの場合も、<body> 内の式は拡張された環境で順番に評価される。 body の最後の式の返り値が receive-式の返り値となる。

参照実装


(define-syntax receive
  (syntax-rules ()
    ((receive formals expression body ...)
     (call-with-values (lambda () expression)
                       (lambda formals body ...)))))


Copyright (C) John David Stone (1999). All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


編集者: Mike Sperber