HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1114
玄冬ローカル命令のモジュール名が省略できたりできなかったりする9解決


玄冬

リンク

2010/11/14(Sun) 03:12:41|NO.35805


#module mod_test #deffunc test1 test2 "test1" return #deffunc local test2 str p_str mes p_str return #global test1 test2@mod_test "test2"


#module mod_test #deffunc local test2 str p_str mes p_str return #deffunc test1 test2 "test" return #global test1 test2@mod_test "test2"

の2つは命令test1とtest2の記述の順が違うだけなのですが、前者は意図通りに"test1\ntest2"と出力されますが、後者は
test2 "test"

が文法エラーといわれてしまいます。(@mod_testを足すときちんと動きます。) 1.これはなぜなんでしょうか? 2.また、#deffuncのマニュアルには「local指定により登録された名称は、必ず「名称@モジュール名」の形式で呼び出す必要があります。」と書かれています。 前者は動いていますが、やはりモジュール名は省略しないほうがよいのでしょうか?



この記事に返信する


玄冬

リンク

2010/11/14(Sun) 03:15:31|NO.35806

ごめんなさい</pre>が抜けたようです。
読み辛くなってしまって申し分けない。

回答よろしくお願いいたします。



レノス

リンク

2010/11/14(Sun) 04:45:50|NO.35808

1.
前者 (test2の定義より前) と後者 (test2の定義より後) では、
コンパイル時に test2 を探す手順が異なるのですが、
そのために結果が違ってしまうのだと思います。

2.
マニュアルにこんなことが:
> local指定により登録された名称は、必ず「名称@モジュール名」の形式で呼び出す必要があります。
書いてある以上、前者で省略できることはバグでしょうから、
省略しない方がいいです。



玄冬

リンク

2010/11/14(Sun) 15:07:13|NO.35822

レノス様

ご回答ありがとうございます。
やはりバグなんですか。
マニュアルの例がモジュール外からローカルの命令を呼び出すものだったので、同一モジュール内からの呼び出し時は省略してもOKな仕様になってるのかと(実際動いたということもあり)自分に都合よく解釈してたんですが、これからはモジュール名をつけるようにしようと思います。



ANTARES

リンク

2010/11/15(Mon) 01:00:46|NO.35841

>> local指定により登録された名称は、必ず「名称@モジュール名」の
>>形式で呼び出す必要があります。
>書いてある以上、前者で省略できることはバグでしょうから、
 省略できないと書いてあるから省略できるのはバグというのは
ちょっと違うのでは?

>自分に都合よく解釈してたんですが、これからはモジュール名を
>つけるようにしようと思います。
 注目すべきはモジュール名をつける必要があるかどうかより
「モジュール内でのみ使用される命令を定義する」というlocalの
使用目的の方でしょう。
グローバル領域で使うことを選択した時点でlocalの使用目的に反する
使い方をすることになったわけですから、local指定を外すべきでしょう。
(その場合にtest2@mod_testがエラーになることの方がバグな気がする)



レノス

リンク

2010/11/15(Mon) 12:28:07|NO.35843

なるほど。
マニュアルの例の方をよく見ないで答えてしまいました。すみません。
> モジュール内でのみ使用される命令を定義する場合などに使用することができます
説明と例が矛盾してますね。

> (その場合にtest2@mod_testがエラーになることの方がバグな気がする)
そんな気がしてきました。

> 省略できないと書いてあるから省略できるのはバグというのは
> ちょっと違うのでは?
仕様と実装が食い違っている(= 開発者の思ったとおりに動作していない)ことを
バグと呼びました。
(* マニュアルの説明文だけ見て、同一モジュール内からも
  省略できない仕様だと思っていました)

-----
ただ、実際に、local が定義より後にあるときだけ省略できないので、
やはり省略しない方に統一した方がいいのではないでしょうか?



玄冬

リンク

2010/11/19(Fri) 10:27:33|NO.35901

あれ?解決済みの後に書き込みが!

