[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 手続きを作る

Special Form: lambda formals body …

[R5RS] この式は評価されると手続きを生成します。この式が評価された時点の環境が手続き中に保持されます。 手続きが呼ばれると、記憶された環境に引数の束縛を追加した環境中でbody が順に評価され、 最後の式の値が返されます。

Formals は以下のいずれかの形でなければなりません。

 
(lambda (a b) (+ a b))
  ⇒ 二つの引数を加算する手続き

((lambda (a b) (+ a b)) 1 2)
  ⇒ 3

注: いくつかのSchemeの実装ではformalsの構文を拡張して、 CommonLispのように省略可能引数やキーワード引数などの表記を可能にしているものが あります。Gaucheには今のところそのような拡張はありません。

Macro: cut expr-or-slot expr-or-slot2 …
Macro: cute expr-or-slot expr-or-slot2 …

[SRFI-26] 手続きを簡潔に書ける便利なマクロです。 いわゆる部分適用を実現するために使えます。

expr-or-slotは式またはシンボル<>でなければなりません。 最後のexpr-or-slotはシンボル<...>であっても構いません。 cutは、そのフォーム中にある<>と同じ数の引数を取る lambdaフォームに展開されます。そのフォームのボディには次の式が置かれます。

 
  (expr-or-slot expr-or-slot2 …)

但し、各<>は対応する仮引数に置き換えられます。 もしシンボル<...>が与えられていた場合、展開されたlambdaフォームは 可変長引数を取る手続きとなり、作成される手続きに与えられたすべての引数が expr-or-slotを呼び出すのに使われます(下の4番目の例を参照のこと)。

 
(cut cons (+ a 1) <>)  ≡ (lambda (x2) (cons (+ a 1) x2))
(cut list 1 <> 3 <> 5) ≡ (lambda (x2 x4) (list 1 x2 3 x4 5))
(cut list)             ≡ (lambda () (list))
(cut list 1 <> 3 <...>)
   ≡ (lambda (x2 . xs) (apply list 1 x2 3 xs))
(cut <> a b)           ≡ (lambda (f) (f a b))

;; Usage
(map (cut * 2 <>) '(1 2 3 4))
(for-each (cut write <> port) exprs)

cutecutとほぼ同じですが、expr-or-slotに与えられた フォームが手続きを作る前に評価される点が異なります。

 
(cute cons (+ a 1) <>)
   ≡ (let ((xa (+ a 1))) (lambda (x2) (cons xa x2)))

Gaucheはまた、部分適用を行うpa$という組み込み手続きを持っています (See section コンビネータ参照)。

Macro: case-lambda clause …

[SRFI-16] それぞれの clause は (formals expr …) という形式 でなければなりません。ここで、formalslambda の仮引数 リストです。

この式は、評価されると可変数の引数をとり、lambda 式から結果として できる手続き同じレキシカルスコープをもつ手続きになります。この手続きが いくつかの引数とともに呼ばれると、formals と一致する引数に対応する 最初の clause が選択されます。この引数の一致というのは、 lambda 式の formals に対応するものとして指定されるものです。 formals の変数は実引数に束縛され、 expr … がその 環境内で評価されます。

実際の引数がどの clauseformals にも一致しなければエラーです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.