2024/11/14 Rust.Tokyo Reject con
Hiroaki Yutani
Rust 製クリエイティブコーディングフレームワーク
→ コロナ禍で暇なので、nannou が中でやってることを調べて自分でやるか…
WebGPU API の Rust 実装 wgpu を使うためのチュートリアル
著者と bot を除いていちばんコントリビュートしてる!(主にタイポ修正とかですw)
R は動的プログラミング言語
数値型や文字列型はすべてベクトル(配列)
欠損値という概念がある(後述)
GC がある(後述)
SEXP
(S-EXPression)という opaque pointer を介してアクセスでき、SEXP
を引数に取る C API が用意されている注:説明のため、欠損値や GC の考慮は省略
R のセッションとやり取りする変数は、すべて SEXP
になる
allocVector()
: 指定した型の SEXP
を作成する API。ここでは長さ 1 の実数型を作成。
REAL()
: SEXP
に紐づいた実際のデータ(f64
の配列)へのポインタを取り出す API
asReal()
: SEXP
のデータを f64
に変換する API(整数型でも実数型でも受け付けられるように)
extern "C"
で C ABI の関数を書き、それに対応する C のヘッダファイルも用意するR の欠損値は、Rust にとっては通常の値
i32::MIN
"NA"
という文字列へのポインタi32::MIN
(tribool なので内部的には i32 になっている)たとえば、R だと NA は伝播するが
Rust 側で NA
を考慮せずそのまま足すと、 1 + i32::MIN
(= -2147483647
)になってしまう
R_IsNA()
など欠損値を判定する API があるので、都度それを使うようにする
PROTECT()
などの API で明示的に GC から守る必要があるUNPROTECT()
で protect を解除するPROTECT()
をうっかり忘れると変なバグの原因になってしまうので、自動で呼び出されるようにした方がいいnew()
するときに PROTECT()
して、impl Drop
で UNPROTECT()
する)いったいどうすれば…
R_UnwindProtect()
R_UnwindProtect()
R_ContinueUnwind()
で元の R のエラー処理フローに戻る、ということができるlongjmp した先でエラーを投げて、
それをキャッチして R_ContinueUnwind()
にトークンを渡して R のエラー処理に戻る
いったいどうすれば…
R の C API を呼ぶ C コードを書き Rust から呼ぶ
install.packages()
という関数でパッケージをインストールできる= The Comprehensive R Archive Network
CRAN の CI のマシン一覧
ん…?
これは…
cargo vendor
する必要がある→ パッケージを配布したいだけなら CRAN を使う必要はもうない
既存のライブラリの軽量なバインディング
→ 主要な用途はだいたい C/C++ のライブラリでカバーされているので、C/C++ で書けばいい
ゼロから実装
→ たぶん多くの人に使ってもらうのが目的なので、R より Python 化した方がいい
Enjoy!