[xyzzy:04422] Re: xyzzy Reference
- Subject: [xyzzy:04422] Re: xyzzy Reference
- From: YAMAMOTO Shinji <sinj@xxxxxxxxxxxx>
- X-mailer: Denshin 8 Go V321.2b5
- X-yzzy-version: 0.2.0.131
服部さん、こんにちは。山本です。
In message "[xyzzy:04403] Re: xyzzy Reference"
HATTORI Masashi <hattori@xxxxxxxxxxxxxxxx> wrote:
> ちょっとへなちょこな私の手には余るのでどなたか説明書いて頂
> けるとありがたいんですが…。_(__)_
時間があったので lambda だけ書いてみました。
declaration はよく分かりません。確認してませんが、xyzzy には無いかも?
ちなみに、まだ倍風館のLISP本の1冊目の半分くらいしか読んでないので、
へなちょこでは、負けません。:)
あと、XML も適当ですが、よければ使ってやってください。m(__)m
<chapter>
<title>lambda</title>
<type>Misc</type>
<arguments>lambda-list docmentation-string body</arguments>
<package>lisp</package>
<description>
関数に名前を付ける必要がなく、手続きだけを記述したい場合にラムダ式
を用いる。ラムダ式の二番目の引数はラムダリストと呼ばれ、関数の
パラメータの名前を与える。lambda式のより完全な構文は以下である。
(lambda ({var}*
[&optional {var | (var [initform [svar]])}*]
[&rest var]
[&key {var | ({var | (keyword var)} [initform [svar]])}*
[&allow-other-keys]]
[&aux {var | (var [initform])}*])
[[{declaration}* | documentation-string]]
{form}*)
引数がラムダ式によって表される関数に適用されると、form が評価
されて最後の form の結果が返される。form は並列に評価される。
((lambda (x y) (+ x y)) 10 20) => 30
ラムダリストの各要素は、パラメータ指定子や、記号&(アンパサンド)
で始まるラムダリストキーワードからなる。ラムダリストは5つの部分で
構成される。
・必須パラメータの記述
ラムダリストキーワードよりも前に現れる var を必須パラメータという。
・オプショナルパラメータの記述
&optionalから次のラムダリストキーワードまでか、ラムダリストの
終わりまで。関数呼び出し時に、オプショナルパラメータに対応する
引数はあっても無くてもよい。引数が省略された場合、initform が
あれば initform に初期化され、無ければ nil で初期化される。
svar は引数が与えられたかどうかを示す。
((lambda (x &optional (y 0 given))
(if given (+ x y) x))
10 20)
=> 30
・レストパラメータの記述
&restとそれに続く一つのパラメータ指定子。関数への引数のうち、
必須パラメータとオプショナルパラメータに対応するもの以外
からなるリストが束縛される。
((lambda (x &optional (y 1) (z 2) &rest args)
(list x y z args))
'a 'b 'c 'd 'e 'f)
=> (a b c (d e f))
・キーワードパラメタの記述
&keyから次のラムダリストキーワードまでか、ラムダリストの
終わりまで。関数が呼ばれたときに対応する keyword に対応する
パラメータ指定子 var に値を束縛する。
((lambda (x &key ((:test f) #'eq))
(if (funcall f x "word") 'True 'False))
"word" :test #'equal)
=> True
((lambda (x &key (test #'eq))
(if (funcall test x "word") 'True 'False))
"word" :test #'eql)
=> False
・補助変数の記述
ラムダリストに &aux が含まれるなら、この後の全ての指定は
補助変数の指定子である。次に示す二つの例は同じ結果を与える。
これらの使用については純粋にスタイルの問題である。
((lambda (x &aux (l (length x)))
(list x l))
'(a b c))
=> ((a b c) 3)
((lambda (x)
(let ((l (length x))) (list x l)))
'(a b c))
=> ((a b c) 3)
</description>
<seealso>lambda-list-keywords</seealso>
<seealso>lambda-parameters-limit</seealso>
<section>プログラム構造</section>
<file></file>
</chapter>
--
山本真二 sinj@xxxxxxxxxxxx