R6RS:翻訳:R6RS:1.6 Procedures

R6RS:翻訳:R6RS:1.6 Procedures

1.6 手続き

定義は手続きを定義するのにも使うことができる。

(define (f x)
  (+ x 42))

(f 23)         ⇒ 65

手続きは、わずかに簡略化された、オブジェクト上の式の抽象化である。この例では、最初の定義は f と呼ばれる手続きを定義している(f x の周囲の括弧に注意。この括弧がこれが手続きの定義であることを示している)。式 (f 23) は手続き呼び出しであり、意味としては大雑把に、「(+ x 42) (手続きの本体部分)を、 x を 23 に束縛して評価する」ということを意味している。

手続きはオブジェクトであるため、他の手続きに渡すことができる。

(define (f x)
  (+ x 42))

(define (g p x)
  (p x))

(g f 23)         ⇒ 65

この例では、 g は p に f を束縛し、 x を 23 に束縛して評価される。これは (f 23) と等価であり、 65 に評価される。

実際に、 Scheme で前以って定義されている演算は構文ではなくその値が手続きである変数として提供されている。 + 演算は、例えば、他の多くの言語では特別な構文上の扱いを受けているが、 Scheme では一般の識別子であり、数値オブジェクトを加算する手続きに束縛されている。同様のことは * やその他のものにも言うことができる。

(define (h op x y)
  (op x y))

(h + 23 42)         ⇒ 65
(h * 23 42)         ⇒ 966

手続き定義だけが手続きを作成する方法ではない。 lambda 式はオブジェクトとして手続きを作成し、名前を指定する必要がない。

((lambda (x) (+ x 42)) 23)         ⇒ 65

この例の式全体は手続き呼び出しであり、 (lambda (x) (+ x 42)) は単一の数値オブジェクトを取り、それに 42 を加算する。


Last modified : 2008/11/07 22:24:38 UTC