if 制御構文についてNo.02846
tats さん 01/12/14 12:06
 
秀丸のバブルソートについて勉強しておりまして、
どうしても理解できない部分が出でしまいましたので
皆様に質問させてください。

URL:http://hidemaru.xaxon.co.jp/lib/macro/sort_mac.html
[ 作  者 ] M.Tsukamoto さんの
[マクロ名] Sort.mac を分解し勉強させて
頂いているのですが、次の制御構文がどうしても
理解できません。
---------------------------------------
#AsReverse = 0;
$$TextSortLine = "543210と言う文字列";
$$TextSortBuffer = "012345と言う文字列";

if( #AsReverse == 0 && $$TextSortLine > $$TextSortBuffer ){
message "ifが成立";
}else if( #AsReverse && $$TextSortLine < $$TextSortBuffer ){
message "else ifが成立";
}else{
message "elseです。";
}
endmacro;
---------------------------------------
上のマクロを実行すると、
ifが成立致します。条件式の中は、
どんな比較が行われているのでしょうか?
if文というのは、数値や文字列が等しいかどうか?で
真偽を返すものなのではないのでしょうか?
ifが成り立つ場合、$$TextSortLineが$$TextSortBuffer
よりも大きくかつ#AsReverse == 0であると言う事ですよね?

$$TextSortLineが$$TextSortBufferより大きいと言うのは、
内部で文字コードにでも変換されて比較されているのですか?

そして、もっと疑問なのが、else ifが成立する場合。
#AsReverse && $$TextSortLine < $$TextSortBuffer
これは、どのように解釈すれば宜しいのでしょうか?

みなさま、大変お手数をおかけ致しますが、
どうぞ御教授お願い申し上げます。


[ ]
RE:02846 if 制御構文についてNo.02847
TAKA さん 01/12/14 12:32
 
TAKA です。

>ifが成り立つ場合、$$TextSortLineが$$TextSortBuffer
>よりも大きくかつ#AsReverse == 0であると言う事ですよね?

あっています。ただ、
if( ( #AsReverse == 0 ) && ( $$TextSortLine > $$TextSortBuffer ) ){
とした方がより分かりやすいと思います。


>$$TextSortLineが$$TextSortBufferより大きいと言うのは、
>内部で文字コードにでも変換されて比較されているのですか?

辞書順です。
http://win.blue.co.jp/~jr-kun/qa5prev/qa_hmm_2.html#HMM0077A
を参照して下さい。


>#AsReverse && $$TextSortLine < $$TextSortBuffer
>これは、どのように解釈すれば宜しいのでしょうか?

これは、
( #AsReverse != 0 ) && ( $$TextSortLine < $$TextSortBuffer )
と同じ意味です。
真(0以外)と偽(0)という概念がありますので、
「#AsReverse」は「#AsReverse != 0」ということです。

なので、#AsReverseが0である限り、このelse if文には入りません。

[ ]
RE:02846 if 制御構文についてNo.02848
ひろ さん 01/12/14 12:58
 
 tats さん今日は、ひろです。
> if文というのは、数値や文字列が等しいかどうか?で
> 真偽を返すものなのではないのでしょうか?
 ちょっと違います。if に続く「()」の中身の評価が 0 かそれ以外かで判
断します。ですから例えば、秀丸のマクロで現在のカーソル位置が論理行頭
であるかないかは、
if( column != 0)
でも良いですし、
if( column )
でもよいです。ただし理論上は後者の方が != 0 の判断をしない分速くなります。

> ifが成り立つ場合、$$TextSortLineが$$TextSortBuffer
> よりも大きくかつ#AsReverse == 0であると言う事ですよね?
 そうです。

> $$TextSortLineが$$TextSortBufferより大きいと言うのは、
> 内部で文字コードにでも変換されて比較されているのですか?
 似て非なる事をやっています。
 この辺りのことは、現在制作中の Q&A 集 (おそらく) 6 版で記述されると
思いますが、「hidesoft.10:00327| マクロでの文字列の比較 (第2稿)」の原
稿を末尾にそのまま引用しておきます。

> そして、もっと疑問なのが、else ifが成立する場合。
> #AsReverse && $$TextSortLine < $$TextSortBuffer
> これは、どのように解釈すれば宜しいのでしょうか?
 最初に書いた「0 かそれ以外かで判断」というのがポイントです。
「#AsReverse が 0 以外、かつ $$TextSortLine が $$TextSortBuffer より
小さい。」ということになります。


> ●マクロでの文字列の比較
>
> Q.
> マクロのif文で文字列の比較はできますか?
>
> A.
> できます。
> ただし、比較のルールは文字コード順ではなく、辞書引き順となります。
> 大小比較をする場合は注意が必要です。
>
> 辞書引き順のルールは以下のようになっているようです。
> (以下は、本Q&A執筆者が独自に調査した結果を基に記述しています。
>  このルールに基づかない結果になることがあるかもしれません)
> 例に示す式はすべて真です。
>
> (1-a)
>     文字種全体の関係は、記号 < 英字 < かな < 漢字 となる。
>     英字同士の比較は大文字/小文字、全角/半角の区別なく、英字順に大きいと
>     判断される。
>     かな同士の比較は、ひらがな/カタカナ、全角/半角の区別なく、
>     五十音順に大きいと判断される。濁点、半濁点はないものと見なす。
>
>         例) "a" < "ア"
>         例) "a" < "B"
>         例) "アイ" > "アア"
>         例) "カク" > "カ゛キ"
>
> (1-b)
>     文字数の違う文字列同士の比較で、短い方の文字列の長さまでが
>     (1-aのルールで)一致している場合、長いほうが大きいと判断される。
>     ※ 長さはバイト数ではなく文字数でカウントする。
>
>         例) "ABC" < "abc1"
>
> ここまでで決着がつかなかった場合に、次のルールを適用します。
>
> (2)
>     英字の同一文字の大文字と小文字の比較では、大文字のほうが大きい。
>     かなの同一文字の比較では、次のような関係となる。
>
>         濁点ナシ < 濁点付き < 半濁点付き
>         半角カナ < 全角カタカナ < 全角ひらがな
>
>     ※ 濁点の有無のほうが優先順位が高い。
>
>         例) "ABC" > "abc"
>         例) "アイ" < "アイ"
               ^^^^半角 (この行のみ挿入)
