えぐち@エスアンドイー です。

>>> On Fri, 12 Feb 1999 05:11:31 +0900, Koji Arai <JCA02266 / nifty.ne.jp> said:

JCA02266> 新井です。
...
JCA02266> > |ruby -e 'p(nil && 1)'
JCA02266> > |  nil
JCA02266> > |
JCA02266> > |は OK なので、 and と or の演算子としての
JCA02266> > |弱さが原因でしょう。
JCA02266> 
JCA02266> ここでの弱さというのは優先順位だけの話ではないんで
JCA02266> すね。expressionはメソッドの引数にはなりえなくて、
JCA02266> and/or/not がexpressionとして定義されているのが問
JCA02266> 題かと思ったんですが、仕様なんですね。

なるほど perse.y の中で、

  'nil and 1' は arg にはマッチせず expr にマッチする
  'nil && 1'  は arg: arg tANDOP arg にマッチする

あたりですね。

'and' と 'or' 演算子式はコマンド呼び出しには使えないと読めます。

JCA02266> > ぴんぽん,その通りです.一方,Rubyのかっこは文かっこでもある
JCA02266> > ので,文(a and b)をくくることができます.

文かっこ式は 、、 arg であると、、

JCA02266> 難しい。ゴメンナサイよくわからないです。皆さんはわ
JCA02266> かってるんだろうなぁ。

いえいえ、

 『and/or/not を arg に昇格する』

という仕様変更リクエストであれば妥当だと思います。

ただ添付のパッチの様に実装を変更すると、

  bison -y -d ../parse.y
  conflicts:  233 shift/reduce

するのと、lib/ftools.rb:158 辺りの

  def install(from, to, mode = nil, verbose = false)
    to = catname(from, to)
=>  unless FileTest.exist? to and cmp from, to
      unlink to if FileTest.exist? to
      cp from, to, verbose
      chmod mode, to, verbose if mode
    end  
  end

がエラーとなります。

従来は 

	unless FileTest.exist?(to) and cmp(from, to)

と解釈されましたが

	unless FileTest.exist?(to and cmp from, to

との解釈が当てはまったからです。
狙いで上記の書き方をしたかわ、判らないけれども、
過去との互換性に問題を来す恐れはあります。
#それと、何と conflict したのか追求の必要があります。

JCA02266> # ruby-list ネタだったか。

とっても ruby-dev ネタだと思います。 ;-)

	えぐち

--- ../ruby-1.3.1-990210/parse.y Wed Feb 10 17:44:27 1999 +++ parse.y Fri Feb 12 11:01:58 1999 @@ -383,24 +383,6 @@ $$ = NEW_YIELD($2); } | command_call - | expr kAND expr - { - $$ = logop(NODE_AND, $1, $3); - } - | expr kOR expr - { - $$ = logop(NODE_OR, $1, $3); - } - | kNOT expr - { - value_expr($2); - $$ = NEW_NOT(cond($2)); - } - | '!' command_call - { - value_expr($2); - $$ = NEW_NOT(cond($2)); - } | arg command_call : operation call_args @@ -778,6 +760,24 @@ value_expr($1); $$ = NEW_IF(cond($1), $3, $5); fixpos($$, $1); + } + | arg kAND arg + { + $$ = logop(NODE_AND, $1, $3); + } + | arg kOR arg + { + $$ = logop(NODE_OR, $1, $3); + } + | kNOT arg + { + value_expr($2); + $$ = NEW_NOT(cond($2)); + } + | '!' command_call + { + value_expr($2); + $$ = NEW_NOT(cond($2)); } | primary {