連鎖性言語/連鎖は合成スタック型言語の基本的特質は、2 つのプログラム たとえば Factor では、 ( scratchpad ) { 1 2 3 4 5 6 7 8 } [ even? ] filter . { 2 4 6 8 } 上とは逆に、述語に一致するものを取り除くには、 ( scratchpad ) { 1 2 3 4 5 6 7 8 } [ even? not ] filter . { 1 3 5 7 } 部分的な適用も非常に簡単です。ワードを呼ぶ前にいくつかのパラメータをスタックに積むクォーテーションを記述すればよいのです。 ( scratchpad ) { 1 2 3 4 5 6 7 8 } [ 4 > ] filter . { 5 6 7 8 } 上に示した 3 つのクォーテーションに注目してください。 [ even? ] [ even? not ] [ 4 > ] いずれも、適用型言語で記述した同様のコードより簡潔です。これは、一度しか使われない入力引数に名前を付ける必要がないからです。たとえば、Common Lisp では次のようになります。 (function evenp) (lambda (x) (not (evenp x))) (lambda (x) (> x 4)) 連鎖性言語は名前付きパラメータを持たないので (Factor の Factor では、クォーテーションはオブジェクトのシーケンスのように表現されます。たとえば、 たとえば、クォーテーション クォーテーションに対するもうひとつの基本操作は、合成 (composition) です。たとえば、 これら 2 つの操作、すなわち 次に示すのは、 ( scratchpad ) 5 [ + ] curry . [ 5 + ] 適用型言語のコードと比べてみてください。クロージャは読みやすい形では表示されません。 * (let ((x 5)) (lambda (y) (+ x y))) #<FUNCTION (LAMBDA (Y)) {11682335}> 次に示すのは、 ( scratchpad ) [ 3 = ] [ not ] compose . [ 3 = not ] 適用型言語のコードです。 * (let ((f (lambda (x) (= x 3)))) (lambda (y) (not (funcall f y)))) #<FUNCTION (LAMBDA (Y)) {11680B3D}> 以上のことからわかるように、スタック型言語では関数の合成と部分的適用をはるかに自然な形で行うことができます。これはスタック型言語が、合成 (composition) と連鎖 (concatenation) という両特性を備えているためです。 This revision created on Wed, 31 Dec 2008 09:32:01 by mnestic (formatting) |
|
|
All content is © 2008 by its respective authors. By adding content to this wiki, you agree to release it under the BSD license. |
|