コンテンツにスキップ

エージェントと作る

エージェントはファイルを書き、返ってきたものを読みます。 何往復かかるか、自分の間違いに自分で気付けるか、人が横で見ている必要があるかは、返ってくるものが決めます。

若草のコマンドは、その返事が読みやすいように作ってあります。 三つのうち二つはコンパイラを起動せず、ウィンドウも開きません。 三つが答えるのは別々のことです。 この書き方を受け取れるか、この画面はどうなるか、リリースしたアプリも同じ動きをするか。

端末での一回分。エージェントが app.rb を書き、wakakusa check が直し方を示して断り、同じ check が今度は何も言わず、ウィンドウなしの実行が画面をテキストで出力し、wakakusa gate が両方の実行で同じ画面になったと報告する。どの答えもテキストなので、エージェントはそれを読んでまた回る

端末での一回分。エージェントが app.rb を書き、wakakusa check が直し方を示して断り、同じ check が今度は何も言わず、ウィンドウなしの実行が画面をテキストで出力し、wakakusa gate が両方の実行で同じ画面になったと報告する。どの答えもテキストなので、エージェントはそれを読んでまた回る

三つのコマンド、三つの答え

wakakusa check:この書き方を受け取れるか

$ ./bin/wakakusa check app.rb
app.rb:5:19: Wakakusa cannot take this — `text` has no `weight:`. It takes a11y_label, align, animate, background, bold, border_color, border_radius, border_width, col_span, color, disabled, easing, enter, exit, grow, height, italic, max_lines, max_width, min_width, mono, padding, role, row_span, size, text, theme, tooltip, underline, width, wrap
    text("hello", weight: 700.0)
                  ^

断りを file:line:col の形で出力し、その行を下に添えます。 受け取れるアプリには、何も出しません。 コンパイラを起動しないので、答えは 0.1 秒ほどで返ります。

出るのは「だめだ」だけではありません。 どう直すかが、直す場所の行と一緒に出ます。 一覧は若草が断る書き方にあり、どう書くとそうなるかも並べてあります。

ウィンドウなしの実行:これは何を描くか

$ PIXIE_SCRIPT="click:+1,dump" ./bin/wakakusa run app.rb
Column(spacing=12, padding=16)[Text(count: 0, fontSize=34), Row(spacing=8)[Button(+1), Button(+10), Button(reset)], TextField(), Text(hello, )]
Column(spacing=12, padding=16)[Text(count: 1, fontSize=34), Row(spacing=8)[Button(+1), Button(+10), Button(reset)], TextField(), Text(hello, )]
Column(spacing=12, padding=16)[Text(count: 1, fontSize=34), Row(spacing=8)[Button(+1), Button(+10), Button(reset)], TextField(), Text(hello, )]

PIXIE_SCRIPT があるとき、run はウィンドウを開きません。 木を組み、手順のとおりに動かして、画面を文字にして出力します。 最初に一度、dump のたびに一度、最後に一度です。 これも 0.7 秒ほどで、やはりコンパイラは起動しません。

「押したボタンが思ったとおりに効いたか」の答えがこれで、画面がなくても読めます。 使える手順の一覧は検証と配布にあります。

キャンバスに描くものなら、WAKAKUSA_FRAMES=<dir> が一手ごとに PNG を書き出します。 絵を描くのはウィンドウが使うのと同じ raster なので、エージェントは自分が描いたものを読むだけでなく、見ることもできます。

wakakusa gate:リリースしたアプリも同じことをするか

$ ./bin/wakakusa gate app.rb --script "click:+1,dump"
GATE OK — 3 dump lines identical in both runs

これはコンパイルするので、2 秒ほどかかります。 一区切りついたところで示す証明であって、一回の編集ごとに走らせるものではありません。

食い違ったときは、その場所を示します。

GATE FAILED — the two runs diverge:
  cruby:    Text("total: 3")
  compiled: Text("total: 0")

正しいのは cruby: の行です。 その実行が本物のインタプリタだからです。 食い違いはコンパイルされた実行の側の不具合で、すでに分かっているものは二つの実行に挙げてあります。

一続きの作業として

$ ./bin/wakakusa check app.rb                       # 断りが出る。その場で直す
$ ./bin/wakakusa check app.rb                       # 何も出ない
$ PIXIE_SCRIPT="click:add,dump" ./bin/wakakusa run app.rb   # 画面を読む
$ ./bin/wakakusa gate app.rb --script "click:add,dump"      # 二つの実行が一致する

はじめの三つはどれも 1 秒かかりません。 だから編集のたびに走らせる価値があります。 最後の一つが約束にあたるもので、作業が終わったと言う前に走らせます。

エージェントに渡すもの

三つのページを、この順で渡します。

  • 最初のアプリとツアーの続き。 言語そのものが、出会う順に並んでいます。
  • 若草が断る書き方。 代わりにどう書くかと、それぞれが実際に出力する文面です。
  • 要素。 すべての要素と、そのキーワード、型、既定値です。 エンジンが作られるのと同じ表から生成しています。

これを読んでおけば、断られてから直すという手戻りが減ります。

先に伝えておくとよい二つ

ビューは読むだけです。 いちばん多い断りは、view の中の書き換えです。 状態が変わるのはハンドラで、ビューはそのあとの状態から組み直されます。

要素のブロックは、繰り返しの中に書けません。 書き換え方はいつも同じ形です。 行に必要なものを引数に取るメソッドを作り、繰り返しからそれを呼びます。