引数のバインディングと実行を遅延させる Io 言語: 7 つの言語 7 つの世界 第 3 章を読んだ感想

7つの言語 7つの世界 第3章 Io 言語を読んでいて最初に疑問に思ったのが,

制御構造が無い Io 言語がどのように Ruby の && 相当を実現しているか

です.

前のエントリに書いたように,

Ruby で AND, OR の論理演算を行うための論理演算子には {&&,||} と {&,|} の 2 種類あります。この 2 種類は似ていてまぎらわしいのですが、{&&,||} は制御構造で、{&,|} はメソッド ...

Ruby の論理演算子、&& と || は制御構造で & と | はメソッド - passingloopの日記

です.& はメソッドなので必ず両辺が評価されますが,

ruby-1.9.2-p290 :004 > (puts 'foo') & (puts 'bar')
foo
bar
 => false 

&& は制御構造なので左辺が false の場合右辺を評価しないということが可能になります.

ruby-1.9.2-p290 :005 > (puts 'foo') && (puts 'bar')
foo
 => nil 

Io は制御構造が無く全てがメッセージなのに,Ruby の && 相当をどうやって実現しているか.というのが冒頭の疑問でした.

この疑問は,第3章を読みすすめていくと,すぐに解決しました.なんのことはない,Io 言語の and が Ruby の && 相当だったのです.

Io> true and writeln("evaluated")
evaluated
==> false
Io> false and writeln("evaluated")
==> false

どうして,こんなことが可能なのかは p.59 に書いてありました.

ほとんどの言語では,引数をスタック値として渡す.例えば Java では引数の各値を最初に計算してから,それらの値をスタックに詰む.Io ではそのようなことはせず,メッセージ自体とそのコンテキストをそのまま渡す.そしてレシーバ側でそのメッセージを評価する.

...

Io では,メッセージの引数を解釈するが,バインディングと実行は遅延させる.

Ruby のように引数を実行してからメソッドを実行するというのが常識だと思っていましたが,Io はそうではありませんでした.第 3 章を読むまでは,引数のバインディングと実行を遅延させるという発想はありませんでした.このような自分の中にあるプログラミング言語に対する誤った思い込みを正せるのも,様々なプログラミング言語を学ぶ利点だと思います.第 4 章以降を読むのが楽しみになってきました.