1 of 10

Kmkm

プログラミング言語処理系が好きな人の集まり

定期ミートアップ 第1回

2021.05.30

岡本和樹

2 of 10

動機

  • マイコンプログラミングしたいぞ
  • でも C は書きたくないぞ
    • 型検査がゆるゆる
    • 代数的データ型がない
    • パターンマッチがない
  • 言語から作るか

3 of 10

代替

  • Rust
    • Rust コンパイラーの本流に AVR 対応が入ったりしている
    • とはいえまだまともに使えない
      • リリースビルドでコンパイラーが死ぬ(試したとき)
    • 世にはいろんな種類のマイコンがある
      • それぞれにコンパイラーが対応する必要がある

4 of 10

前提

  • C を出力すればすべてのマイコンをサポートできる(だろう)
  • 8ビットマイコンはヒープを使わないのでは?
    • スタックだけ
    • リージョン推論とかも要らない

5 of 10

方針

  • 代数的データ型とパターンマッチ
  • pure / impure 関数の区別
  • 線形型

6 of 10

代数的データ型とパターンマッチ

おなじみ

(define

passenger

(list

(person

(list

(class uint)))

(pet

(list

(species uint)))))

(match

passenger

(list

(case

(person

(list

(var class)))

(foo))

(case

(pet

(list

(var species)))

(bar))))

7 of 10

pure / impure 関数の区別

Haskell でいうところの a と IO a

(bind

const

(function a int (function b int a))

(function int (function int int))

(list))

(bind

echo

(procedure

(list

(assign a readLine)

(term (apply writeLine a))))

(procedure unit)

(list))

8 of 10

線形型

一度しか使えない値の型 → メモリー領域を再利用していい

(bind

foo

(A.new 4 0 f)

Int

(list

(bind

f

(function1 a (Array Int)

(match (A.update 0 1 a)

(list (case (var a')

(match (A.get 0 a')

(list (case (tuple (Ur v)

(var a'')) (lseq a'' v))))))))

(list))))

A.update :: Word →

a →

Array a

Array a

1つめの Array a は1回しか使わないので同じ領域を Array a に再利用できる

9 of 10

進捗

代数的データ型

できた

パターンマッチ

まだ

pure 関数

できた

impure 関数

まだ

線形型

まだ

パラメーター多相

まだ

アドホック多相

まだ

10 of 10

情報

  • リポジトリー
  • 進捗ツイート