Roc 言語
- カテゴリ:
- その他プログラミング言語
- コメント数:
- Comments: 0
◆ Elm より使いやすくなってそうなところも使いづらくなってそうなところもある
◆ HTML を扱うフロントエンドフレームワークというわけじゃなさそう
◆ HTML を扱うフロントエンドフレームワークというわけじゃなさそう
Elm の後継と言われてる言語です
先週か先々週くらいにはてなブックマークで人気に出ていて何か大きな更新があったのかなと思って後で見ようと思ってたのに忘れていて今になって見てみました
以前はドキュメントも整ってなくて 長い文章のページだけみたいな感じでしたが 公式サイトがきれいになってました
https://www.roc-lang.org/
まだドキュメントはあとで追記予定となってるところもありますが ウェブページ上で REPL が動いたり 以前よりも進化していました
ドキュメントが整ったら Elm とどう違うのか見てみようと思っていたので 簡単にチュートリアルを読んで気になったところを書いておきます
関数を使うか string interpolation という方法で文字列中の変数埋め込みみたいなことをします
をやるには
となります
Elm は Haskell がベースなので Haskell と同じく
という形で関数を宣言できました
別の方法としてラムダを使う方法もありました
Roc だとこのラムダの方だけしか使えません
また引数の間には , が必要です
ということはできません
次のように引数が足りないエラーです
The add function expects 2 arguments, but it got only 1
そのため List.map の関数も 1 つめの引数が関数ではなく リストになっていました
JavaScript でアロー関数を連続させるようなことをすればできなくはないですが 一気に呼び出す場合はカッコが気持ち悪くなります
add1 関数を作ろうと こうすると 現状だと add1 を作るところでエラーでした
(最新のビルドを使ってローカルで REPL を動かすと大丈夫でした)
definition と呼ばれるもので変数の代入とは違い あとから変更できません
タグは文字列みたいなもので それ自体が値です
また関数のように使い引数を渡すことでそれらの値を持つタグになります
この値は payload と呼ばれるようです
Rust の enum など関数型言語の型でよく見るものですね
ただ payload は自由につけれるようです
Elm では
みたいに型定義を事前にする必要があり その定義時に指定したデータ型しか持たせられません
このあたりは自由度が上がっていますね
それにたいして Roc は特に HTML を意識してるわけではないようです
普通の言語のようにビルドしてコマンドラインで実行する感じです
Rust で作られてるので WASM でのビルドもされていて ウェブページの REPL はこれで動いてるようでした
そういう立ち位置なので後継というのは言語の構文的な話であって Elm を置き換えるかというとそうでもないのかもしれません
Roc で動くウェブフロントエンドのフレームワークが出てきたらそういう使い方もできるのかもしれませんけど
個人的には Elm って Haskell みたいな言語構文が好きというよりは Redux の元にもなった Elm Architecture の考え方のほうが好きです
view はコンポーネントにせず完全にテンプレートを返す純粋関数になってるので React に比べてすごくすっきりしていますし
なので こういう普通の言語となると Elm というより比べる対象は Haskell になりそうで あまり使いそうにないかなと言う感想です
先週か先々週くらいにはてなブックマークで人気に出ていて何か大きな更新があったのかなと思って後で見ようと思ってたのに忘れていて今になって見てみました
以前はドキュメントも整ってなくて 長い文章のページだけみたいな感じでしたが 公式サイトがきれいになってました
https://www.roc-lang.org/
まだドキュメントはあとで追記予定となってるところもありますが ウェブページ上で REPL が動いたり 以前よりも進化していました
ドキュメントが整ったら Elm とどう違うのか見てみようと思っていたので 簡単にチュートリアルを読んで気になったところを書いておきます
文字列結合
Elm と違うところも多く 文字列結合は ++ では行えません関数を使うか string interpolation という方法で文字列中の変数埋め込みみたいなことをします
"foo" ++ "bar"
をやるには
"\("foo")\("bar")"
となります
関数
関数も違ってますElm は Haskell がベースなので Haskell と同じく
add x y = x + y
add 1 2
-- 3
という形で関数を宣言できました
別の方法としてラムダを使う方法もありました
add = \x y -> x + y
add 1 2
-- 3
Roc だとこのラムダの方だけしか使えません
また引数の間には , が必要です
add = \x, y -> x + y
add 1 2
# 3
カリー化されない
, が必要ということもあってデフォルトではカリー化されていませんadd1 = add 1
add1 2
# 3
ということはできません
次のように引数が足りないエラーです
The add function expects 2 arguments, but it got only 1
そのため List.map の関数も 1 つめの引数が関数ではなく リストになっていました
List.map [1, 2, 3] \num -> num * 2
JavaScript でアロー関数を連続させるようなことをすればできなくはないですが 一気に呼び出す場合はカッコが気持ち悪くなります
add = \x -> \y -> x + y
(add 1) 2
# 3
add1 関数を作ろうと こうすると 現状だと add1 を作るところでエラーでした
(最新のビルドを使ってローカルで REPL を動かすと大丈夫でした)
add1 = add 1
add1 2
# 3
よくある代入風の =
他には Elm/Haskell では一時変数がほしいときに let-in を使う必要がありましたが Roc だと使わず自然な感じで = を使えるのが便利ですdefinition と呼ばれるもので変数の代入とは違い あとから変更できません
addMax10 = \x, y ->
max = 10
added = x + y
if added > max then
max
else
added
addMax10 3 4
# 7
addMax10 8 9
# 10
タグ
小文字の名前だと def で大文字の名前だと tag になりますタグは文字列みたいなもので それ自体が値です
また関数のように使い引数を渡すことでそれらの値を持つタグになります
この値は payload と呼ばれるようです
Rust の enum など関数型言語の型でよく見るものですね
ただ payload は自由につけれるようです
» Foo 1
Foo 1 : [Foo (Num *)]
» Foo 2 3
Foo 2 3 : [Foo (Num *) (Num *)]
» Foo 1 {x:2} [3]
Foo 1 { x: 2 } [3] : [Foo (Num *) { x : Num * } (List (Num *))]
Elm では
type FooOrBar
= Foo
| Bar
value1 = Foo
みたいに型定義を事前にする必要があり その定義時に指定したデータ型しか持たせられません
このあたりは自由度が上がっていますね
HTML との関係
あと一番の違いですが Elm は React などのようなフレームワークと言語が統合されたもので 出力の基本は HTML でしたそれにたいして Roc は特に HTML を意識してるわけではないようです
普通の言語のようにビルドしてコマンドラインで実行する感じです
Rust で作られてるので WASM でのビルドもされていて ウェブページの REPL はこれで動いてるようでした
そういう立ち位置なので後継というのは言語の構文的な話であって Elm を置き換えるかというとそうでもないのかもしれません
Roc で動くウェブフロントエンドのフレームワークが出てきたらそういう使い方もできるのかもしれませんけど
個人的には Elm って Haskell みたいな言語構文が好きというよりは Redux の元にもなった Elm Architecture の考え方のほうが好きです
view はコンポーネントにせず完全にテンプレートを返す純粋関数になってるので React に比べてすごくすっきりしていますし
なので こういう普通の言語となると Elm というより比べる対象は Haskell になりそうで あまり使いそうにないかなと言う感想です