grep basename2, …で検索文字列が空にNo.07459
IKKI さん 05/04/20 07:55
 
IKKIです。

次の a.mac は期待どおりに動きますが、 b.mac は何にもヒットしません。 grep 結
果ウィンドウのタイトルバーを見ると「grep "" *.html」になっています。
ちょっと調べていただけますでしょうか。

// a.mac
$a = basename2;
grep $a, "*.html", directory2;

// b.mac
grep basename2, "*.html", directory2;

(秀丸 v5.0β18, Windows XP SP2)

[ ]
RE:07459 grep basename2, …で検索文字列No.07462
三月 さん 05/04/20 12:16
 
>
>// b.mac
>grep basename2, "*.html", directory2;
>
単にgrep結果のウインドウに対応するファイル名をbasename2が拾ってる
だけじゃないかと思われるのですが?

未保存のgrep結果にはファイル名は有りませんよね。

[ ]
RE:07462 grep basename2, …で検索文字列No.07463
Iranoan さん 05/04/20 12:40
 
 IKKI さん、三月さん今日は、Iranoan です。
> 単にgrep結果のウインドウに対応するファイル名をbasename2が拾ってる
> だけじゃないかと思われるのですが?
 その通りだと思います。三月さんの仰ることと違っているといけないので、
念の為書きますが、「原因は、basename2 を展開されるのが grep 文の為の
ウィンドウが開いて後だから。」ということですね。ただ IKKI さんが仰りた
いのは「同じウィンドウで実行した時に、
> // a.mac
> $a = basename2;
> grep $a, "*.html", directory2;
>
> // b.mac
> grep basename2, "*.html", directory2;
で動きが異なるのはおかしくないか?」という要点で、「直感的な動きとは言
えない」ということでしょう。
 ##恐らく directory2 の展開タイミングも同じでしょうが、カレント・ディ
レクトリは変化しないので、顕在化しないのでしょう。

[ ]
RE:07463 grep basename2, …で検索文字列No.07465
M.D.S.-Toy さん 05/04/20 14:31
 
Toyです。
さすがにちょっと見過ごせないと思ったので・・・。

結論から言うと、命令実行(ここではgrep)の前に引数の展開が行われることを希望
します。
自分がマクロを書くとしても、引数の展開が先に行われることを直感的というより当
然のように期待してしまうと思います。

また、あまり関係ないかもしれませんが、関数はネストしていても内側(外側の関数
から見て引数)から評価されますよね。
例えば以下の文は正しく動作します。
message leftstr(str(12345), 3);


# 構文解釈の都合で難しいのかもしれませんが・・・。

[ ]
RE:07465 grep basename2, …で検索文字列No.07467
秀丸担当 さん 05/04/20 15:24
 

原因としては三月さんやIranoanさんの言われる通りのようです。
修正は可能だと思いますが、grepはV1.xxの頃からこの動作で、従来と動作が異
なることにより互換性が失われるのが心配です。
localgrepのほうは期待通りの動作をします。

[ ]
RE:07467 grep basename2, …で検索文字列No.07494
Iranoan さん 05/04/21 14:02
 
 秀丸担当さん今日は、Iranoan です。
> 修正は可能だと思いますが、grepはV1.xxの頃からこの動作で、従来と動作が異
> なることにより互換性が失われるのが心配です。
 互換性は確実に失われます。しかし今回の場合、それが問題になることが現
実としてあるのか疑問です。何故なら、現在の仕様では filename であれ
basename であれ空の文字列になってしまい、通常それを検索するということ
は考えられないからです。

[ ]
RE:07494 grep basename2, …で検索文字列No.07506
秀丸担当 さん 05/04/21 18:01
 

> 互換性は確実に失われます。しかし今回の場合、それが問題になることが現
>実としてあるのか疑問です。何故なら、現在の仕様では filename であれ
>basename であれ空の文字列になってしまい、通常それを検索するということ
>は考えられないからです。

確かにその通りです。でも仕様を変更することで何が問題が起きるかはわからな
いので、慎重に考えたいと思います。

[ ]
RE:07506 grep basename2, …で検索文字列No.07511
Iranoan さん 05/04/21 18:44
 
 秀丸担当さん今日は、Iranoan です。
> 確かにその通りです。でも仕様を変更することで何が問題が起きるかはわからな
> いので、慎重に考えたいと思います。
 確かに今気が付かないだけかもしれませんけど...。

[ ]
RE:07467 grep basename2,…で検索文字列No.07516
IKKI さん 05/04/22 00:58
 
IKKI です。こんばんは。

> 原因としては三月さんやIranoanさんの言われる通りのようです。
> 修正は可能だと思いますが、grepはV1.xxの頃からこの動作で、従来と動作が異
> なることにより互換性が失われるのが心配です。

これは度肝を抜かれる仕様です。引数の評価より前に文が実行されるとは!
修正しないのであればマクロヘルプに明記するべきだと思います。

「grepは」というのが若干気になりますが、新しいウィンドウを開く文で
引数をとるものは全部この動作なのでしょうか。


マクロヘルプに関して言うと…
C言語と違う部分はすべて明記したほうがいい気がします。
例えば「&& や || は左辺の値にかかわらず常に右辺を評価する」など。
マクロヘルプはC言語の知識を前提として書かれているので
「明記してない部分はC言語と同じ」と思いがちです。
これで何度かハマった記憶があります。

[ ]
RE:07516 grep basename2,…で検索文字列No.07950
秀丸担当 さん 05/05/30 13:45
 

いまさらですが指摘がありましたのでコメントさせていただきます。

>「grepは」というのが若干気になりますが、新しいウィンドウを開く文で
>引数をとるものは全部この動作なのでしょうか。

この動作になってしまっているのは、grep文だけです。

>C言語と違う部分はすべて明記したほうがいい気がします。
>例えば「&& や || は左辺の値にかかわらず常に右辺を評価する」など。

これは、具体的にいうと、どういった点でしょうか。
演算子のC言語との違いは、目次→式について→演算子で書かれています。

[ ]
RE:07950 grepbasename2,…で検索文字列がNo.07966
IKKI さん 05/05/30 23:16
 
IKKI です。こんばんは。

> いまさらですが指摘がありましたのでコメントさせていただきます。

わざわざすみません。

> この動作になってしまっているのは、grep文だけです。

承知しました。注意して使うようにします。

# 私だけが注意しても仕方ないんで、ヘルプに書いた方がいいと思います。

> >C言語と違う部分はすべて明記したほうがいい気がします。
> >例えば「&& や || は左辺の値にかかわらず常に右辺を評価する」など。
>
> これは、具体的にいうと、どういった点でしょうか。

! 演算子の優先順位が低い点もハマりがちです。
ヘルプの一覧表をよく見ればわかるけど、文章では注意されていない。。

今のところ思い出せるのは上記の2点だけです。
他にも微妙な違いがあったらイヤだなぁ(見つけにくいバグの原因になる)
と思って書きました。また何か見つけたら指摘させていただきます。

[ ]
RE:07966 grepbasename2,…で検索文字列がNo.07981
秀丸担当 さん 05/06/01 11:12
 

>! 演算子の優先順位が低い点もハマりがちです。
>ヘルプの一覧表をよく見ればわかるけど、文章では注意されていない。。

! も文章の中に入れておきます。
もし何か気付く点があったら指摘お願いします。

[ ]