電卓を作ってみたい
仕様
男ならRPN
関数とか使いたい
チューリング完全ぐらい当然
文法
Forth風でいいと思うが、ifが頂けないので、関数オブジェクトを扱えるようにしたい。
1 2 3 * +
10 sin
:fib dup 2 gt :noname dup 1 - fib swap 2 - fib +; :noname drop 1; if ;
型7つ: int5 int8 int16 int32 float function primitive-function
boolは0かそれ以外でよかろ
欲しいもの:
- add (2-1) +
- sub (2-1) -
- mul (2-1) *
- div (2-1) /
- mod (2-1) % -5
- pow (2-1) **
- sin (1-1) sin
- ld (1-1) load nth of stack
- st (2-1) store to nth of stack
- drp (a-) drop top of stack - 10
- dup (a-aa) duplicate
- ovr (ab-aba)
- swp (ab-ba)
- rot (abc-bca)
- nip (ab-b) -15
- tuk (ab-bab)
- 2dp (ab-)
- 2sw (abcd-cdab)
- gt (2-1)
- lt (2-1) -20
- eq (2-1)
- ne (2-1)
- if (abc-) aが真ならbをcal、偽ならcをcal
- lop (2-0) aが真な間、bをcal
- cal (1-0) aを実行 -25
- rst スタックと辞書をクリア
メモリ
データスタック
値+型をセットで積む
後ろに型をおけば取り出す時に数えられる
- int7
- 0b0+[7bit int] => 1byte
- int8
- 0b10000001 + int8 => 2byte
- int16
- 0b10000010 + int16 => 3byte
- int32
- 0b10000100 + int32 => 5byte
- float
- 0b10001000 + float => 5byte
- function
- 0b10010000 + ptr => 3byte
- primitive-function
- 0b11 + [function num(0-127)] => 1byte
コールスタック
プログラムカウンタの位置、その関数の最後の位置をポインタサイズで積む
辞書
関数一覧を積む
組み込み関数はROMに置きたい
struct {
char* name;
void(*func)(void);
} pfunc[] = [
{"add", &add},
...
];
関数名は3バイト制限、関数本体は256byte制限かな
名前(3byte) + 長さ(1byte) + 本体
closureは\0ではじまる部分に保存する
REPLのどこかでGCせにゃならんね。
ハードウエア
Atmega8かatmega88かatmega238あたり?
メモリ足りるかなぁ
表示
http://akizukidenshi.com/catalog/g/gP-02985/あたりを表示につかう。
入力中の値とスタックトップを表示するといいかんじだと思う。
16x2
デフォルト状態
±0000000000 ADD => スタックトップの値11桁 + スペース + 最後に実行した関数の名前
±0000000000 RDS => スタック2つ目の値11桁 + スペース + 入力待ち? + 関数定義中? + 関数スタック
入力待ち? キー入力可能かどうか(計算中はoff)
関数定義中? 関数定義中はdefボタンが効かない
関数スタック 普通は0、関数定義中は1、無名関数定義に入ったら+1される
数字入力中
±0000000000_ => 入力中の数字 + カーソル
±0000000000 RDS => スタックトップ値11桁 + スペース + 入力待ち? + 関数定義中? + 関数スタック
関数名入力中
abc 123 => 入力中の関数名 + マッチする候補
±0000000000 RDS => スタックトップ値11桁 + スペース + 入力待ち? + 関数定義中? + 関数スタック
ボタン
タクトスイッチを配置する
| [1] | [2abc] | [3def] | [+] | [call] | [rst/power] |
| [4ghi] | [5jkl] | [6mno] | [-] | [def] |
| [7pqrs] | [8tuv] | [9wxyz] | [*] | [lambda] |
| [0] | [.] | [確定] | [/] | [end] |
| [1] | [2abc] | [3def] | [+] | [call] | [rst/power] |
| [4ghi] | [5jkl] | [6mno] | [-] | [def] |
| [7pqrs] | [8tuv] | [9wxyz] | [*] | [closure] |
| [0] | [.] | [確定] | [/] | [end] |
+-*/ などは [call]plus[確定] への糖衣開閉器
関数名は携帯入力かな?