Redという言語はご存じでしょうか。可読性が高いシンタックスを持ち、ワンバイナリーをクロスコンパイルでき、かつ、クライアント用のUIコンポーネントを標準ライブラリに備えたプログラミング言語です。その野心的な挑戦にすぐに虜になりました。新年早々の恋です。
というわけで、年明け見つけたRedがシンプルだったので使ってみました。題材は以前つくったEmacsライブラリ「esa.el」の移植です。
構文がすなおなので特にエディタは関係なさそうでしたが、慣れ親しんでるEmacsに「Skrylar/red.el」を適用しました。その際、 red-font-lock-keywords
と red-indent-line
に足りない箇所があったのでオーバーライドしました。
RedはコマンドラインREPLがつかえるので、 docs.red-lang.org とRed 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はイテレーター構文なので、関数の入れ子による可読性低下をおさえるため変数定義をよく使います。個人的には変数は意味のあるものだけ使いたい派なので、パイプを導入しました。といっても、フロントエンドの場合、データ加工はあまりやらないのでつかうケースはほぼありませんでした。あってもこのくらいです。
;-- before
rejoin collect [
foreach d data [
keep rejoin [d " "]
]
]
;-- after
data .[
|> Series/map 'd [rejoin [d " "]]
|> rejoin
]
今回は上で実装したライブラリ「red-elixir」のほかにHTTPリクエスト・JSONパーサーライブラリを使っています。ライブラリパッケージはインストールはgit submodulesで良いですが、呼び出しも考えると実装が冗長的になるのでパッケージ管理とタスクランナーをあわせて用意しました(nabinno/hot、nabinno/mods)。
タスクランナーインストール後、パッケージのインストールから呼び出しまでの流れ
RedはGoとおなじくワンバイナリーなので、wgetやcurlだけでインストールが完了します。
> 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を参考にタスクランナー管理ファイル内に定義します。
> 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
を使います。
> 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]
クライアントソフトを作る中で感じたことは、この1点です。Redは既存のフレームワークと比べるとまだまだ機能不足感が拭えませんが、それを補えるだけの表現力を持っていました。手触りが本当に良い言語でした。
テクノロジーの進化は、絶え間ない変化の中で私たちの日常を塗り替えてきました。時には経済的な危機が、新たな可能性を切り拓く契機となることもあります。そこで、過去のリセッション期に生まれたテクノロジーの足
ATKerneyの課題解決パターン は、課題の本質を見極め、効果的な戦略的構造化を通じて解決策を導き出す手法にフォーカスしています。この冒険の旅は、解決者と協力者たちが心を一つにし、課題に立ち向かう様
私はいわゆる就職氷河期世代です。周囲から時折漏れ聞こえる不平のような言葉がありますが、それを単なる不平として片付けるのはもったいない気がします。できれば、その中に新しい視点を見つけ、次のチャンスへ繋げ