|
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の囲みがシングルクォートに変わっていることに注意。
|
|