アルゴリズム言語Schemeに関する第五改訂報告書

RICHARD KELSEY、WILLIAM CLINGER、JONATHAN REES (編集)
H. ABELSON
N. I. ADAMS IV
D. H. BARTLEY
G. BROOKS
R. K. DYBVIG
D. P. FRIEDMAN
R. HALSTEAD
C. HANSON
C. T. HAYNES
E. KOHLBECKER
D. OXLEY
K. M. PITMAN
G. J. ROZAS
G. L. STEELE JR.
G. J. SUSSMAN
M. WAND
20 february 1998 (犬飼 大訳: 7 May 1999) (GAF05426@nifty.ne.jp)


(1)

scope: オブジェクトが存在する空間で、オブジェクトの有効範囲を規定する。その空間を取り囲む領域の外からこのオブジェクトが見えない時、オブジェクトは静的スコープを持つという。

(2)

tail-recursive: 引数をそのまま返すか自分自身を適用したものを返す手続きは"終端再帰手続き"と呼ばれる。再帰呼び出しは、引数をスタックもしくはセルに退避させた上で自分自身を呼び出すために、呼び出し回数が増えるほど記憶域の消費量が増える。再帰が仕様上終端再帰として処理されることが保証されていれば、再帰手続きは内部的には単純な繰り返しによって表現されることになり、呼び出すごとに記憶域を食いつぶすことがなくなる。

(3)

exact and inexact number: 初等整数論にいう完全数perfect numberではなく、数学的な数の観念に正確に対応するという意味で、完全(exact)と不完全(inexact)の訳を採用した。

(4)

hygienic、清潔な、衛生的な

(5)

binding: "束縛"ともいう。ポインタもしくは参照によってある値を指し示すことであり、指し示された対象そのものを意味する場合もある。bindは"束縛する"ではなく"バインドする"としている。

(6)

extent: オブジェクトの存在期間。

(7)

対、ドット対、ドットペア、などとも呼ばれることがある。Common Lispのdotted listに相当する。Schemeの定義では、ペアはリストの構成要素であり、リストはすべてペアである。ペアがリストであるかどうかについてはsection 7.3.2 ペアとリスト参照。の表記に使用され(section 7.3.2 ペアとリスト節)、仮引数リストの中の残りの引数を指し示すのに使用される(section 5.1.4 手続き参照)。

(8)

アポストロフィ、ライトクォーテーション、右引用符は、表記された通りのデータを示すのに使用される(section 5.1.2 リテラル式)。

(9)

レフトクォーテーション、左引用符は、定数同様のデータを示すのに使用される(section 5.2.6 バッククォート式)。

(10)

location: 以後誤解が生じないと思われる場所では単に記憶域と訳す。

(11)

バインドされていない。バインドされていない変数を参照した場合はアンバウンドエラーである。

(12)

Schemeの基本的な処理を行なう手続き。あらゆる処理手続きが、処理の最小単位であるプリミティブをもとにして構築され得る。すべての処理がこの手続き群に基づいてることから、プリミティブ(原始手続き)といわれる。primitive。

(13)

(x)(x y)(a b c)のように要素を小括弧で括ったものがリストである。例えばxはこの表記の通りの裸のxならばリストではないが、"<仮引数群>の形式"の中の例のように(3 4 5 6)にバインドされるならば、xもリストである。

(14)

訳注: 仮引数xに対する実引数4はラムダ式の外で与える。全体を小括弧で括ると仮引数に実引数を;割り当ててラムダ式が評価される。

(15)

訳注: この式は、((lambda (x y) (- y x)) 7 10)に等しい。

(16)

訳注: 3、4、5、6はすべて、数に評価された上でリストに変換される。引数の最初が何らかの手続きであれば、それは手続きとして評価された上でリストが作成される。((lambda x x) + 3 4 5 6) => (<手続き+> 3 4 5 6)。(lambda (x) x)と書いた場合は、上記の仕様にしたがって実引数は一つでなければならず、((lambda (x) x) 3 4 5 6)ではラムダ式に渡るのは3のみである。((lambda x x) (+ 3 4 5 6))とすると引数(+ 3 4 5 6)が評価された上でリストに変換されてラムダ式に渡されるので、ボディの評価結果はリスト(18)である。((lambda (x) x) (+ 3 4 5 6))とした場合は一つの引数(+ 3 4 5 6)が評価された上でラムダ式に渡されるので、ボディxの評価結果は値18である(仮引数の形式の最初の項)。

(17)

訳注: このラムダ式の仮引数は(x y . z)でボディ(本体)の式はzである。

(18)

