Open8

Roc lang as usual

hatahata

Elm inspired でコンパイルターゲットとしてネイティブバイナリとwasmをサポートしている。

ブラウザで使う wasm がどれくらいいけるのか、情報が少なくよく分からない。

Tutorial:
https://www.roc-lang.org/tutorial

hatahata

Mac のコンパイラは Linker がまだ良いやり方を実装してなくて、 Win や Linux よりかなり遅いらしい。

https://www.roc-lang.org/install

macOS: There are no known compatibility issues, but the compiler doesn't run as fast as it does on Linux or Windows, because we don't (yet) do our own linking like we do on those targets. (Linking works similarly on Linux and Windows, but the way macOS does it is both different and significantly more complicated.)

macOS:既知の互換性の問題はありませんが、コンパイラは Linux や Windows ほど高速には動作しません。これは、これらのターゲットで行うような独自のリンクを (まだ) 行っていないためです。(リンクは Linux と Windows で同様に機能しますが、macOS でのリンクの方法は異なりものすごく複雑です。)

とはいえ Windows でよく使われているかというとそうでもなく、Mac と Linux の使用者が多いそう。

hatahata

まだ Homebrew などは対応していないのだけどビルドする必要はなくて、tar を DL してきて展開してパスに置く。

Apple Silicon のインストール手順 → https://github.com/roc-lang/roc/blob/main/getting_started/macos_apple_silicon.md

Roc のコンパイルターゲットを増やす場合は Rust の環境や Zig の環境が追加で必要になる。が、チュートリアルをしたり言語を楽しむだけならそれらは特に不要。後から作業してもいい。

hatahata

再代入が禁止されているのは分かるけど、再代入数と panick して repl が落ちるのまだアーリーな言語という感じがして良い。

$ roc repl   

  The rockin' roc repl
────────────────────────

Enter an expression, or :help, or :q to quit.

» greeting = "Hello"

"Hello" : Str
» greeting = "Hi!"
thread 'main' panicked at 'not yet implemented', crates/compiler/mono/src/ir.rs:2744:23
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

hatahata

How (memory) safe is zig?

Roc は GC がないけどメモリ管理されているらしい。 GC ではない(たぶん非同期での独立した、stop the world をともなうようなものではない)メモリ管理、という意味なのかな。

There are also promising experiments with non-garbage-collected managed languages. Eg both val and roc feature deterministic memory management and c/rust-like levels of control over memory layout while still preserving the simple experience of a garbage-collected language. I think it's likely that we'll see at least one production-ready language in this vein within the next decade.

ガベージコレクションではないメモリ管理をする言語についても有望な実験が存在します。例えば、 valroc は決定論的なメモリー管理と c/rust のようなレベルのメモリーレイアウトの制御を特徴としているが、ガベージコレクション言語のシンプルな体験を依然として維持しています。私は今後10年以内に、このような流れの中で、少なくとも1つは production-ready な言語が登場する可能性があると思います。

hatahata

開発環境

公式ドキュメントの記述 → https://www.roc-lang.org/install#editor-extensions

VSCode Extension

https://marketplace.visualstudio.com/items?itemName=IvanDemchenko.roc-lang-unofficial

Language Server

本家をフォークしたこのリポジトリのこのフォルダの README に従ってビルドする → https://github.com/ayazhafiz/roc/blob/lang-srv/crates/lang_srv/README.md

git clone -b lang-srv https://github.com/ayazhafiz/roc.git
cd ./roc/crates/lang_srv/
cargo build -p roc_lang_srv --release

warning は出るけどビルドは通る。

$ cargo build -p roc_lang_srv --release
info: syncing channel updates for '1.71.1-aarch64-apple-darwin'
info: latest update on 2023-08-03, rust version 1.71.1 (eb26296b5 2023-08-03)
info: downloading component 'cargo'
# ...(省略)...
warning: field `module_id` is never read
   --> crates/lang_srv/src/analysis.rs:154:5
    |
153 | struct RootModule {
    |        ---------- field in this struct
154 |     module_id: ModuleId,
    |     ^^^^^^^^^
    |
    = note: `#[warn(dead_code)]` on by default

warning: method `module_id` is never used
   --> crates/lang_srv/src/analysis.rs:278:12
    |
273 | impl AnalyzedDocument {
    | --------------------- method in this implementation
...
278 |     pub fn module_id(&self) -> Option<ModuleId> {
    |            ^^^^^^^^^

warning: variants `TypeVariable` and `Parameter` are never constructed
  --> crates/lang_srv/src/analysis/tokens.rs:50:5
   |
25 |         pub enum Token {
   |                  ----- variants in this enum
...
50 |     TypeVariable => "typeParameter",
   |     ^^^^^^^^^^^^
51 |     Parameter => "parameter",
   |     ^^^^^^^^^
   |
   = note: this warning originates in the macro `tokens` (in Nightly builds, run with -Z macro-backtrace for more info)

warning: `roc_lang_srv` (bin "roc_ls") generated 3 warnings
    Finished release [optimized] target(s) in 2m 55s

$ du -h ../../target/release/roc_ls
 16M	../../target/release/roc_ls

できたバイナリをパスの通った場所に置く。自分の場合は以下に。

cp ../../target/release/roc_ls ~/bin/

VSCode Extension の設定

以下の設定を settings.json に追加。roc_ls にパスが通っていない場合は、ちゃんとしたファイルパスを記載。

  "roc-lang.language-server.exe": "roc_ls",
  "editor.formatOnSave": true  # Roc ファイルの保存時に自動で format したい場合
hatahata

https://www.roc-lang.org/tutorial#records より

Note: Some other languages have a concept of "identity equality" that's separate from the "structural equality" we just described. Roc does not have a concept of identity equality; this is the only way equality works!

注:他のプログラミング言語には、先ほど説明した "structural equality" とは別に "identity equality" という概念を持つものがある。Rocには identity equality という概念は存在しない!

Records 間の同一性比較 == は常に、その構成フィールドの再帰的な同一性 == で定義されるということのようだ。

補足:Roc の Records は Object と違ってメソッドをはやしたりはできない。