fsharp 初めるのにいい題材は無いかと探索していたら、 Desktop版の WGPU の FSharp サンプルを発見。

Windows11 上の .Net8 で動作したので、これでやってみることにした。

WGPU.Native/examples/FSharp at main · ginger-code/WGPU.Native
Low-level wgpu-native bindings for .NET . Contribute to ginger-code/WGPU.Native development by creating an account on GitHub.
WGPU.Native/examples/FSharp at main · ginger-code/WGPU.Native favicon https://github.com/ginger-code/WGPU.Native/tree/main/examples/FSharp
WGPU.Native/examples/FSharp at main · ginger-code/WGPU.Native

改造写経して、fsharp と wgpu を少し理解。

GitHub - ousttrue/wgpu_fsharp
Contribute to ousttrue/wgpu_fsharp development by creating an account on GitHub.
GitHub - ousttrue/wgpu_fsharp favicon https://github.com/ousttrue/wgpu_fsharp
GitHub - ousttrue/wgpu_fsharp
  • Windows11 動いた
  • Ubuntu:23.10(wayland) swapchain 作成クラッシュ。code 139
  • Ubuntu:22.04(X11) 動いた

FSharp ではまる

少しずつ慣れていきつつ。

関数引数の tuple と () 有無でひっかかる

複数引数は tuple にするべきか否か。 とりあえず、 member は tuple にするという方針した。

fsproj のソースの順番に意味がある

動く

<ItemGroup>
<Compile Include="GlfwUtil.fs" />
<Compile Include="Program.fs" />
</ItemGroup>

コンパイルエラー。

<ItemGroup>
<Compile Include="Program.fs" />
<!-- プログラムからGlfwUtil が見えない! -->
<Compile Include="GlfwUtil.fs" />
</ItemGroup>

まさかこんなところに罠が・・・

member呼び出しは括弧で囲む

obj.member()
// じゃなくて
(obj.member())
// が必要な場合がある?

nvim

=, = だと indent が壊れる

lsp とか使う。

Ionide-vim: 文字列中で ] をタイプすると自動で変な indent になる

よくわからなかった。 Ionide-vim の使用は休止して、lspconfig の fsautocomplete が動くようにした。 Sytax Highight がよわよわになった。後で調べる。

vulkan よりだいぶ楽

WGPU は今年になってから Desktop の chrome で利用可能になったばかりなので、 まだ Android に来るのは少し時間がかかるかもしれないが、 Quest と Apple のVision Pro とかあの辺りから意外と速く動くようになるような気がするので、 仕込みを開始する・・・。

browser 上の wgpu だとOS 毎の Surface…Device…Swapchain の初期化が browser 任せになるのでもっと簡単になる。