トピック
MIKI ifconfig

def の呼び出し深度

更新が来なかったけど、e-shop から 3.5.2 にしました。 def f i ? i f i+1 end f 0 を実行して def の呼び出し深度を確認したら、i=2046 まで動いてびっくり。 で、3.3.2 で調べたら同じく i=2046 でした。 以前は 32 くらいだったと思ったのですが、いつからこんなに深くなったのでしょうか???
9そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
手元にある動体保存している初期版(ver.3.0.0)のプチコン3号で動作確認してみたところ「1022」まで動いたので「32」というのは何かの勘違いだと思います。 「2046」まで増えたのはいつか分かりませんが、DEFの仕様が変わったのはver.3.1.0なのでそのあたりのタイミングかもしれませんね。
1そうだね
プレイ済み
返信[2]
親投稿
MIKI ifconfig
おちゃめさん、ご確認ありがとうございます。 32はただの記憶違いでしたか。 海馬がスカスカでいやになっちゃいます・・・ gosub はメモリある限りっぽいのに、なぜ def は固定されてるのだろう???
1そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
GOSUBも16384段しか使用できません。 GOSUBにしろDEFにしろ使用時にはスタックメモリを消費する関係でメインメモリの空きとは無関係に制限があるのは仕方がないことだと思います。
1そうだね
プレイ済み
返信[4]
親投稿
DEFの中でDEFって呼び出せたんですねー((((;゚Д゚))))))) しかも宣言中?のやつの中で。
2そうだね
プレイ済み
返信[5]
親投稿
MIKI ifconfig
gosub も固定でしたか。であれば、まあ潔い実装なのでいいでしょう。 仮引数の数で変化しますね。(option defint は影響しない) 0個 2730回 1個 2047回 2個 1638回 3個 1365回 4個 1169回 5個 1023回 gosub と def は同じスタックを消費するみたいですね。 16384 / 2730 = 6 なので def 引数なしを 1 回呼び出すコスト = gosub 6 回呼び出すコスト となる感じ。
0そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
オワたずさん 呼び出せるんですよ~~~ 私は gosub 使わない派なので、全部 def で書きますよ。 自分自身を呼び出すのは「再帰呼び出し」と言います。 ↓再帰呼び出し使った音楽です。短いのでゼヒうちこんでみてちょ! https://miiverse.nintendo.net/posts/AYIHAAAEAABEVRTpSr38Cg ↓再帰の詳しい説明がありますので読んでみてください! https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0fD0CUEZQ
0そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
gosub の限界まで呼び出すプログラム (プチコン 3.5.2) 1: option strict 2: option defint 3: var j = 1: gosub @p : end 4: @p if j == 16384 - 0 then ? : return 5: j = j + 1: gosub @p これで run すると 4 行目の ? を実行して正常終了します。 4行目の ? を ? j に変えると 4 行目で stack overflow を起こします。 そこで 4行目を if j == 16384 - 2 に変えると ? 0 を実行できるようになります。 これで、? が j を表示するのに gosub 2 回分のスタックを消費することが分かります。 式の複雑さは影響しないみたい。 でも ? j, j にすると gosub 6 回分必要になります。
1そうだね
プレイ済み
返信[8]
親投稿
MIKI ifconfig
option strict でも未定義関数の呼び出しはチェックしませんよね。 互いに呼び出しあうような f と g があったとすると def f g end def g f end どっちを先に書いても、未定義関数を呼び出すことになってしまいます。 しかも回避方法が存在しない。 option strict が未定義関数チェックをしないのは、もしかしたらこれが理由かもしれませんね。 同じワンパスコンパイラである Pascal ではこれを解決するために forward という命令を用意して、 forward g で g という関数を前もって宣言できるようになっています。
0そうだね
プレイ済み
返信[9]
親投稿
ish owlis1
3号はCOMMON DEFであっても、実行中のスロット以外に書かれた関数を動的に変更できますから。 プログラム開始時に、静的な関数存在チェックは仕様的に無理なんでしょうね。
0そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
ああ、なるほど。exec/use は気づきませんでした。 勉強になりました。 ありがとうございます。
0そうだね
プレイ済み