(rontolisp) docs
← 関数

rontolisp パッケージの関数

rontolisp パッケージは Common Lispの一部ではない 実装固有の関数を提供します。rontolisp: 修飾子で参照する(または (in-package rontolisp) の後に修飾なしで)使用してください。パッケージシステムについては パッケージ を参照してください。以下の各名前はそれぞれのページにリンクしています。

FunctionExampleResult
rontolisp:version(rontolisp:version)ビルド情報のプロパティリスト(:version, :build-timestamp, :git-commit, :git-branch)
rontolisp:random-bytes(rontolisp:random-bytes 16)暗号論的に強い乱数バイトのベクタ (SecureRandom / WASI random_get)
rontolisp:bfloat16-bits(rontolisp:bfloat16-bits 1.0)実数の bfloat16 ビットパターン。最近接偶数丸め (0〜65535)
rontolisp:bits-bfloat16(rontolisp:bits-bfloat16 16256)bfloat16 ビットパターンが表す浮動小数点数。65536 パターンすべてで厳密
rontolisp:float16-bits(rontolisp:float16-bits 1.0)実数の IEEE binary16 (f16) ビットパターン。最近接偶数丸め (0〜65535)
rontolisp:bits-float16(rontolisp:bits-float16 15360)f16 ビットパターンが表す浮動小数点数
rontolisp:widen-float-bits(rontolisp:widen-float-bits bits :float16 dst)パックされた (unsigned-byte 16) ベクタの f16/bfloat16 ビットパターンを、パックされた浮動小数点配列へ一括で拡張する
rontolisp:narrow-float-bits(rontolisp:narrow-float-bits src :bfloat16 dst)パックされた浮動小数点配列を、パックされた (unsigned-byte 16) ベクタの f16/bfloat16 ビットパターンへ一括で狭める
rontolisp:quantize(rontolisp:quantize w 'q8-0)パックされた浮動小数点行列をブロック量子化した重み行列に(ggml の Q8_0。32 要素ブロックごとに binary16 のスケールと int8 の量子 32 個)。vec:matvec が整数内積 GEMV を走らせる被演算子。インタプリタと JVM
rontolisp:dequantize(rontolisp:dequantize m 'single-float)量子化行列を、指定した要素型の新しいパック浮動小数点配列に展開する
rontolisp:make-quantized-matrix(rontolisp:make-quantized-matrix 'q8-0 '(rows cols))全要素ゼロの量子化行列。read-sequence が Q8_0 テンソルのバイト列で埋める宛先
rontolisp:quantized-rows(rontolisp:quantized-rows m '(3 1))指定した行だけをブロックごと集めた新しい量子化行列。1 行につき配列コピー 1 回で、逆量子化はしない。この型の subseq かつ linalg:take-rows
rontolisp:quantized-matrix-p(rontolisp:quantized-matrix-p m)値が量子化行列なら t((typep m 'rontolisp:quantized-matrix) でも可)
rontolisp:octets-to-string(rontolisp:octets-to-string #8@(72 105))packed な (unsigned-byte 8) ベクタをデコードし、そのバイト列が表す UTF-8 テキストを返す。全域的かつ寛容
rontolisp:string-to-octets(rontolisp:string-to-octets "Hi")文字列を UTF-8 としてエンコードし、packed な (unsigned-byte 8) ベクタとして返す
rontolisp:make-mutex(rontolisp:make-mutex)新しい相互排他ロック。不透明なハンドル(インタプリタと JVM では実体があり、WASM では no-op)
rontolisp:mutex-acquire(rontolisp:mutex-acquire m)このスレッドが mutex を保持するまでブロックし、それを返します(通常は rontolisp:with-mutex を使用)
rontolisp:mutex-release(rontolisp:mutex-release m)mutex の獲得を 1 回分解放し、それを返します
rontolisp:make-thread(rontolisp:make-thread fn bindings)引数なしの関数を実行する仮想スレッドを生成します。省略可能な (symbol . value) の動的束縛をその中に確立し、不透明なハンドルを返します(インタプリタと JVM。WASM のシムはエラーを通知)
rontolisp:join-thread(rontolisp:join-thread th)スレッドを待ってその関数の値を返します。スレッドが通知したエラーはここで再通知されます
rontolisp:threadp(rontolisp:threadp v)値がスレッドハンドルなら t
rontolisp:thread-alive-p(rontolisp:thread-alive-p th)スレッドが実行中の間 t(join 後は nil)
rontolisp:destroy-thread(rontolisp:destroy-thread th)スレッドに割り込みをかけ、ハンドルを返します
rontolisp:current-thread(rontolisp:current-thread)呼び出したスレッド自身のハンドル。スレッドごとに eq 安定です (make-thread で生成したスレッドに限らず任意のスレッドで動作します)
rontolisp:fetch(rontolisp:fetch "http://example.com/")HTTPリクエストを非同期に開始します。future を返します
rontolisp:futurep(rontolisp:futurep v)値が future(async-defun で定義した関数の呼び出し、rontolisp:fetch、rontolisp:stream-read などが返す値)なら t
rontolisp:streamp(rontolisp:streamp v)値が非同期ストリームなら t(ファイルストリームに答える cl:streamp とは別の述語)
rontolisp:make-stream(rontolisp:make-stream)新しいオープン状態の非同期ストリームを作成します。1 つの値が読み側と書き側の両端を持ちます
rontolisp:stream-read(rontolisp:stream-read s)ストリームの次のチャンク(終端では nil)で確定する future
rontolisp:stream-write(rontolisp:stream-write s "chunk")チャンク(nil は不可)を追加します。ストリームが受け付けた時点で確定する future を返します
rontolisp:stream-close(rontolisp:stream-close s)書き側をクローズします。バッファ済みチャンクは読み取り可能なままで、その後の read は終端を観測します
rontolisp:read-all(rontolisp:read-all s)残りのチャンクを 1 つの文字列に読み切った値で確定する future (オクテットチャンク -- HTTP ボディストリームのもの -- は UTF-8 デコード)
rontolisp:wait-for(rontolisp:wait-for 100)指定ミリ秒後に nil で確定する future。cl:sleep の非同期版の対応物
rontolisp:then(rontolisp:then f (lambda (v) (* 2 v)))future に対する変換を値として付与します。成功チャネル上に新しい future を返します (JavaScript の .then)
rontolisp:then*(rontolisp:then* f #'1+ #'1+)rontolisp:then の可変長チェーン糖衣。各関数は 1 つ前の段の平坦化された値を受け取ります
rontolisp:catch(rontolisp:catch f (lambda (c) :fallback))future に対するエラー時フォールバックを値として付与します (JavaScript の .catch)。cl:catch/throw とは別物
rontolisp:finally(rontolisp:finally f (lambda () (cleanup)))成功・エラーどちらの経路でも走る後始末 thunk。元の結末はそのまま通過します
rontolisp:http-handler(rontolisp:http-handler 'handle 8080)Clack の環境 plist を受け取り (status headers body) を返すハンドラ関数でHTTPリクエストを処理します(ブロッキングサーバ。--component では wasi:http コンポーネント)
rontolisp:json-parse(rontolisp:json-parse "{\"n\": 1}")JSON文字列をパースします(jzon互換): オブジェクトは文字列キーのハッシュテーブル、配列はベクタになります
rontolisp:json-stringify(rontolisp:json-stringify (vector 1 2))値をJSON文字列にシリアライズします(ハッシュテーブルとCLOSインスタンスはオブジェクト、リストとベクタは配列)
rontolisp:plist-hash-table(rontolisp:plist-hash-table (list :n 1))プロパティリストからハッシュテーブルを構築します(alexandria:plist-hash-table のサブセット)。JSONオブジェクトに便利です
rontolisp:hash-table-plist(rontolisp:hash-table-plist h)ハッシュテーブルのペアのプロパティリスト(alexandria:hash-table-plist のサブセット)
rontolisp:alist-hash-table(rontolisp:alist-hash-table al)連想リストからハッシュテーブルを構築します(alexandria:alist-hash-table のサブセット)
rontolisp:hash-table-alist(rontolisp:hash-table-alist h)ハッシュテーブルのペアの連想リスト(alexandria:hash-table-alist のサブセット)
rontolisp:alist-plist(rontolisp:alist-plist al)連想リストのキー・値を順序を保ったままプロパティリストにします(alexandria:alist-plist のサブセット)
rontolisp:plist-alist(rontolisp:plist-alist pl)プロパティリストのキー・値を順序を保ったまま連想リストにします(alexandria:plist-alist のサブセット)
rontolisp:tcp-connect(rontolisp:tcp-connect "127.0.0.1" 7777)ブロッキングTCP接続を開きます。双方向ストリームハンドルを返します
rontolisp:tcp-listen(rontolisp:tcp-listen 7777), (rontolisp:tcp-listen 0 "127.0.0.1")リスニングTCPソケットをバインドしてリスナーハンドルを返します。ポート 0 は空きエフェメラルポートを選びます
rontolisp:tcp-accept(rontolisp:tcp-accept listener)クライアント接続を待ちます (ブロッキング)。双方向ストリームハンドルを返します
rontolisp:tcp-local-port(rontolisp:tcp-local-port listener)リスナーまたはソケットが実際にバインドされているローカルポート
rontolisp:tcp-local-address(rontolisp:tcp-local-address listener)リスナーまたはソケットがバインドされているローカルIPアドレス(文字列)
rontolisp:tcp-peer-address(rontolisp:tcp-peer-address sock)接続済みソケットのリモートIPアドレス(文字列)
rontolisp:tcp-peer-port(rontolisp:tcp-peer-port sock)接続済みソケットのリモートポート
rontolisp:tcp-set-timeout(rontolisp:tcp-set-timeout sock 5000)読み取りデッドラインをミリ秒で設定します(nil で解除)。タイムアウトした読み取りは捕捉可能なエラーを通知します
rontolisp:tls-connect(rontolisp:tls-connect "example.com" 443)暗号化(TLS)クライアント接続を開きます。tcp-connect と同じ種類のストリームハンドルを返します
rontolisp:tls-listen(rontolisp:tls-listen "server.p12" "changeit" 8443)PKCS12キーストアから暗号化リスニングソケットをバインドします。tcp-accept で受け付けます
rontolisp:tls-listen-pem(rontolisp:tls-listen-pem "cert.pem" "key.pem" 8443)PEMの証明書/鍵ファイルから暗号化リスニングソケットをバインドします
rontolisp:tls-upgrade(rontolisp:tls-upgrade sock "example.com")接続済みのストリームハンドルをクライアントとしてTLSでラップします。新しいストリームハンドルを返します
rontolisp:wasm-export(rontolisp:wasm-export 'fact :params '(:int) :returns :int)WASMコアモジュールへのコンパイル時に defun をホストから呼び出し可能にします
rontolisp:jvm-export(rontolisp:jvm-export 'fact :params '(:s64) :returns :s64)JVMクラスへのコンパイル時に、defun の型付きでJavaから呼び出し可能なstaticメソッドを宣言します
rontolisp:wasm-import(rontolisp:wasm-import 'add :from "host" :params '(:int :int) :returns :int)WASMコアモジュールへのコンパイル時に、ホスト関数をLispから呼び出し可能として宣言します
rontolisp:wit-export(rontolisp:wit-export "greeter.wit" :world greeter)プログラムがWIT worldを実装していることを宣言します。worldのエクスポートはプログラムの defun と照合され、型はWITから得られます
rontolisp:wit-import(rontolisp:wit-import "store.wit" :interface "wasi:keyvalue/store@0.2.0" :package kv)プログラムがWITインターフェースを呼び出すことを宣言します。宣言された各関数が通常のLisp関数(kv:bucket-get)として束縛され、インタプリタ/JVMではプロバイダに、Preview 1ではWASMインポートに、--component ではホストをプロバイダとする canon lower 済みのコンポーネントモデルインポートに向かいます
rontolisp:wit-provide(rontolisp:wit-provide "wasi:keyvalue/store@0.2.0" #'my-store)wit-import したインターフェースの実装をインタプリタとJVMバックエンドで束縛します(WASMではホストが供給するため無効化されます)

rontolisp:fetch は外向きのHTTPリクエストを開始して future を返し、rontolisp:await がそれを解決します。全体像は HTTPリクエストガイドを、オプション、結果plist、バックエンドのサポート、制限については fetch、 await、 futurep のリファレンスページを参照してください。rontolisp:http-handler は fetch の受信側で、Clack の環境 plist と (status headers body) レスポンスリストを使ってハンドラ関数でHTTPリクエストを処理します。各バックエンドでの実例は HTTPサーバガイドを、バックエンドのサポートと制限は http-handler のリファレンスページを参照してください。rontolisp:json-parse と rontolisp:json-stringify はJSONドキュメントとLispの値を相互変換します(com.inuoe.jzon 互換の軽量サブセット。fetchレスポンスボディのパースなどに使えます)。値の対応と制限については json-parse と json-stringify のリファレンスページを参照してください。tcp関数(rontolisp:tcp-connect / tcp-listen / tcp-accept / tcp-local-port およびアドレスアクセサ)は素のTCPソケットを開き、そのハンドルには標準のストリーム関数(read-line / write-line / read-byte / write-byte / close)がそのまま使えます。echoサーバーの実例は TCPソケットガイドを、バックエンドのサポートと制限は tcp-connect、 tcp-listen、 tcp-accept、 tcp-local-port のリファレンスページを参照してください。既存のCommon Lispコードとの互換のために、これらの上にusocket互換シムが用意されています。TLS版(rontolisp:tls-connect / tls-upgrade / tls-listen / tls-listen-pem)は同じストリームハンドルをTLSで包みます。 tls-connect、 tls-upgrade、 tls-listen、 tls-listen-pem のリファレンスページを参照してください。rontolisp:wasm-export、rontolisp:jvm-export、rontolisp:wasm-import、rontolisp:wit-export、rontolisp:wit-import はコンパイル時ディレクティブです。jvm-export は wasm-export のJVM版の双子 — コンパイルされたクラス上の型付きでJavaから呼び出し可能なエントリポイント — です(jvm-export)。WITの2つは .wit ファイルを境界の唯一の真実の源とするため、型を手書きすることはありません。wit-export はプログラムがWIT worldを実装していることを宣言し(--scaffold-wit はそこから実装のスケルトンを生成します)、wit-import はWITインターフェースを呼び出すことを宣言して、インターフェースが宣言する各関数を通常のLisp関数として束縛します。インタプリタとJVMバックエンドではプロバイダ(rontolisp:wit-provide)へ、Preview 1 WASMでは rontolisp:wasm-import へ、--component では canon lower 済みのコンポーネントモデルのインスタンスインポートへローワリングされ(後者2つではホストがプロバイダになります)、1つのソースがすべてのバックエンドで動きます。rontolispはどのインターフェースについてもプロバイダを同梱していません。同梱しているのはプロバイダの仕組みであって、個々のインターフェースが何であるかは知らないため、WITインターフェースの実装は通常のLispコードです。WITの result のerrorアームは rontolisp:wit-error コンディションをシグナルし、そのペイロードは rontolisp:wit-error-payload で読みます。 wasm-export、 wasm-import、 wit-export、 wit-import、 wit-provide のリファレンスページ、および WebAssemblyへのコンパイル ガイドを参照してください。