side effect: 値を返すというのが関数の定義であるが、関数が値を返すまでに行なう処理の過程で、値を返す以外の動作を関数の外に及ぼす場合にそれを副作用という。

(19)

訳注: このプログラム断片の評価結果は不定であるが、display関数が4 plus 1 equals 5を表示している。

(20)

shadow: シャドウ、シャドウイング。新しいバインディングによって以前のバインディングが、存在を続けながらも隠されて見えなくなること。

(21)

原文はhygienic---清潔な、衛生的な--。

(22)

section 5.1.4 手続きの<仮引数群>の形式参照。

(23)

Schemeは静的スコープと無限エクステントを持っている。gen-counterもgen-loserも、本体は局所変数nに初期値0をバインドした引数を持たないラムダ式で、さらにそのラムダ式の本体は内側のラムダ式である。局所変数nはSchemeが動いている限り手続き内部に(静的スコープ)存在し続け(無限エクステント)、呼び出されるたびに以前の呼び出しよりも1だけ増える。(gen-counter)は局所変数nを返し、(gen-loser)は定数27を返す。返す値が異なるので、(gen-counter)の呼び出しごとに、呼び出される手続きが異なるのはeqv?の定義上明らかである。一方(gen-loser)の手続き呼び出しでは常に定数27が返され、副作用もない。ただし内部変数nは手続きが呼び出されるごとに1だけ増えており、その点を見れば(gen-loser)も呼び出されるごとに異なる手続きと見なすこともできる。そのために評価値をunspecifiedとしているのであろう。処理系によって#fを返すものとunspecifiedを返すものとがある。

(24)

transitive: 例えば関係<の場合で、x1<x2かつx2<x3ならばx1<x3が成立する場合に、この関係を推移的であるという。

(25)

訳注: この式は(define f (lambda () (list 'not-a-constant-list)))に等価である(section 6.2 定義参照)。すなわちfは、呼び出されるたびにリスト(not-a-constant-list)を生成して返す手続きである。(define (g) '(constant-list))は、(define g (lambda () '(constant-list)))に等価である。すなわちgは定数リスト(constant-list)を返す手続きである。

(26)

訳注: fが返すリストのcarに3を代入している。unspedifiedはset-car!が返す値である。

(27)

訳注: 返される定数リストのcarに3を代入している。定数の書き換えは通常はエラーである。素直に代入を許す処理系もある。

(28)

リテラル性を確保したい部分をスラッシュなどで括る手法

(29)

uninterned symbol

(30)

order-preserving isomorphisms

(31)

例えば(list->string '(#\a #\b #\c))

(32)

memoizeという単語は辞書にないので推測になるが、Schemeが検索しやすい、もしくは取り出しやすい形式で記憶しておくということであろう。

(33)

訳注: a-streamは(next 0)を本体とするletrec式で、nextはラムダ式(lambda (n)(cons n (delay (next (+ n 1)))))にバインドされている。このラムダ式を評価すると、cons手続きによってcarがn、cdrがプロミスオブジェクトであるベアが作成される。このプロミスオブジェクトは、forceで呼び出された時に引数を1増加させて自分自身を再帰的に呼び出す手続きである。delayがなければ無限にnを増加させて自分自身を呼び出して終了しない。作成時のa-streamの値は(0 . プロミス)である。このcdrにforceを適用すると(tailがその手続き)、forceによってnが計算され、(0. プロミス(1 . プロミス))がconsによって作成される。内側のペアには最初のプロミスをforceで計算させて、はじめて到達できる。(force (プロミス (1. プロミス))) => (1 . プロミス)。内側のプロミスにさらにforceを適用すると、nが1増えてその内側にもう一つプロミスが作成される。(0 . プロミス(1 . プロミス(2 . プロミス)))。以下同様。

(34)

訳注: 手続きpはdelayで括られているので、pを再帰的に呼び出してcountを1進めるためにはforceでpを呼び出す必要がある。

(35)

訳注: ラムダ式の引数と本体が括弧で括られている。単に引数1つを返すラムダ式であれば(lambda (object) object)である。返す値が(object)の場合はobjectは手続きに評価される

(36)

訳注: 上記の仮引数exitとreturnにcall-with-current-continuationが作成する手続きが実引数として渡される

(37)

訳注: (lambda (a b) b)にはvaluesが渡した4と5が渡される

(38)

訳注: 引数なしで呼び出された(*)が返す値1が手続き(-)に渡される

(39)

原文がprocなので、エントリのthunkはprocの誤記と思われる。ただし後ろの文ではthunkが復活している。いずれ統一されるのであろう。thunkは引数を取らない手続きに使用されることが多い。


This document was generated on December, 22 2007 using texi2html 1.57.