気付きませんでした。済みません。

>>ANTARES様
>>レノス様
ご回答ありがとうございます

お二方の書き込みから、気になったことが…
(理解力が低いので、お二方の仰ってることの復唱になってたり、
質問しておいて、お二方のご回答にケチつけるようなことになってたり、
的外れな事言ってたりするかも知れませんが、ご容赦下さい。)

>説明と例が矛盾
ので、あまりアテにならないとして

>仕様と実装が食い違っていることをバグと呼びました。

結局
『モジュール名を省略できる仕様に対して、一部省略できない実装』
『モジュール名を省略できない仕様に対して、一部省略できる実装』
どっちなのかが気になります。

>「モジュール内でのみ使用される命令を定義する」というlocalの使用目的の方でしょう。

ここも気になるところです。

バグが後者だとすると、なんでモジュール内でのみ使う命令をモジュール内で呼び出すのに
モジュール名つける必要があるってのが今一???。

同じく「モジュール内でのみ使用される」ものに変数がありますが、こちらは
『通常、同一モジュール内では参照にモジュール名が要らず、
どうしても他モジュールから参照するときは@モジュール名を添えて参照する』
という仕様になっています。(こういうのをスコープって呼ぶんでしたっけ?)

だから、ローカル命令も
『同一モジュール内では呼出にモジュール名が要らず、
どうしても他モジュールから呼ぶときには@モジュール名を添える。』
という仕様なのだろうと、勝手に思い込んでたわけですが、

>その場合にtest2@mod_testがエラーになることの方がバグな気がする

とは

#module mod_test #deffunc f_test str p_str mes p_str return #global test@mod_test "test

こういうことですよね?

これはグローバルに属する"f_test"をモジュールmod_testに属する
ものとして呼び出したから、エラーになっているのでは?

って考えると、あながち私の思い込みではなく
『モジュール名を省略できる仕様に対して、一部省略できない実装』
なのではないかと思えてくるのですが?

>ただ、実際に、local が定義より後にあるときだけ省略できないので、
>やはり省略しない方に統一した方がいいのではないでしょうか?

その方法であれば、どっちのバグだったとしても
対応できる最良の手だとは思うんですが、
この仮説が正しければ、
『ローカル命令はモジュールの末尾に書きましょう。』
っていう統一の方法もあるのでは?

バグが修正されたとき、省略できなくなるというのであれば、
モジュール名つけるのもやぶさかではないのですが、
バグ修正後も省略できるなら、記述位置が限定されても
省略していたいという気持ちが強いです。

これは、管理人様から回答もらわないとバグの修正が
どうなるのかわからないんでしょうか?
(ひょっとしてバグ報告て何かしないといけない?)

長文失礼致しました。



ANTARES

リンク

2010/11/20(Sat) 03:13:00|NO.35920

>『同一モジュール内では呼出にモジュール名が要らず、
>どうしても他モジュールから呼ぶときには@モジュール名を添える。』
>という仕様なのだろうと、勝手に思い込んでたわけですが、
誤:どうしても他モジュールから呼ぶときには
正:どうしても他モジュールまたはグローバル領域から呼ぶときには

 グローバル領域は、当然、モジュール外です。


>グローバルに属する"f_test"
 どうしてそう考えるのか、理解に苦しみます。



ANTARES

リンク

2010/11/20(Sat) 04:18:04|NO.35924

>>グローバルに属する"f_test"
> どうしてそう考えるのか、理解に苦しみます。
 あ、そうか、「local」を外したからグローバルということですね。
この場合のグローバルは、グローバルに(モジュール名指定なしで)
アクセス可能という意味で、「グローバルに属する」わけではありません。



ANTARES

リンク

2010/11/20(Sat) 04:37:18|NO.35925

 HSPの仕様はかなりいい加減なんで、
あまり厳密に考えると頭がパニクっちゃいます。



ONION software Copyright 1997-2023(c) All rights reserved.