Subsections

制御構造

条件文

and,orおよびcondは、Common Lispにおいてマクロとして知られているが、 EusLispではインタプリタ時の効率を改善するために特殊書式として実行される。



and &rest forms [特殊]

formは、NILが現れるまで左から右に評価される。 もし、全ての書式がnon-NILとして評価されるならば、 最後の値が返される。


or &rest forms [特殊]

formは、non-NIL値が現れるまで左から右に評価される。 そして、その値が返される。 もし、全ての書式がNILとして評価されるならば、NILを返す。


if test then &optional else [特殊]

ifは、1つのthenelse書式のみを持つことができる。 そこに多重書式を書きたいときは、prognを使って グループ化しなければならない。


when test &rest forms [マクロ]

ifと違って、 whenunlessは、多重書式で書くことを許可している。 testの評価がnon-NILのとき、whenは実行され、 評価がNILのとき、unlessは実行される。 もう一方で、これらのマクロはelse書式を追加することを 許可していない。


unless test &rest forms [マクロ]

(when (not test) . forms)と同等である。


cond &rest (test &rest forms) [特殊]

任意の数の条件項は、condの後に続けることができる。 それぞれの条件項において、最初の書式testが評価される。 もし、non-NILであったとき、その条件項の残りの書式は、続いて評価される。 そして、最後の値が返される。 もし、testのあとに書式がなかったならば、 testの値が返される。 testが失敗したとき、次の条件項はtestがnon-NIL評価されるかまたは 全ての条件項が尽きてしまうまで繰り返される。 条件項が尽きてしまった場合、condはNILを返す。


case key &rest (label &rest forms) [マクロ]

keylabelが一致した条件項について、 formが評価され、最後の値が返される。 keylabelの間の等価は、eqまたは memqで行われ、equalではない。


逐次実行とLet



prog1 form1 &rest forms [関数]

form1formsは、次々と評価され、 form1から返される値がprog1の値として返される。


progn &rest forms [特殊]

formは次々に評価され、最後のformの値が返される。 prognは特殊書式である。なぜなら、ファイルの最初に現れたとき 特別な意味を持つからである。 そのような書式がコンパイルされたとき、内部書式はすべて最初に現れた として見なす。 マクロがdefundefmethodの連続で拡張される場合、それが最初に 現われなければならないときに役立つ。


setf &rest forms [マクロ]

forms中の各formにおいて、第二要素を一般化変数である第一要素に割り当てる。


let (&rest (var &optional value)) &rest forms [特殊]

ローカル変数を生成する。 すべてのvalueは評価され、並行してvarに割り当てられる。すなわち、 (let ((a 1)) (let ((a (1+ a)) (b a)) (list a b))) の結果は (2 1)である。


let* (&rest (var &optional value)) &rest forms [特殊]

ローカル変数を生成する。 全てのvalueは次々に評価され、varに割り当てられる。すなわち、 (let ((a 1)) (let* ((a (1+ a)) (b a)) (list a b)))の結果は (2 2)である。


ローカル関数



flet (&rest (fname lambda-list &rest body)) &rest forms [特殊]
ローカル関数を定義する。


labels (&rest (fname lambda-list &rest body)) &rest forms [特殊]

ローカルなスコープとなる関数を定義する。 fletlabelsとの違いは、 fletで定義されたローカル関数は、その他の関数を参照または再帰できないが、 labelsは相互の参照を許可する。


ブロックとExit



block tag &rest forms [特殊]
return-fromによって脱出可能なローカルブロックを作る。 tagは、ローカルにスコープされ、評価されない。


return-from tag &optional value [特殊]

tagによって示されたブロックを脱出する。 return-fromは、関数やメソッドから脱出するときに使用される。 関数やメソッドは、その本体をすべて取り囲んだ部分をブロックとして 自動的に確定され、その関数またはメソッドの名前を付ける。


return &optional value [マクロ]

(return x)は、(return-from nil x)と同等である。 loop, while, do, dolist, dotimesは、暗黙的にNILと名前が付けられた ブロックとして確定されるため、これらの特殊書式と組み合わせて使用する。


catch tag &rest forms [特殊]

throwによって脱出または値を返すための動的なブロックを確定する。 tagは評価される。

全て見えるcatchtagは、sys:list-all-catchersから得ることができる。



throw tag value [特殊]

catchブロックから脱出またはvalueを返す。 tagvalueは評価される。


unwind-protect protected-form &rest cleanup-forms [特殊]

protected-formの評価が終った後、 cleanup-formが評価される。 unwind-protectの外側にブロックまたはcatch ブロックを作っても構わない。

return-fromthrowでさえ、そのようなブロックから 抜け出すためにはprotected-formの中で実行される。 cleanup-formは、評価されることが保証されている。 また、もしprotected-formが実行されている間にエラーが起こったならば、 cleanup-formはいつもresetによって実行される。



繰返し



while test &rest forms [特殊]

