(rontolisp) docs

マクロ

表中の各マクロ名はそれぞれのページにリンクしています。各ページには、より詳しい説明と、ブラウザで評価できる実行可能な例があります。

マクロ構文説明
cond(cond (test1 body1...) ...)複数の節を持つ条件分岐。最初に真となったtestのbodyを返します
case(case key (k1 body1...) ((k2 k3) body2...) (otherwise body...))eql で比較したkeyによるディスパッチ。キーは評価されません。リストキーはいずれかの要素にマッチします。t/otherwise がデフォルトです。何もマッチしなければnilを返します
ecase(ecase key (k1 body1...) ((k2 k3) body2...))網羅的な case。デフォルト節はなく(t/otherwise は通常のキーです)、マッチしないキーは error を通知します
ccase(ccase key (k1 body1...) ...)ecase と同様。マッチしないキーは error を通知します。リスタートシステムがないため、これは ecase と同一です(訂正不可)
and(and expr1 expr2...)短絡評価のAND。最初のnilまたは最後の値を返します。(and)t を返します
or(or expr1 expr2...)短絡評価のOR。最初の非nil値またはnilを返します。(or)nil を返します
when(when condition body...)conditionが真のときbodyを評価し、それ以外はnilを返します
unless(unless condition body...)conditionがnilのときbodyを評価し、それ以外はnilを返します
dotimes(dotimes (var count result?) body...)var0..count-1 に束縛してbodyを評価します。result(またはnil)を返します
do(do ((var init step?)...) (end-test result...) body...)並列にステップする変数で反復します。end-test が真になったとき result フォームを返します
do*(do* ((var init step?)...) (end-test result...) body...)do と同様ですが、束縛とステップが逐次的(let* 形式)です。各init/stepフォームは今回の反復ですでに更新された変数を参照します
loop(loop for i from 1 to n collect (f i))ANSI loop の限定サブセット。数値/リストのステップ(for)、集約(collect/sum/count/...)、単純な制御節(while/repeat/when/finally/return)に対応します。完全な文法と制限事項はページを参照してください
prog1(prog1 first body...)すべてのフォームを順に評価し、first の値を返します
prog2(prog2 first second body...)すべてのフォームを順に評価し、second の値を返します
time(time form)form を評価し、経過実時間を標準出力に印字し(; Elapsed real time: N ms)、formの値を返します。N はインタプリタ/JVMではミリ秒の整数、WASMではミリ秒の浮動小数点です
psetq(psetq v1 e1 v2 e2 ...)並列代入。いずれかの変数に代入する前にすべての右辺が評価されます。nilを返します
typecase(typecase x (integer body...) (string body...) (t default...))x の型によるディスパッチ。サポートされる型名: integer, float, number, rational, string, symbol, keyword, cons, list, null, atom, character, hash-table, boolean(および t/otherwise)と、複合指定子 (or ...)/(and ...)/(not ...)/(member ...)/(eql ...)/(satisfies ...) および (integer 0 9) のような範囲付き数値型。何もマッチしなければnilを返します
etypecase(etypecase x (integer body...) (string body...))網羅的な typecase。デフォルト節はなく、どの節にも型がマッチしないオブジェクトは error を通知します
error(error "bad value: ~a" x), (error 'my-error :v x), (error obj)エラーを通知し、handler-case に捕捉されなければ実行を中止します。designator: リテラルの制御文字列(format と同じディレクティブ)、initarg 付きのクォートされたコンディション型シンボル(型付きコンディションを構築。define-condition:report がメッセージになります)、またはコンディションオブジェクト。インタプリタとJVMはメッセージとコンディションを保持する例外をスローし、WASMはトラップします。format と同様に関数値を持たないマクロです(#'error はサポートされません)
signal(signal 'my-condition :v x)非致命的なコンディションを通知します(designator は error と同じ): 確立済みの handler-case に送出され、なければ nil を返して継続します(WASM では常に nil)
handler-case(handler-case expr (type (var) body...)... (:no-error (v) body...))expr を評価し、通知されたエラーをコンディション型がマッチする最初の節にディスパッチします(マッチしなければ再送出)。:no-error は正常終了時に実行。インタプリタ/JVM。WASM ではコンパイルエラー
ignore-errors(ignore-errors form...)フォームの値、エラー通知時は nil。handler-case の糖衣。インタプリタ/JVM。WASM ではコンパイルエラー
setf(setf place value)一般化代入。placeとして car, cdr, nth, first..fourth, rest, caXXXr をサポートします
push(push item place)placeにあるリストの先頭にitemを追加します。新しいリストを返します
pop(pop place)placeにあるリストの先頭要素を取り除いて返します
remf(remf place indicator)placeにあるプロパティリストからキーと値のペアを取り除きます。見つかれば t、見つからなければ nil を返します
let*(let* ((x 1) (y x)) body...)逐次的な束縛。各initフォームは直前の束縛を参照します。ネストした let に展開されます
dolist(dolist (var list result?) body...)var を各要素に束縛してbodyを評価します。var をnilに束縛して result(またはnil)を返します
incf(incf place delta?)(setf place (+ place delta)) に展開されます。delta のデフォルトは1です。新しい値を返します
decf(decf place delta?)(setf place (- place delta)) に展開されます。delta のデフォルトは1です。新しい値を返します
format(format t "Hello ~a, ~d!~%" 'world 42), (format nil "~a" x)標準出力(t、nilを返す)または文字列(nil)への整形出力
with-open-file(with-open-file (s "f.txt" :direction :output) (write-line "hi" s))ファイルを開き、ストリームを s に束縛し、bodyを評価し、ファイルを閉じます。bodyの値を返します。サポートされるのは :direction オプション(:input がデフォルト、:output)と :element-type オプション('character がデフォルト、バイナリストリームには '(unsigned-byte 8))で、どちらもリテラルでなければなりません
check-type(check-type place typespec [string])place の値が指定された型でなければエラーをシグナルし、型に合致していれば nil を返します。ライト版: リスタートがないため place への再格納はありません
assert(assert test-form [(place...) [datum args...]])test-form が偽ならエラーをシグナルし、真なら nil を返します。place のリストは受理されますが無視されます(リスタートなし)
declare(declare declaration...)解析されるだけの no-op: nil に評価され、引数は評価も検証もされません
declaim(declaim declaration...)declare と同様の no-op(ファイルレベルの宣言用)
proclaim(proclaim declaration)declaim と同様の no-op(CL からの逸脱: マクロとして分類され、引数は評価されません)
the(the type form)form の値をそのまま返します。型はチェックされません
eval-when(eval-when (situation...) body...)本体を progn として評価します。すべての状況指定は「今評価する」として扱われます。トップレベルの本体はスプライスされ、ネストした defun/defmacro 定義も収集されます
flet(flet ((name lambda-list body...)...) body...)局所的な非再帰の関数束縛(Lisp-2: 呼び出し位置と #'name)。定義本体は同名の外側の関数を参照し、兄弟定義は見えません。ラムダリストは defun の拡張をサポートします
labels(labels ((name lambda-list body...)...) body...)flet と同様ですが定義同士が互いに見えます(再帰と相互再帰)
multiple-value-bind(multiple-value-bind (var...) values-form body...)変数をプロデューサフォームの値に束縛します。リテラルの (values ...) 呼び出し、多値の組み込み関数(floor ファミリ、gethashparse-integer)、(values ...) を返すユーザ関数は全ての値を供給します。余った変数は nil に束縛されます
multiple-value-list(multiple-value-list values-form)プロデューサの値をリストに集めます(multiple-value-bind と同様に認識)
multiple-value-call(multiple-value-call function values-form...)全てのプロデューサの全ての値を引数として関数を呼び出します。ユーザ関数の値も実行時に展開されて渡ります(CL からの逸脱: 特殊オペレータではなくマクロに分類)
nth-value(nth-value n values-form)プロデューサの n 番目(0 始まり)の値、なければ nil。multiple-value-list の上の nth に展開されます
make-instance(make-instance 'class-name :initarg value ...)defclass クラスのインスタンスを生成します(静的 CLOS サブセット)。クラス名はリテラルのクォートされたシンボルでなければなりません
slot-value(slot-value object 'slot-name)defclass インスタンスのスロットを読み取ります。setf 可能な place です。スロット名はリテラルのクォートされたシンボルでなければなりません
with-slots(with-slots (x (v y)) instance body...)インスタンスのスロット値を本体のために変数に束縛します(読み取り専用 lite: slot-value 上のただの let 束縛で、書き戻しなし)
rontolisp:with-arena(rontolisp:with-arena () body...)ボディを実行してその値を返し、非 GC WASM バックエンド(--no-gc)のメモリ再利用境界を名付けます。内部で確保されたものは終端でポップされ、ボディの値だけが残ります。他のバックエンドでは実際の GC が回収するため、単なる progn です

マクロは関数値を持ちません。#'cond(funcall 'setf ...) はエラーです。呼び出し位置でインライン展開される便利なアクセサや述語(first, rest, nth, second..fourth, 1+, 1-, zerop, plusp, minusp, evenp, oddp)は、関数値としても使用できる(#'first)ため 関数 に列挙されています。