Skip to content

Instantly share code, notes, and snippets.

@y-taka-23
Last active July 22, 2023 07:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save y-taka-23/4753cc543a5263edba271bd48fbbd77c to your computer and use it in GitHub Desktop.
Save y-taka-23/4753cc543a5263edba271bd48fbbd77c to your computer and use it in GitHub Desktop.
Elm-jp 2023: Elm による大学入学共通テスト指南

Elm による大学入学共通テスト指南

共通テスト手順記述標準言語 (DNCL)

  • 現在は「情報関連基礎」の第 3 問で出題
  • 2025 年からは「情報」に変更、文法もマイナチェンジ
  • 日本語プログラミング言語
  • 数値、配列、基本的な制御構文、関数定義
  • 変数には型が付いていない

インタプリタの構成要素

  • 抽象構文木 (AST)
    • プログラムを Elm のデータ型として木構造で表現
  • 構文解析器 (Parser)
    • 文字列を抽象構文木に変換
  • 評価器 (Evaluator)
    • 抽象構文木を「計算」して出力を求める

構文解析器の実装

  • elm-parser ライブラリを使用
    • 使い方は Parsec と似ている
    • Parsec に比べてコンビネータが少なく自作の必要がある
    • do 構文がないため、基本は Applicative 的に書く
      • |=<$> 相当で、複数のパーサの結果を組にして返す
      • |. はパースした結果を捨てる(予約語や記号など)
      • 前の結果をさらに使う必要がある場合は Monadic に andThen で書く

評価器の実装 (1)

  • Tree-walk 型のインタプリタ
    • 基本的には AST を再帰的に評価する
  • Big-step 意味論と Small-step 意味論
    • Big-step: update の中で再帰的に eval して最終値を返す
    • Small-step: 1 ステップの update を Time.every で連続して呼び出し
  • 算術式や論理式は Big-step、文は Small-step
    • 文が Big-step だと無限ループを止める手段がない
    • 学習用オンライン実行環境だしステップ実行もやりたい
    • とはいえ式の細かい評価ステップまでは要らない

評価器の実装 (2)

  • その時点の継続を実行すべき文のリストとして保持
  • 先頭の文を見て文のリストを更新
    • if 文なら then または else の中身に置換
    • for 文ならループの中身を元のループの手前に追加

今後やりたいこと

  • ステップ実行
  • ユーザ定義関数【済】
    • コールスタック = 継続 + 変数の入れ子リスト
    • 関数呼び出しのタイミングで push
    • 一番上の継続が空になったら return
  • エディタ部分の改良
    • 現在は multiline フォームだが色がつけられない
    • contenteditable にすれば可能、しかし大変そう
    • 記号類が全角なので入力しづらい
  • コードの共有
    • Base64 エンコードして URL につける
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment