eshlk
eshlk
embedなshell likeな言語を作りたい、という事で、まずは名前を決めてみた。eshlkという名前にする。 自作アプリ(の予定)。 TypeScriptで作る(予定)。
embed用のシェルのような何かで考えたもの。
Nushellみたいなシンタックスの文字列を渡すとJavaScriptにトランスパイルするものを作りたい。 JavaScriptはRhinoで動く範囲で。 RhinoやNodeからトランスパイルしてevalする感じで実行していく。
コマンドライン的に使えるように、statementが終わっていない状態もちゃんと扱えるものを作りたい。
AndroidとPCで同じスクリプトを使いたい。
slogみたいな事をしている時に簡単なシェルスクリプトを書いたりしたい。
目標とするスクリプト
以下を動かすのを目標とする
ui_cd
ls *.md | each {|f|
let title = read_lines $f | first | replace '# *' ''
let date = $f.name | replace '-.*' '' | replace '_' ''
{title: $title, date: $date, file: $f}
} | ui_select | get file | ui_editor
作業ログ
作業したメモを書く場所。
2026-10-01 (木)
lsのastがなんとなく出来たのだが、globの実装が面倒だなぁ、という事に気づく。 当初はトランスパイラを作りたいな、とぼんやり思っていたが、そろそろその辺をちゃんと考える必要がありそう。
トランスパイラであれbackendを環境ごとに実装する単なるインタプリタであれ、結局lsとかglobを実装していく事には違いは無いので、 まずはlsとかglobを実装していくにあたり何をライブラリとして共通に提供して何を環境ごとに用意するかを考えていく必要があるよな。
なるべくeshlkとしてはライブラリ的に使うような切り口を考えたい。
2026-09-28 (月)
Nushellの理解が深まったので実装を少し進めている。 LiteParseはそれっぽく動いた。
とりあえず、
ls *.md
のfull parseを動かそう。そのためにはglob patternとstringのone ofを対応する必要があるか。
2026-09-26 (土)
なんとなくトークナイザを書き始める。何を作ったらいいのか良く分からないので目標とするスクリプトを眺めてみよう。
まず最初のコマンドで後のパースが変わる、というのがeshlkの特徴なので、普通の言語処理系みたいにparseってやるとIRがばーんと帰って来るんじゃなくて、 expr単位とかそういう単位で細かくパースしていきたい。
とりあえず以下を動かそう。
ls *.md
まず最初のトークンを見ていろいろ判断するのが良さそう 何がありえるかな?
- knownなコマンド
- let
あれ、この二つだけか。 いや、exprな事もたぶんあるよな。
ちょっとNushellのドキュメントでも読みなおすか。