(rontolisp) docs

仕様との差異

  • 末尾呼び出しは WebAssembly とインタプリタでは真に末尾になり、JVM ではループに変換できる場合だけです。 WebAssembly にコンパイルした場合(-o prog.wasm、--component)とインタプリタで実行した場合 (rontolisp prog.scm、REPL)、末尾位置のすべての呼び出しは一定のスタックで実行されます。 JVM でそうなるのは、名前付き let、do、末尾位置での自己呼び出し、および末尾位置での 手続きどうしの相互呼び出し(even?/odd?、状態機械、評価器の eval/apply)のうち、 ファイルのトップレベル手続きどうし、一つの本体の内部定義どうし、一つの letrec の lambda 束縛どうしのものです。手続き値(引数、変数、apply)を通した末尾呼び出しは、そこでは スタックを消費します。引数経由で自分を呼ぶ手続きは、JVM にコンパイルした場合、その 16 MiB の スタック上で深さ約 16,000 でオーバーフローします(-Drontolisp.stack で上げられます)。
  • call/cc は脱出専用です。 継続は、その call/cc の実行中に 1 回だけ呼べます。 再突入はないため、ジェネレータやコルーチンは作れず、dynamic-wind の before は ちょうど 1 回だけ実行されます。
  • call-with-values は、両引数が lambda 式として書かれているとき直接束縛になります。 それ以外の形はリストを経由します。
  • 例外は巻き戻しの後で捕捉されます。 guard は本体を抜けた後で節を実行するため、 どの節も選ばれなければ guard からオブジェクトを再び発生させます。外側のハンドラは本体の raise-continuable を再開できません。with-exception-handler のハンドラは raise、 raise-continuable、error の場所で実行されますが、組み込み手続きのエラーでは thunk を抜けた後で実行されます。WebAssembly では範囲外の文字列添字は検査されません(終端を 超えた string-ref は文字を返します)。捕捉されない error は メッセージと irritant を、捕捉されない raise はそのオブジェクトを表示してプログラムを 終了します。
  • パラメータオブジェクトを引数付きで呼ぶとエラーです。Gauche は値を設定します。eval の 中の parameterize は名前を挙げて拒否されます。
  • どの節も受け付けない個数の引数で case-lambda を呼ぶと、エラーオブジェクトが raise されます。eval の中の case-lambda は名前を挙げて拒否されます。
  • ポートはテキストかバイナリのどちらか一方で、両方ではありません: 文字列ポートの binary-port? は #f です(Gauche のポートは両方です)。標準のポートはテキストポート なので、read-u8、write-u8 などのバイナリ手続きにはバイトベクタポートかバイナリの ファイルポートの引数が必要です。char-ready? と u8-ready? は常に #t を返します。
  • with-input-from-file と with-output-to-file は、脱出や raise されたオブジェクトを 含め、thunk をどう抜けてもファイルを閉じます(Gauche は開いたままにします)。出力用に 開けないファイルは、R7RS のとおり file-error? が #t を返すエラーを raise します。
  • レコードは Common Lisp の #S(...) 構文で表示されます。equal? はレコードを同一性で 比較します。本体の中の define-record-type は書かれた場所ごとに 1 つの型を作り、本体 を実行するたびに新しい型を作ることはしません(Gauche は後者です)。
  • write は 'x を (quote x) と、未規定値を #!unspecific と表示します。未規定値は 1 つのオブジェクトで、条件としては真です。
  • exit は囲んでいる dynamic-wind の after を実行してから、そのステータスでプロ セスを終了します; その場で終了するのは emergency-exit のみです。
  • 複素数はありません: (sqrt -4)、(log -1)、(asin 2) は手続き名を挙げたエラーで プログラムを終了します。
  • エラーメッセージには Common Lisp の名前(CAR)が出ます。
  • utf8->string は、正しい UTF-8 の列を始めないバイトをエラーにせず、そのバイト値を コードとする文字に復号します。
  • ファイルとしてのライブラリは、プログラムを開始したファイルと同じ場所だけから探され、 検索パスはありません。ファイルに書いた define-library はそのファイルからしか見えず、 並べて load したファイルは .sld ファイルとしてしかそのライブラリを見つけられません。 エクスポートしたマクロのテンプレートが使う名前のうち、ライブラリが定義もインポートもしない ものは、マクロを使う場所での意味になります。ライブラリが定義したレコード型は、名前の前に ライブラリ名を付けて表示されます。1 つの名前を 2 つのライブラリからインポートしても 拒否されず、後の import が優先されます。
  • cond-expand はプログラムを読む時点で、すべてのバックエンドに共通の機能に対して判定されます。 (features) はオペレーティングシステムやプロセッサを含みません。どの節も成り立たず else も ない cond-expand はエラーです。eval の中では、(library ...) は標準ライブラリに対してだけ 成り立ちます。

未対応

その他のライブラリ。それらの import は、ファイルを読む時点で名前を挙げて拒否されます。