連結言語には、さまざまなアリティの関数を作成できることや、関数の任意のセクションを除外できることなど、非常に興味深い特性がいくつかあります。ただし、多くの人は、後置記法を使用していることと、読みにくいことを理由に、それらを却下します。加えて、ポーランド人はおそらく、慎重に作成された表記法を逆に使用している人々を高く評価していません。
それで、接頭辞表記を持つことは可能ですか?もしそうなら、トレードオフは何でしょうか?
私はそれがどのように機能するかについての考えを持っていますが、私は連結言語の経験がないので、おそらく何かが欠けています。基本的に、関数は逆の順序で評価され、値は逆の順序でスタックからプルされます。これを示すために、接尾辞を接頭辞がどのようになるかと比較します。これは、従来の接尾辞表記を使用した連結式です。
5 dup * ! Multiply 5 by itself
3 2 - ! Subtract 2 from 3
(1, 2, 3, 4, 5) [2 >] filter length ! Get the number of integers from 1 to 5
! that are greater than 2
式は左から右に評価されます。最初の例で5
は、スタックにプッシュされ、スタックdup
の最上位の値を複製してから、スタック*
の最上位の2つの値を乗算します。関数は最初に最後の引数をスタックからプルします。2番目の例では、-
が呼び出されると2
、スタックの一番上にありますが、これが最後の引数です。
プレフィックス表記は次のようになります。
* dup 5
- 3 2
length filter (1, 2, 3, 4, 5) [< 2]
式は右から左に評価され、関数は最初にスタックから最初の引数をプルします。プレフィックスフィルタの例がその説明に非常に近く、アプリケーションスタイルに似ていることに注意してください。私が気付いた問題の1つは、物事を除外することはそれほど有用ではないかもしれないということです。たとえば、後置記法では、subtractTwo関数を作成するために2 -
因数分解することができます。3 2 -
プレフィックス表記では、subtractFromThree関数を作成するために因数分解することができますが- 3
、- 3 2
これはあまり有用ではないようです。
明白な問題を除けば、おそらく接頭記法を使用する連結言語は、後置記法を嫌う人々に勝つ可能性があります。任意の洞察をいただければ幸いです。