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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0716
siki__変数のスコープで戸惑い3解決


siki__

リンク

2020/7/16(Thu) 23:30:35|NO.91007

ちょっとしたことなのですが

#module hoge #deffunc foo mes hoge return #deffunc bar mes hoge return #global
上記の設定でfooとかbarとか呼んでもhogeが表示出来ないけれど、hogeをどちらかの#deffuncの中に入れるとfooでもbarでも表示出来るのは仕様なのでしょうか。



この記事に返信する


あらや

リンク

2020/7/17(Fri) 22:14:52|NO.91015

HSPは根本的に1行ずつ順番に解釈するインタプリタなので
#deffuncの外で定義された変数は文法的に問題が無くても
単純にその行を通っていないだけだと思います。

更に言うと個人的には#deffuncなどは
『引数や戻り値を設定できるラベルの変形』だと思っています。

つまり

#module hoge = 10 #deffunc foo mes hoge return #global foo
これと


goto *l_2 *l_1 // モジュールの開始 hoge = 10 *foo mes hoge return // モジュール終了 *l_2 gosub *foo
これは同じような意味になるではないかと。

後者のソースをたどっていくとわかると思いますが
モジュールの中でhogeに数値を入れていても
fooの外なので流れ的に hoge=10 の行は通らずに
ゼロが表示されるだけになってしまいます。

モジュール内で使った変数にモジュール外からアクセスすることも出来ますし、
Cなど他言語の書き方を疑似的に再現しているだけであって
『関数や命令の外に書いた変数はグローバル変数、中で書けばローカル変数』
ではなく
『どこに書いても全てがグローバル変数』
と考えるべきなのではないかなと思いました。



siki__

リンク

2020/7/27(Mon) 17:56:04|NO.91078

なるほど、モジュールはgotoでスキップしていなくても内部ではスキップしているということですか。
ありがとうございます。謎が解けました。

あと気になっている点として、noteload でファイルが読めないということがあります。
モジュールの中のユーザー定義命令の中に記述すると発生します。hsp3utf.asをincludeしています。ファイル名は直接指定なのでスコープは関係無いかもしれません。また、ダイアログの戻りrefstrを使うと正常に読めることから文字コードのせいかと思っています。
これ以上はスレ違いかな。



siki__

リンク

2020/7/27(Mon) 21:40:00|NO.91081

すみません、自己解決しました。
GUIへの反映を忘れていました。
あと、ダイアログ後のstat値をnoteloadが返すstatだと勘違いしていました。noteloadはstat返さないんですね。



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