Roc lang as usual
Elm inspired でコンパイルターゲットとしてネイティブバイナリとwasmをサポートしている。
ブラウザで使う wasm がどれくらいいけるのか、情報が少なくよく分からない。
Tutorial:
Mac のコンパイラは Linker がまだ良いやり方を実装してなくて、 Win や Linux よりかなり遅いらしい。
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 の使用者が多いそう。
まだ Homebrew などは対応していないのだけどビルドする必要はなくて、tar を DL してきて展開してパスに置く。
Apple Silicon のインストール手順 → https://github.com/roc-lang/roc/blob/main/getting_started/macos_apple_silicon.md
Roc のコンパイルターゲットを増やす場合は Rust の環境や Zig の環境が追加で必要になる。が、チュートリアルをしたり言語を楽しむだけならそれらは特に不要。後から作業してもいい。
Roc という名前のは神話上の鳥の名前らしい。
再代入が禁止されているのは分かるけど、再代入数と 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
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.
ガベージコレクションではないメモリ管理をする言語についても有望な実験が存在します。例えば、
val
とroc
は決定論的なメモリー管理とc
/rust
のようなレベルのメモリーレイアウトの制御を特徴としているが、ガベージコレクション言語のシンプルな体験を依然として維持しています。私は今後10年以内に、このような流れの中で、少なくとも1つは production-ready な言語が登場する可能性があると思います。
開発環境
公式ドキュメントの記述 → https://www.roc-lang.org/install#editor-extensions
VSCode Extension
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 したい場合
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 と違ってメソッドをはやしたりはできない。