- TL;DR: オンライン実行環境作ってるよ (WIP)
- https://github.com/y-taka-23/dncl-playground
- https://elm-jp.connpass.com/event/280401/
- 現在は「情報関連基礎」の第 3 問で出題
- 2025 年からは「情報」に変更、文法もマイナチェンジ
- 日本語プログラミング言語
- 数値、配列、基本的な制御構文、関数定義
- 変数には型が付いていない
- 抽象構文木 (AST)
- プログラムを Elm のデータ型として木構造で表現
- 構文解析器 (Parser)
- 文字列を抽象構文木に変換
- 評価器 (Evaluator)
- 抽象構文木を「計算」して出力を求める
- elm-parser ライブラリを使用
- 使い方は Parsec と似ている
- Parsec に比べてコンビネータが少なく自作の必要がある
do
構文がないため、基本は Applicative 的に書く|=
が<$>
相当で、複数のパーサの結果を組にして返す|.
はパースした結果を捨てる(予約語や記号など)- 前の結果をさらに使う必要がある場合は Monadic に
andThen
で書く
- Tree-walk 型のインタプリタ
- 基本的には AST を再帰的に評価する
- Big-step 意味論と Small-step 意味論
- Big-step: update の中で再帰的に eval して最終値を返す
- Small-step: 1 ステップの update を Time.every で連続して呼び出し
- 算術式や論理式は Big-step、文は Small-step
- 文が Big-step だと無限ループを止める手段がない
- 学習用オンライン実行環境だしステップ実行もやりたい
- とはいえ式の細かい評価ステップまでは要らない
- その時点の継続を実行すべき文のリストとして保持
- 先頭の文を見て文のリストを更新
- if 文なら then または else の中身に置換
- for 文ならループの中身を元のループの手前に追加
- ステップ実行
- ユーザ定義関数【済】
- コールスタック = 継続 + 変数の入れ子リスト
- 関数呼び出しのタイミングで push
- 一番上の継続が空になったら return
- エディタ部分の改良
- 現在は multiline フォームだが色がつけられない
- contenteditable にすれば可能、しかし大変そう
- 記号類が全角なので入力しづらい
- コードの共有
- Base64 エンコードして URL につける