連結指向言語
定義
連結言語とは
日本語訳:
連結指向プログラミング言語 (concatenative programming language) では、1つのデータの塊を操作する関数を複数作成し、このデータの塊が関数から関数へと渡されることで評価が行われます。
通常、このデータのかたまりはスタックの形で表現されます。 また連結指向言語では、関数の合成は、複数のプログラムを連結させる (concatenate) ことによって記述されます。
連結指向言語はスタック型言語とも呼ばれる。厳密には両者は違うがほとんどの部分で同じ性質をもつ。 スタック型言語では、目的の関数の名前を記述するだけで関数呼び出しが行われる
パラメータは暗黙で、関数呼び出しが行われる時点ですでにスタック上に存在している必要がある
関数呼び出しの結果 (結果がある場合) は、関数が戻った後にスタック上に置かれ、次の関数が取り出し、これが繰り返されます。
関数は名前を記述するだけで呼び出され、付随的な構文は一切必要ないので、Forth と Factor では関数のことを「ワード (word)」と呼びます。 実際、構文の中では、関数は単なるワード、つまり単語に過ぎません。
よくある適応型言語
code:applicative.lang
y = foo(x)
z = bar(y)
w = baz(z)
連結型言語では
code:concatenative.lang
x foo bar buzz
と書ける。
リアルワールドでは
code:factorial.fth
: square ( n -- n^2 ) dup * ;
: factorial ( n -- n! )
dup 1 > if
dup 1- recurse *
else
drop 1
then ;
5 square . \ 5の2乗を表示
5 factorial . \ 5の階乗を表示
factorial と書くだけで暗黙的にスタック上の5を取り出して実行する。
またスタック型言語では「ローカル変数への名前付けが不要」にできるという特徴がある。
具体的な実装
連結指向の要素も含まれているものとして
参考記事