2024/11/14 Rust.Tokyo Reject con

Hiroaki Yutani
Rust 製クリエイティブコーディングフレームワーク
→ コロナ禍で暇なので、nannou が中でやってることを調べて自分でやるか…
WebGPU API の Rust 実装 wgpu を使うためのチュートリアル
https://sotrh.github.io/learn-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!