[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[R5RS] この式は評価されると手続きを生成します。この式が評価された時点の環境が手続き中に保持されます。 手続きが呼ばれると、記憶された環境に引数の束縛を追加した環境中でbody が順に評価され、 最後の式の値が返されます。
Formals は以下のいずれかの形でなければなりません。
(variable …)
: 手続きは決まった数の引数を取ります。
実引数がそれぞれ対応するvariableに束縛されます。
variable
: 手続きは不定個の引数を取ります。
実引数は新しいリストに集められて、そのリストがvaribleに束縛されます。
(variable_0 … variable_N-1. variable_N)
:
手続きは少なくともN個の引数を取ります。N個までの実引数は対応するvariable
に束縛されます。N個を越えた実引数は新しいリストに集められて
variable_Nに束縛されます。
(lambda (a b) (+ a b))
⇒ 二つの引数を加算する手続き
((lambda (a b) (+ a b)) 1 2)
⇒ 3
|
注: いくつかのSchemeの実装ではformalsの構文を拡張して、 CommonLispのように省略可能引数やキーワード引数などの表記を可能にしているものが あります。Gaucheには今のところそのような拡張はありません。
[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) |
cute
はcut
とほぼ同じですが、expr-or-slot
に与えられた
フォームが手続きを作る前に評価される点が異なります。
(cute cons (+ a 1) <>) ≡ (let ((xa (+ a 1))) (lambda (x2) (cons xa x2))) |
Gaucheはまた、部分適用を行うpa$
という組み込み手続きを持っています
(See section コンビネータ参照)。
[SRFI-16]
それぞれの clause は (formals expr …) という形式
でなければなりません。ここで、formals は lambda
の仮引数
リストです。
この式は、評価されると可変数の引数をとり、lambda
式から結果として
できる手続き同じレキシカルスコープをもつ手続きになります。この手続きが
いくつかの引数とともに呼ばれると、formals と一致する引数に対応する
最初の clause が選択されます。この引数の一致というのは、
lambda
式の formals に対応するものとして指定されるものです。
formals
の変数は実引数に束縛され、 expr … がその
環境内で評価されます。
実際の引数がどの clause の formals にも一致しなければエラーです。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.