>         例) "カキ" < "カ゛キ"
>
> ここまでで2つの文字列に違いが見られない場合、2つの文字列は同じである
> という結果になります。
> 漢字や記号など言及していない部分もありますが、
> ここで挙げていくときりがないので、ご自身で確かめてみましょう。
>
>
> 次のマクロは、編集中のテキストのカーソル位置から
> 英単語を取得して1単語ずつダイアログボックスに表示します。
> ファイルの最後に達するまで繰り返します。
>
> gowordtop;
> #x1 = x;
> #y1 = y;
> while( 1 ) {
>   wordright;
>   if( result == false ) {
>     break;
>   }
>   $str = gettext(#x1, #y1, x, y);
>   $s1 = leftstr($str, 1);
>   if( $s1 >= "A" && $s1 <= "Z" ) {    // *1
>     message $str;
>   }
>   #x1 = x;
>   #y1 = y;
> }
>
> 英単語かどうかの判断に文字列の比較を使用しています(*1の行)。
> ("A"〜"Z"で始まる単語を英単語であると判断)
> このマクロは英大文字で始まる単語のみを表示する目的で作成した
> ものですが、前述したルールにより英小文字で始まる単語も表示し
> てしまいます。
>
> 正しく英大文字で始まる単語のみを表示するには、*1の行を
> 次のように変更します。
>
>   if( ascii($s1) >= 'A' && ascii($s1) <= 'Z' ) {    // *1
>
> 比較対象を文字(列)のままではなく文字コードに変換して比較します。
> ※ AとZの囲みがシングルクォートに変わっていることに注意。

[ ]
RE:02847 if 制御構文についてNo.02849
tats さん 01/12/14 13:28
 
早速のお返事、大変ありがとうございます。

>if((#AsReverse == 0)&&($$TextSortLine > TextSortBuffer)){

なるほどそうですね。見た目確かに分かりやすいです。

>辞書順です。
>http://win.blue.co.jp/~jr-kun/qa5prev/qa_hmm_2.html#HMM0077A
>を参照して下さい。

なるほどねぇ〜〜。こう言う様なルールがあったんですね。。。
まだまだ、経験不足でした。。。最初から、秀丸Q&A集を読み直すと
色々な発見が出来そうです。頑張ってみます。
ちなみに、辞書引き順とありますが、
市販されている辞書に掲載されている順と思っていいんですよね?
その意味で辞書引き順となっているのですよね?
秀丸さんもすごいことしますね。

>>#AsReverse && $$TextSortLine < $$TextSortBuffer
>>これは、どのように解釈すれば宜しいのでしょうか?
>
>これは、
>( #AsReverse != 0 ) && ( $$TextSortLine < $$TextSortBuffer )
>と同じ意味です。
>真(0以外)と偽(0)という概念がありますので、
>「#AsReverse」は「#AsReverse != 0」ということです。
>
>なので、#AsReverseが0である限り、このelse if文には入りません。

上記解説、とてもわかりやすかったです。ありがとうございます。

プログラミングって奥深いですね。。。省略すると
初心者には、なぞだらけになりますもん。。。
後は、頑張って経験をつんで行こうと思います。

お返事を頂きありがとうございました。

[ ]
RE:02848 if 制御構文についてNo.02850
tats さん 01/12/14 13:45
 
ひろさん、お返事頂きましてありがとうございます。

> tats さん今日は、ひろです。
>> if文というのは、数値や文字列が等しいかどうか?で
>> 真偽を返すものなのではないのでしょうか?
> ちょっと違います。if に続く「()」の中身の評価が 0 かそれ以外かで判
>断します。ですから例えば、秀丸のマクロで現在のカーソル位置が論理行頭
>であるかないかは、
>if( column != 0)
>でも良いですし、
>if( column )
>でもよいです。ただし理論上は後者の方が != 0 の判断をしない分速くなります。

おお!これも勉強になりますね。
プログラミング上級者を目指すのであれば、
やはり省略形みたいなもの覚えっていたほうがいいかもしれないですね。
(後から自分が見て、混乱しないようになるレベルになる必要が
 ありますが・・・(笑))


>> ifが成り立つ場合、$$TextSortLineが$$TextSortBuffer
>> よりも大きくかつ#AsReverse == 0であると言う事ですよね?
> そうです。
>
>> $$TextSortLineが$$TextSortBufferより大きいと言うのは、
>> 内部で文字コードにでも変換されて比較されているのですか?
> 似て非なる事をやっています。
> この辺りのことは、現在制作中の Q&A 集 (おそらく) 6 版で記述されると
>思いますが、「hidesoft.10:00327| マクロでの文字列の比較 (第2稿)」の原
>稿を末尾にそのまま引用しておきます。

かなり、参考になりました。

>> そして、もっと疑問なのが、else ifが成立する場合。
>> #AsReverse && $$TextSortLine < $$TextSortBuffer
>> これは、どのように解釈すれば宜しいのでしょうか?
> 最初に書いた「0 かそれ以外かで判断」というのがポイントです。
>「#AsReverse が 0 以外、かつ $$TextSortLine が $$TextSortBuffer より
>小さい。」ということになります。

(#AsReverse != 0) && ($$TextSortLine < $$TextSortBuffer)
と言う事は、初めて今回気づきました。
ありがとうございます。

お返事いただきまして、本当にありがとうございました。


[ ]
RE:02849 if 制御構文についてNo.02851
TAKA さん 01/12/14 17:16
 
TAKA です。

>ちなみに、辞書引き順とありますが、
>市販されている辞書に掲載されている順と思っていいんですよね?
>その意味で辞書引き順となっているのですよね?

残念ながら、辞書の掲載順ではありません。
以下のマクロで確認できます。
「hidesoft.10:00305 2001/10/09」のスレッドも参考になります。

// テストマクロ(ここから)
    // 通常の辞書では、がん、ガンの順で載っているので、
    // 本来は、$Str1 < $Str2となって欲しいですが、
    // そうは問屋(MS?)が卸さない。
    // hidesoft.10:00305 2001/10/09 のスレッドで
    // 文字列比較の話題が展開されていました。
    $Str1 = "がん";     // 癌
    $Str2 = "ガン";     // 雁
    if( $Str1 == $Str2 )        message "$Str1 == $Str2";
    else if( $Str1 > $Str2 )    message "$Str1 > $Str2";
    else                        message "$Str1 < $Str2";
    endmacro;
// テストマクロ(ここまで)


>秀丸さんもすごいことしますね。

lstrcmp()というWindowsのAPIを利用しているだけではありますが。

[ ]
RE:02849 if 制御構文についてNo.02856
ひろ さん 01/12/14 18:18
 
 tats さん今日は、ひろです。
> 市販されている辞書に掲載されている順と思っていいんですよね?
 辞書によって異なる可能性があります。
 ##本当は何を持って辞書順とする科の解らない(^^;。何かで決まっている
のだろうか?

 具体的には、
>     英字の同一文字の大文字と小文字の比較では、大文字のほうが大きい。
>         半角カナ < 全角カタカナ < 全角ひらがな
です。

[ ]
RE:02856 if 制御構文についてNo.02862
きいろいまふらあ さん 01/12/15 14:47
 
秀丸(=Windows APIの仕様)と一致する保証はないですが、

> ##本当は何を持って辞書順とする科の解らない(^^;。何かで決まっている
>のだろうか?

JISあたりで規格になってるかもしれないですね。
いくつか似たようなものが定められている可能性もあります。

JISが絶対ってわけでもなく、そもそも全て想像ですけど。

[ ]