電卓を作ってみたい
男なら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かそれ以外でよかろ
欲しいもの:
値+型をセットで積む
後ろに型をおけば取り出す時に数えられる
プログラムカウンタの位置、その関数の最後の位置をポインタサイズで積む
関数一覧を積む
組み込み関数は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] |
+-*/ などは [call]plus[確定] への糖衣開閉器
関数名は携帯入力かな?