testがnon-NILと評価されている間、 formは、繰返し評価される。 whileは、formのまわりにNILと名付けられるブロックを自動的に確定する 特殊書式である。 returnは、そのループから抜け出すために使用することができる。 次のイテレーションへ飛ぶときためには後に紹介するtagbodygoを次のように使う:


(setq cnt 0)
(while
  (< cnt 10)
  (tagbody while-top
    (incf cnt)
    (when (eq (mod cnt 3) 0)
      (go while-top))  ;; jump to next iteraction
    (print cnt)
    )) ;; 1, 2, 4, 5, 7, 8, 10

tagbody &rest tag-or-statement [特殊]

tagは、goのために名付けられる。 tagbodyの中のみgoを使用することができる。


go tag [特殊]

ローカルにスコープされたtagbodyのなかに現れるtagの直後の 書式に制御を移す。 ローカルスコープを横切って違うtagbodyのtagに制御を移すことは 禁止されている。


prog varlist &rest tag-or-statement [マクロ]

progはマクロで、以下のように展開される。

 (block nil     (let varlist (tagbody  tag-or-statement))) 


do (&rest (var &optional optional init next)) (endtest &optional result) &rest forms [マクロ]

varはローカル変数である。 それぞれのvarに、initは並行に評価され、割り当てられる。 つぎに、endtestが評価され、もし真のときdoresultを返す。 (そうでないときは、NILを返す) もしendtestがNILを返したならば、それぞれのformは、 順番に評価される。 書式の評価後、nextが評価され、その値は それぞれのvarに再割当され、次の繰返しが始まる。


do* (&rest (var &optional optional init next)) (endtest &optional result) &rest forms [マクロ]

do*は、initnextの評価と varへの割り当てが連続的に起こることを除いて、doと同様である。


dotimes (var count &optional result) &rest forms [マクロ]

formsの評価をcount回行う。 countは、一回のみ評価される。 それぞれの評価の中で、varは整数のゼロから count-1まで増加する。


dolist (var list &optional result) &rest forms [マクロ]

listのそれぞれの要素は、varに連続的に与えられる。 そしてformsは、それぞれの値で評価される。 dolistは、他の繰返しより早く実行される。たとえば、 mapcarや再帰的関数のようなものより。 それは、dolistが関数のclosureを作ったり適用したりする必要が なく、新しいパラメータのバインドが必要でないため。


until condition &rest forms [マクロ]

conditionが満たされている間、formsを評価する。


loop &rest forms [マクロ]

formsを永遠に評価する。 実行を止めるためには、return-from, throwまたはgoformsのなかで評価されなければならない。


述語

Common Lispのtypepsubtypepはないので、 subclasspderivedpで疑似実現すること。



eq obj1 obj2 [関数]

obj1obj2が同じオブジェクトを指すポインタ あるいは同じ数値のときTを返す。 例えば:(eq 'a 'a)はT、(eq 1 1)はT、(eq 1. 1.0)はNIL、 (eq "a" "a")はNILである。


eql obj1 obj2 [関数]
EusLispの中で数値は全て直接値で表現されるため、eqeqlは 同一である。


equal obj1 obj2 [関数]
いろんな構造のオブジェクトの等価性をチェックする。オブジェクトは、文字列・ベクトル・ 行列などで再帰的に参照してないことが保証されなければならない。 obj1obj2が再帰的に参照されていたとすると、 equalは無限ループとなる。


superequal obj1 obj2 [関数]
superequalは、環状参照をチェックするので遅い。しかしロバストな等価が得られる。


null object [関数]

objectがNILのとき、Tを返す。 (eq object nil)を評価する。


not object [関数]
notは、nullと同一である。


atom object [関数]
オブジェクトがconsのインスタンスである時のみ、NILを返す。 (atom nil) = (atom '()) = T)
注意:vectors, strings, read-table, hash-tableなどに対しては、それらがどんなに 複雑なオブジェクトとなっていてもatomはTを返す。


every pred &rest args [関数]
全てのargspredについてTを返した時のみ Tを返す。everyは、predが全てのargsに対して効力があるかどうかを 検査する時に使用される。


some pred &rest args [関数]
argsのうちどれか1つがpredについてTを返したとき Tを返す。someは、predargsのどれかに対して効力があるかどうかを 検査する時に使用される。


functionp object [関数]
objectapplyfuncallで与えられる関数オブジェクトであるならTを返す。
注意:マクロはapplyfuncallを適用することができない。 functionpは、objectが、type=0のコンパイルコードか、関数定義を持つsymbolか、 lambda-formかあるいはlambda-closureであったとき、Tを返す。 Examples: (functionp 'car) = T, (functionp 'do) = NIL


compiled-function-p object [関数]
objectが、コンパイルコードのインスタンスであったとき、Tを返す。 そのコンパイルコードが関数かまたはマクロかを知るためには、 そのオブジェクトに:typeメッセージを送り、その返り値が functionmacroのどちらになっているかを調べる。


This document was generated using the LaTeX2HTML translator on Sat Feb 5 14:36:44 JST 2022 from EusLisp version 138fb6ee Merge pull request #482 from k-okada/apply_dfsg_patch