メニューに付いて。No.04221
辺見!真琴 さん 04/03/26 22:57
 
 最近マクロを使う事を覚えまして、さっきここも巡回に追加しました。

 さて。
 HTML製作支援で色名(pink,orange,tomato...)のセレクタを作ろうと
したのですが、マクロヘルプによると、メニュー系はどうやら
封印されている様子。
 あって当然と思っていた機能なので、非常に戸惑いを覚えているのですが、
どんな経緯があるのでしょう?
 また、この問題には回避方法などもあるのでしょうか?
 環境はWindows2000に秀丸3.19です。

 それと、要望なのですが・・・。
 配列の初期化に、添え字の省略と複数代入を許可出来ないものでしょうか。
$foo[] = {"a","b","c"}
 こんな感じで。
 それと、要素数が一発で求められると有難いのですが。
#math = sizeof($foo);
 こんな感じで。
 一方的な意見ですが、どんなもんでしょうね?

[ ]
RE:04221 メニューに付いて。No.04222
アルビレオ さん 04/03/27 02:23
 
秀丸ユーザーのアルビレオです。

> HTML製作支援で色名(pink,orange,tomato...)のセレクタを作ろうと
>したのですが、マクロヘルプによると、メニュー系はどうやら
>封印されている様子。
> あって当然と思っていた機能なので、非常に戸惑いを覚えているのですが、
>どんな経緯があるのでしょう?

これは「通常のコマンドを実行する文」の「メニュー系コマンド」の話ですよね。
秀丸のメニューから[その他]-[コマンド一覧]-[メニュー/マクロ]から実行され
る機能、早い話がユーザーメニューを呼び出すことがマクロからできないという
話です。
「通常のコマンドを実行する文」の項目は秀丸からキー操作などで直接されるコ
マンドをマクロから実行する場合についての説明です。

マクロでメニューを表示する方法は入力系の menu 文についての説明を読んでく
ださい。

> 配列の初期化に、添え字の省略と複数代入を許可出来ないものでしょうか。
>$foo[] = {"a","b","c"}
> こんな感じで。
> それと、要素数が一発で求められると有難いのですが。
>#math = sizeof($foo);
> こんな感じで。
> 一方的な意見ですが、どんなもんでしょうね?

秀丸のマクロはC言語風の文法になっているとはいえ、Cとは別物ですからねえ…
特に後者は「配列の大きさ」を指定する方法のない秀丸マクロで意味があるのか
どうか疑問です。
たとえば
 $foo[100] = "";
 message str(sizeof($foo));
と書いた場合、返す値は
・配列内はすべて空文字列だから 0
・定義済みの要素は一つだけだから 1
・0〜100まで配列が確保されたとして 101
のどれになればいいのか、など。

前者についてはきっと以前にも要望はあったんじゃないかと思います。確かにこ
ういう書き方ができるといいですよね。要望としては賛成です。
でも今のところは {} は while や if のような制御構文でしか使えない文法仕
様だと思われるので、わりと大きな変更になりそうな気がします。

中身を詳しく知っているわけではないので、あくまで推測ですが。

[ ]
RE:04222 メニューに付いて。No.04228
辺見!真琴 さん 04/03/27 23:44
 

> 秀丸ユーザーのアルビレオです。

 即答有難うございます。
 そして、返答が付いて行けず申し訳ございません(^^;


> マクロでメニューを表示する方法は入力系の menu 文についての説明を読んでく
> ださい。

 なるほど、メニュー違いでしたか。
 赤恥でした(^^;;;


> 特に後者は「配列の大きさ」を指定する方法のない秀丸マクロで意味があるのか
> どうか疑問です。
> たとえば
>  $foo[100] = "";
>  message str(sizeof($foo));
> と書いた場合、返す値は
> ・配列内はすべて空文字列だから 0
> ・定義済みの要素は一つだけだから 1
> ・0〜100まで配列が確保されたとして 101
> のどれになればいいのか、など。

 てっきり、未定義の0〜99は初期値のNULLかゼロまたは不定かのどちらかと、
素で思っておりました。
 なるほど・・・配列はゼロから通し番号で成り立っているとは限らないのですね。
 だとしたら、メモリ内に定義されている個数・・・ですかね?

 で、用途ですけど、配列の項目を全てをループで回したい時に、

loop = sizeof($foo);
while( loop > 0 ) {
    loop = loop -1;
    if ($foo[loop] ... ) { ...}
}

・・・と思っていたのですが、必ずゼロから始まる訳ではないのでは、
意味は薄いですね(^^;
 自分がゼロから使う習慣があるもので、決めて掛かっておりました。


> でも今のところは {} は while や if のような制御構文でしか使えない文法仕
> 様だと思われるので、わりと大きな変更になりそうな気がします。

 なるほど・・・。
 確かに、追加よりも変更は色々と面倒ですしね。
 でも、同じ中カッコ {} をつかって、変数宣言の方を拡張すれば良いような。
 まあ、変更は変更ですが(^^;


辺見!真琴

[ ]
RE:04228 メニューに付いて。No.04229
アルビレオ さん 04/03/28 00:30
 
アルビレオです。

> てっきり、未定義の0〜99は初期値のNULLかゼロまたは不定かのどちらかと、
>素で思っておりました。

秀丸マクロはポインタを扱えないのでNULLはありえません。
代入されていない変数の中身がどうなっているかは、どこにも書かれていないの
でなんともいえません。
今のマクロで実際に中身を確かめても、仕様と保証されているわけではないので
将来のバージョンアップで変わる可能性があります。
ドキュメントで保証していない以上は初期化していない変数の中身を期待しない
方がいいでしょう。

> なるほど・・・配列はゼロから通し番号で成り立っているとは限らないのですね。
> だとしたら、メモリ内に定義されている個数・・・ですかね?

「配列の大きさを宣言する方法がない」というのが重要です。
そもそも「メモリ内に定義されている個数」なんてものが存在しないわけです。
このあたりはCのようなコンパイラ言語ではなくインタプリンタ型言語であるこ
とから来る違いです。

Cならsizeof演算子は定数扱いでコンパイル時に値が確定しますが、
インタプリンタだと配列の大きさを決めずに
 $foo[10] = "abc";
 #before = sizeof($foo);
 $foo[100] = "def";
 #after = sizeof($foo);
という書き方ができてしまうので配列の大きさが定数にならないのです。

sizeof演算子相当のことをしたいなら、自分で #sizeof_foo といった変数を
セットして、配列の中身を初期化してから使うのがいいかと思います。

[ ]