«前の日記(2005年06月30日) 最新 次の日記(2005年07月02日)» 編集

Matzにっき


2005年07月01日 [長年日記]

_ [論文] 不採録

残念な結果であった。基本的なアイディアはともかく、 その表現と評価方法に難があったようだ。めげずに頑張ろう。

_ [Ruby] ブロックパラメータの新文法

昨日のエントリでもすこし触れたが、 ブロックパラメータの文法を変更したい気持ちがある。 理由は、昨日述べた通り「メソッド引数リストと同じ文法を使えない」からだ。 yaccをあきらめてパーザをもっとずっと複雑にすれば不可能ではないかもしれないけど。

jijixiさんからツッコミでは(冗談とはいえ)、 Groovyの -> を逆輸入することが提案されていたが、これはあんまりうまくない。

新しい文法への要求としては

  • メソッド引数で指定できる全ての要素(必須引数、オプショナル引数、キーワード引数、配列引数、ブロック引数)が指定できる。要するに式に登場する記号は使えない
  • 引数がなければブロックパラメータ全体を省略可能
  • 今までの文法と矛盾しない。古い文法も残す

である。Groovyの -> はyaccを使う限り、2番目の要求を満たさないと思う。

ちょっと考えて思い付くのは以下のようなものか。

  • Perl6風無名関数

    Groovy同様 -> を使うが、こちらは

    -> (x,y) { ... }

    のようなもの。Perl6では

    foreach ary -> (x) { print x; }

    という感じで使う。

    こっちの方が見栄えがよいような気がするな。 でも、この場合、-> は引数リストと本体との区切りではなく「lambdaの代わり」になっているな。 ブロックとして使う場合は

    { -> (x, y) ... }

    か。なんか変だな。

  • 新しい予約語を使う

    昔々、ブロックが導入される前のRubyの文法を検討したメモには「using」という予約語を使う文法を考えていたことが示されている。これを復活させるか。

    { using x, y; ...}

    あんまりパラメータらしくないな。やはりメソッド引数宣言に似た文法(つまり括弧で囲まれているということか)が良さそうだ。

  • lambdaを拡張

    結局、メソッド引数のすべての文法が欲しくなるのは無名関数の場合であって、 インラインブロックの文法は今のままで構わないというのもひとつの見識だ。

    そこで、lambdaを予約語としてしまうのはどうだろうか。

    lambda(x,y) {....}

    インラインブロックでたとえばオプショナル引数が指定したい場合には、

    foo(args, &lambda(x=15){...})

    のように指定することになるだろう。こういうケースはまれだろうから、 積極的に短くすることを支援しなくても良い。

  • 別の記号

    しかし、それでもlambdaは長い。では、別の記号を導入するか。 先ほどのPerl6における -> でも良い。Haskellではlambdaはバックスラッシュを使っていなかっただろうか。

    \(x,y) { ....}

    うーむ、一目で意味が分からないぞ。慣れたらなんとかなるものなのだろうか。 また、フォントによってはバックスラッシュでなく円記号に見えるのもうまくない。

と、考えを撒き散らすだけで、結論はない。

_ [Hack] 今日のハック

ライセンスの懸念を解消するため、 missingの下にあるerf.cとcrypt.cを4.4BSDからのものに置換。 しかし、そのままではコンパイルできず各方面に迷惑をかけてしまった。

あ、crypt.cはともかくerf.cは奥村先生に連絡を取ってpublic domainの確認を取れば良かったんでないか。 今、気がついた。どうしたもんだか。


«前の日記(2005年06月30日) 最新 次の日記(2005年07月02日)» 編集