マクロ内での「!」の扱いについてNo.07976
TAKA さん 01/03/13 19:21
 
TAKA です。

マクロ内で否定をしたい場合に、
if( !result )
とかの記述を行いますが、

if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
   !( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) &&   // 0〜9は対象外
   !( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) &&   // A〜Zは対象外
   !( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
のような記述は認められていませんでした。

おそらく、「!」は変数や結果コードの直前でなければならないとい
う仕様があるためだと思います。
もし、簡単に仕様追加出来るようでしたら、対応して頂けたらと思
います。

対応出来なくても、記述方法を
if( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) )
{ // 単語とみなす範囲
    if( ( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) ||   // 0〜9は対象外
        ( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) ||   // A〜Zは対象外
        ( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
    {
    }
のようにすることで、プログラムは出来ます。


少し気になったので、報告させてもらいました。

[ ]
RE:07976 マクロ内での「!」の扱いについNo.07977
きいろいまふらあ さん 01/03/13 20:09
 
> おそらく、「!」は変数や結果コードの直前でなければならないとい
> う仕様があるためだと思います。

そんな仕様ではないみたいっす。

if((1==1) && !(2==0))message "OK";

はだめ。

if((1==1) && (!(2==0)))message "OK";

はおっけー。

…ってことみたいっす。

> if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
>    !( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) &&   // 0〜9は対象外
>    !( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) &&   // A〜Zは対象外
>    !( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外

 if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
    (!( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) )) &&   // 0〜9は対象外
    (!( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) )) &&   // A〜Zは対象外
    (!( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) )) )    // a〜zは対象外

でいけるかどうかは試してないですけど。

[ ]
RE:07977 マクロ内での「!」の扱いについNo.07980
番頭++ さん 01/03/13 20:16
 
// 式を、左から右に評価して、論理式を ! は 否定しているだけなんですが ...
// 今までの評価を、継続する式が間違っていると、捨てる傾向にあります。
    #i = 1; #j = 2;
    message "str(!(0)) ==>  "  +  str(!(0))  ;
    message "str(!(#i)) ==>  "  +  str(!(#i))  ;
    message "str(!(#j-1-1)) ==>  "  +  str(!(#j-1-1))  ;
endmacro;

[ ]
RE:07977 マクロ内での「!」の扱いについNo.07981
TAKA さん 01/03/13 20:29
 
TAKA です。

>> おそらく、「!」は変数や結果コードの直前でなければならないとい
>> う仕様があるためだと思います。
>
>そんな仕様ではないみたいっす。
>
>if((1==1) && !(2==0))message "OK";
>
>はだめ。
>
>if((1==1) && (!(2==0)))message "OK";
>
>はおっけー。
>
>…ってことみたいっす。

ふむふむ。

「!」は「()」で括られていなければならないという仕様みたいで
すね。



>> if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
>>    !( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) ) &&   // 0〜9は対象外
>>    !( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) ) &&   // A〜Zは対象外
>>    !( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) ) )    // a〜zは対象外
>
> if( ( ( ##1 >= 0x21 ) && ( ##1 <= 0x7e ) ) &&   // 単語とみなす範囲
>    (!( ( ##1 >= 0x30 ) && ( ##1 <= 0x39 ) )) &&   // 0〜9は対象外
>    (!( ( ##1 >= 0x41 ) && ( ##1 <= 0x5A ) )) &&   // A〜Zは対象外
>    (!( ( ##1 >= 0x61 ) && ( ##1 <= 0x7A ) )) )    // a〜zは対象外
>
>でいけるかどうかは試してないですけど。

OKみたいでした。

という訳で、それほど支障はありませんので、仕様追加の件は取り
下げます。


きいろいまふらささん、どうもありがとうございました。

[ ]
RE:07976 マクロ内での「!」の扱いについNo.07982
TAKA さん 01/03/13 20:56
 
TAKA です。

ちなみに、評価の値は、真(0以外)か偽(0)で判断されますので、
以下のようになります。

message "str(!(0)) = " + str(!(0));         // 偽の否定なので真(1)
message "str(!(1)) = " + str(!(1));         // 真の否定なので偽(0)
message "str(!(100)) = " + str(!(100));     // 真の否定なので偽(0)
message "str(!(10-2)) = " + str(!(10-2));   // 真の否定なので偽(0)

[ ]
RE:07982 マクロ内での「!」の扱いについNo.07983
きいろいまふらあ さん 01/03/13 21:37
 
> ちなみに、評価の値は、真(0以外)か偽(0)で判断されますので、
> 以下のようになります。

0 以外の値の否定は 0 に、0 の否定は 1 になるってことですね。

つまり一般的には ((#i == (!(!(#i))) == 0) は 1 ってことですね。(^^;

[ ]
RE:07982 マクロ内での「!」の扱いについNo.07984
番頭++ さん 01/03/13 21:39
 
ごめん、
コンパイラでもインタプリタでも同じなのですが、
式の評価の仕様の問題で、
「秀丸」はそのような仕様であるといいたかったのです。

# ソフトを評価するときに、「式の評価」を読むんです。

[ ]
RE:07983 マクロ内での「!」の扱いについNo.07986
TAKA さん 01/03/13 21:46
 
TAKA です。

>> ちなみに、評価の値は、真(0以外)か偽(0)で判断されますので、
>> 以下のようになります。
>
>0 以外の値の否定は 0 に、0 の否定は 1 になるってことですね。

です。


>つまり一般的には ((#i == (!(!(#i))) == 0) は 1 ってことですね。(^^;

うおっー。頭がパニック状態。
#頭から煙が出そう。

[ ]
RE:07976 マクロ内での「!」の扱いについNo.07988
TAKA さん 01/03/13 22:51
 
TAKA です。

「7987」で書いた通り、私の勘違いでしたので、今回の発言は無視
しておいて下さい。 > 秀丸担当さん

会議室を汚してしまい、申し訳ありませんでした。 > ALL

[ ]