On Blahfe

イケてるしヤバい言語REBOLの後継Redでクライアントソフトをつくった話

blog/frontendredesa

Redという言語はご存じでしょうか。可読性が高いシンタックスを持ち、ワンバイナリーをクロスコンパイルでき、かつ、クライアント用のUIコンポーネントを標準ライブラリに備えたプログラミング言語です。その野心的な挑戦にすぐに虜になりました。新年早々の恋です。

thumbnail

PROBLEM

  • クロスプラットフォーム用のクライアントソフトをつくるにあたり
    • 重たいフレームワークが多い
    • 汎用的な言語をつかってるものが多く、そのためライブラリー等の依存関係が多くなりやすい

SOLUTION

というわけで、年明け見つけたRedがシンプルだったので使ってみました。題材は以前つくったEmacsライブラリ「esa.el」の移植です。

やったこと

エディター

構文がすなおなので特にエディタは関係なさそうでしたが、慣れ親しんでるEmacsに「Skrylar/red.el」を適用しました。その際、 red-font-lock-keywordsred-indent-line に足りない箇所があったのでオーバーライドしました

糖衣構文の適用

RedはコマンドラインREPLがつかえるので、 docs.red-lang.orgRed by Exampleをみながらひとつひとつ挙動を確認しました。その中でどうしても慣れない表現が2つあったので糖衣構文を実装しました。

1. compose

ブロック内の変数を評価しブロックとして返す関数 compose は、VIDのフェイス更新によく使われます。HTML/JavaScripでいうところDOM更新にあたるものといえば分かるでしょうか。頻繁に「 compose [foo (bar)] 」のような表現がつづくとほかの変数や関数とまざり可読性がおちるので、Elixirのシジルを参考に compose 関数を省略しました。こんな感じです。

;-- before
compose [foo (bar)]

;-- after
~c[foo (bar)]

2. 関数の入れ子

素のRedはイテレーター構文なので、関数の入れ子による可読性低下をおさえるため変数定義をよく使います。個人的には変数は意味のあるものだけ使いたい派なので、パイプを導入しました。といっても、フロントエンドの場合、データ加工はあまりやらないのでつかうケースはほぼありませんでした。あってもこのくらいです。

red
;-- before
rejoin collect [
    foreach d data [
        keep rejoin [d "  "]
    ]
]

;-- after
data .[
    |> Series/map 'd [rejoin [d "  "]]
    |> rejoin
]

タスクランナーの用意

今回は上で実装したライブラリ「red-elixir」のほかにHTTPリクエスト・JSONパーサーライブラリを使っています。ライブラリパッケージはインストールはgit submodulesで良いですが、呼び出しも考えると実装が冗長的になるのでパッケージ管理とタスクランナーをあわせて用意しました(nabinno/hotnabinno/mods)。

タスクランナーインストール後、パッケージのインストールから呼び出しまでの流れ

RedはGoとおなじくワンバイナリーなので、wgetやcurlだけでインストールが完了します。

sh
> mkdir -p ~/.local/bin
> wget https://github.com/nabinno/hot/releases/download/0.0.3/hot-linux -O ~/.local/bin/hot
> chmod 744 ~/.local/bin/hot

パッケージ管理はElixirのmixを参考にタスクランナー管理ファイル内に定義します。

sh
> hot cmd/install https://raw.githubusercontent.com/nabinno/mods/master/mods.red
> cat hots.red
Red []

hots: context [
    mods: [
        red-elixir #(init: %init.red git: https://github.com/nabinno/red-elixir)
        json #(init: %json.red git: https://github.com/rebolek/red-tools)
        http-tools #(init: %http-tools.red git: https://github.com/rebolek/red-tools)
    ]
]
> hot mods/get

ビルド時は #include をつかうのでパッケージ呼び出し機能は使えないですが、コマンドラインREPLで挙動確認している際は do/args %require を使います。

sh
> red
>> do/args %require [red-elixir]
>> 1 .. 10 .[
    |> Series/map 'i [i * 2]
    |> Series/map 'i [i + 1]
]
== [3 5 7 9 11 13 15 17 19 21]

WRAPUP

クライアントソフトを作る中で感じたことは、この1点です。Redは既存のフレームワークと比べるとまだまだ機能不足感が拭えませんが、それを補えるだけの表現力を持っていました。手触りが本当に良い言語でした。

nabinno
Emacsianでアート好き、ランニング好きな@nabinnoが書いています
GitHub / X / LinkedIn / ネクイノ
blog/market

今後の成長分野:新たなテクノロジーの展望

テクノロジーの進化は、絶え間ない変化の中で私たちの日常を塗り替えてきました。時には経済的な危機が、新たな可能性を切り拓く契機となることもあります。そこで、過去のリセッション期に生まれたテクノロジーの足

market-trendrecession
blog/organization

ATKerneyの課題解決パターンの魅力的な探求

ATKerneyの課題解決パターン は、課題の本質を見極め、効果的な戦略的構造化を通じて解決策を導き出す手法にフォーカスしています。この冒険の旅は、解決者と協力者たちが心を一つにし、課題に立ち向かう様

problem-solvingatkerney
blog/market

就職氷河期とは何だったのか

私はいわゆる就職氷河期世代です。周囲から時折漏れ聞こえる不平のような言葉がありますが、それを単なる不平として片付けるのはもったいない気がします。できれば、その中に新しい視点を見つけ、次のチャンスへ繋げ

labor-economicsrecessionemployment-ice-age