たけ(tk)です。

[ruby-list:34992] Re: a = 4 ; p((a < 3) or (a > 5)) にて 
Koji Arai <JCA02266 / nifty.ne.jp> さん 曰く:
》[ruby-list:24664] 参照です。

http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=trap%3A%3A%28%29%A4%C7%B2%F2%B7%E8%A4%B9%A4%EB%A4%E2%A4%CEtrue and falseは文と解釈されるので式として解釈されるための括弧とpの 引数をくくる括弧が必要になります。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/24664そうですね。あれは式を要求しているんです。で、式を要求するコンテキストでは、以下のものが直接は書けません。

--

「true && false」と「true and false」の扱いが異なる理由は『「=」よりも優
先順位が低い演算子』かどうかによる、ということでよろしいでしょうか?

--

(同趣旨ですがもうちょっと詳しい言い方)

文(実行単位)を引数の括弧の中や「=」の右辺に置いたときに、
(A)式として自動的に解釈される文     (例:true && false)
(B)式として自動的には解釈されない文 (例:true and false)
がある。

「=」よりも優先順位が低い演算子で構成された文(true and false、not true)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
は、引数の括弧の中や「=」の右辺に置いても、自動的には式として解釈されな
い(B)。評価の対象となりえない文と解釈されるのでエラーになる(void
context)。引数を囲む括弧の他に、式であることを明示するための括弧が必要。

という理解でいいでしょうか?

--

しかし、

a = not true
a = true and false

	n:\>ruby -e "a = true and false ; p a"
	-e:1: warning: found = in conditional, should be ==
	true

は次のように演算子の優先順位で説明するのは簡単だが、

( a = not ) true
( a = true ) and false

普通にみたらやはり「a = (not true)」「a = (true and false)」と解釈して欲
しくなる。

p ( not true )

の場合には、カッコがあるにもかかわらず、式として評価されない、というのが
不思議。演算子の優先順位だけでは説明ができない。

このような仕様は実装上の制約なのでしょうか? それとも積極的な理由がある
のでしょうか?

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武