ブロックの“ | ”(バーティカルバー)って何よ?

LL Weekend がらみで、Groovy のチュートリアルなどつらつらと眺めているとき、ブロック(クロージャ)の項でふと目にとまったのは、ブロック変数の宣言とコード本体を区別するための“パイプ”の文字。Ruby では Smalltalk のテンポラリ変数よろしく、くくってしまうのですが、Smalltalk では Groovy のように、“ | ”で区切ります(なお、Groovy は Ruby ライクにくくることもできる)。追記:Groovy も、くくるのみになったそうです。

Groovy   …… [1, 2, 3].inject('counting: ') { str, item | str + item }
Ruby      …… [1, 2, 3].inject('counting: ') { | str, item | str + item.to_s }
Smalltalk ……  #(1 2 3) inject: 'counting: ' into: [: str : item | str, item asString] 

Smalltalk のブロック変数宣言の : (コロン)については、id:squeaker な おおしまさんに「メソッド定義書式のメッセージパターンを模したもので、キーワードメッセージのキーワードのない状態」と教えてもらってすっきりした経緯があるのですが(それ以来、: の後にはスペースを入れたくなる病が発症してしまった…)、バーティカルバーは何者か…という疑問はすっかりなおざりにしてしまっていました。視覚的に区切りを表現したもの…と簡単に片づけていたのですが、パイプという考え方もありですね…。もっとも、当時の UNIX にパイプがあったのかは知らんのですが…。

しかし、Groovy 。ほんとうに Ruby に似ていますね。