私はスタック指向の仮想マシンを作成しているので、それがどのように機能するかについての一般的な理解のためにForthを学び始めました。次に、仮想マシンに実装する必要のある重要なスタック操作操作をリストしました。
drop ( a -- )
dup ( a -- a a )
swap ( a b -- b a )
rot ( a b c -- b c a )
次の4つのスタック操作操作を使用して、他のスタック操作操作をシミュレートできると思います。例えば:
nip ( a b -- b ) swap drop
-rot ( a b c -- c a b ) rot rot
tuck ( a b -- b a b ) dup -rot
over ( a b -- a b a ) swap tuck
とは言っても、スタックを操作するために必要な基本的なスタック操作操作をすべてリストしたかどうかを知りたかったのです。
私が実装する必要のあるより基本的なスタック操作操作はありますか?それがないと、私の仮想マシンはチューリング完全ではありませんか?
多くのスタックベースの言語もroll
を使用します。これは、スタック内の任意の数の要素に対する一般化されたrot
です。また、スタックを逆方向に回転させるための逆の操作も実装します。
roll
はrot
よりも基本的だと思います。
私はTuringnessについては答えがありません。
ブレント・カービーは、スタック操作の計算的に完全な数々のベースを彼の 連結理論の理論 で確立しています。スタック用語の「引用」の概念が必要です。彼の命名法を使用すると、次のコンビネーターのセットはすべてチューリング完全です。
[B] [A] cons == [[B] A]
[B] [A] sip == [B] A [B]
[B] [A] k == A
[D] [C] [B] [A] s' == [[D] C] A [D] B
[B] [A] k == A
[B] [A] cake == [[B] A] [A [B]]
[B] [A] k == A
[E] [D] [C] [B] [A] j' == [[D] A [E] B] [C] B
[A] i == A
[B] [A] take == [A [B]]
[B] [A] cat == [B A]
[A] i == A
[B] [A] cons == [[B] A]
[B] [A] sap == A B
私の好みの命名法を使用すると、実装するのに便利な完全なセットは次のとおりです。
A dup == A A
A B swap == B A
A drop ==
A quote == [A]
[A] [B] compose == [A B]
[A] apply == A