えだまめです
今回は初めてプログラミング言語を実装してみたので紹介します
意味論の学習用に作っただけなので名前はありません
できることもほとんどありません
扱うデータは整数と関数のみです
構文をBNFで表すと以下のようになります
\begin{eqnarray}
\langle number\rangle &::=& \cdots |-1\ |\ 0\ |\ 1|\cdots \\\\
\langle alphabet\rangle &::=& a\ |\ b\ |\cdots |\ z \\\\
\langle variable\rangle &::=& \langle alphabet\rangle \ | \ self \\\\
\langle expression\rangle &::=& \langle number\rangle \\
&|& \langle variable\rangle \\
&|& (+ \ \langle expression\rangle \ \langle expression\rangle) \\
&|& (- \ \langle expression\rangle \ \langle expression\rangle) \\
&|& (* \ \langle expression\rangle \ \langle expression\rangle) \\
&|& (let \ \langle alphabet\rangle \ \langle expression\rangle \ \langle expression\rangle) \\
&|& (lam \ \langle alphabet\rangle \ \langle expression\rangle) \\
&|& (\langle expression\rangle \ \langle expression\rangle) \\
&|& (iz \ \langle expression\rangle \ \langle expression\rangle \ \langle expression\rangle) \\\\
\langle program\rangle &::=& \langle number\rangle \ | \ \langle variable\rangle \ | \ \langle expression\rangle
\end{eqnarray}
\( \langle number\rangle \)
ただの整数
\( \langle variable\rangle \)
ただの変数
selfは関数内での自身の関数を指す
\((+ \ e_1 \ e_2)\)
\(e_1\text{と}e_2\)の足し算(-,*はそれぞれ引き算、掛け算)
\((let \ x \ e_1 \ e_2 )\)
変数\(x\)に\(e_1\)の結果を束縛
\((lam \ x \ e)\)
\(x\)を引数にとる関数
\((e_1 \ e_2)\)
\(e_1\)に\(e_2\)の結果を適用(正格評価)
\((iz \ e \ e_t \ e_f)\)
式\(e\)の結果が0の時\(e_t\)それ以外の時\(e_f\)
この構文にしたがって、以下のようなプログラムを記述することができます
(let x (+ 2 3) (* x x))
結果: 25
(let f (lam x (iz x 1 (* x (self (- x 1))))) (f 6))
結果: 720
できることは全然少ないけど、初めてだし階乗とかフィボナッチ数くらいは計算できるから許して
ソースはここ
https://github.com/r-edamame/lam
余裕があれば意味論周りのもっと詳しいことを書きます