3

連結言語には、さまざまなアリティの関数を作成できることや、関数の任意のセクションを除外できることなど、非常に興味深い特性がいくつかあります。ただし、多くの人は、後置記法を使用していることと、読みにくいことを理由に、それらを却下します。加えて、ポーランド人はおそらく、慎重に作成された表記法を逆に使用している人々を高く評価していません。

それで、接頭辞表記を持つことは可能ですか?もしそうなら、トレードオフは何でしょうか?

私はそれがどのように機能するかについての考えを持っていますが、私は連結言語の経験がないので、おそらく何かが欠けています。基本的に、関数は逆の順序で評価され、値は逆の順序でスタックからプルされます。これを示すために、接尾辞を接頭辞がどのようになるかと比較します。これは、従来の接尾辞表記を使用した連結式です。

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これはあまり有用ではないようです。

明白な問題を除けば、おそらく接頭記法を使用する連結言語は、後置記法を嫌う人々に勝つ可能性があります。任意の洞察をいただければ幸いです。

4

4 に答える 4

5

確かに、あなたの言葉がまだ固定されているなら、それは右から左にトークンを実行するだけの問題です。

接頭辞表記が括弧を意味するのはn-arity関数のためだけであり、スタック言語であることが後置を意味するのは、人間の「読み取り順序」を実行順序と一致させたいためだけです。

于 2012-09-03T16:27:21.777 に答える
3

私は今そのような言語を書いていますが、これまでのところ、接頭辞表記を使用することの副作用のいくつかが好きです。セマンティクスはJoyに基づいています。

  • ファイルは左から右に解析されますが、右から左に実行されます。
  • ひいては、定義はそれらが使用されるポイントの後に来る必要があります。
  • 良い副作用として、コメントは単にドロップされるリストです。

たとえば、階乗関数は次のとおりです。

def 'fact [cond [* fact - 1 dup] [1 drop] dup]

また、コードを書いているときにコードについて推論する方が簡単だと思いますが、連結言語についての強いバックグラウンドはありません。これが私の(おそらくナイーブな)リスト上のmap関数の導出です。'nb'関数は何かをドロップし、コメントに使用されます。'stash [f]'は一時にポップし、スタックの残りの部分で' f'を実行してから、一時を押し戻します。

def 'map [q [cons map stash [head swap i] dup stash [tail dup]] [nb] is_cons nip]
nb [map [f] (cons x y) -> cons map [f] x f y
    stash [tail dup]    [f] (cons x y)       = [f] y (cons x y)
    dup                 [f] y (cons x y)     = [f] [f] y (cons x y)
    stash [head swap i] [f] [f] y (cons x y) = [f] x (f y)
    cons map            [f] x (f y)          = cons map [f] x f y

    map [f] [] -> []]
于 2012-05-22T10:56:43.830 に答える
3

私はちょうどOm言語について読んだことから来ました

あなたが話していることのようです。その説明から(私の強調):

Om言語は次のとおりです。

  • 斬新で、最大限にシンプルな連結型の同像性プログラミングおよびアルゴリズム表記言語。
    • 3つの要素のみで構成される最小限の構文。
    • 関数がプログラム自体の残りの部分を操作するプレフィックス表記。[...]

また、それはまだ終わっておらず、まだ多くの変化を経験すると述べています。

それでも、それは機能しているようで、概念実証としては本当に興味深いものです。

于 2015-05-21T04:15:12.973 に答える
1

スタックのない連結プレフィックス言語を想像します。関数を呼び出すことができ、関数は必要なすべてのオペランドを取得するまでコードを解釈します。次に、インタプリタは次の関数を呼び出します。必要なメモリ構成は1つだけで、結果です。他のすべては、実行時にソースコードから読み取ることができます。お気づきかもしれませんが、私は通訳言語について話しているのであって、コンパイルされた言語ではありません。

于 2012-03-08T19:41:52.693 に答える