JavaScripter の amachang さんの 「再帰→ループ」の変換が大変だった件 - IT戦記 という記事を読んで、再帰はループで表現できるはず
とあったので本当かなあ、と思って HSP でやってみました。
ループに変換する元の再帰スクリプト。全てのサブディレクトリを辿っていくスクリプトです。
// 再帰
#module
#deffunc digFolder str path, local folderList, local folder, local idx
await
mes path
dirlist folderList, path + "\\*.*", 5
idx = 0
repeat
getstr folder, folderlist, idx
if ( strsize == 0 ) {
break
}
idx += strsize
digFolder path + "\\" + folder
loop
return
#global
#include "hspext.as"
sdim folder, 512
selfolder folder, ""
digFolder folder
dialog "完了!"
stop
で、見よう見まねでループに変換しました。スタックは配列変数で代替。
// ループ
#module
#deffunc digFolder str _path, local path, local folderList, local idx, local stack, local folder
sdim folderList, 8192, 256
dim idx, 256
stack = 0
path = _path
mes path
dirlist folderList.stack, path + "\\*.*", 5
idx.stack = 0
repeat
repeat
await
getstr folder, folderList.stack, idx.stack
if ( strsize == 0 ) : break
idx.stack += strsize
stack ++
path += "\\" + folder
mes path
dirlist folderList.stack, path + "\\*.*", 5
idx.stack = 0
loop
if ( stack == 0 ) {
break
}
stack --
// パスを一つ上の階層に戻す ( ex. "C:\aa\bb" -> "C:\aa" )
path = getpath( path, 32 )
poke path, strlen( path ) - 1
loop
return
#global
#include "hspext.as"
sdim folder, 512
selfolder folder, ""
digFolder folder
dialog "完了!"
stop
出来てるー!ちょっと感動。