USING: accessors html.parser.analyzer io kernel math namespaces
present regexp sequences ;
IN: all-roads-to-wiki
SYMBOL: G
: match-good-pages ( a -- ?/f )
R/ \/wiki\/[^:]*$/ first-match ;
: filter-urls ( tags -- urls )
find-hrefs [ present ] map
[ match-good-pages ] filter
[ match-good-pages seq>> ] map ;
: findpath ( url -- url )
G get =
[
! false
]
[ scrape-html nip
[
dup "title" find-by-name drop 1 + swap nth
text>> R/ - Wikipedia,/ re-split first print
]
[
"bodyContent" find-by-id-between filter-urls [ findpath ] map
] bi
] if ; inline recursive
: allroads-entry ( -- a )
readln "http://en.wikipedia.org/wiki/" prepend G set-global
"enwp.org/Special:Random" findpath ; inline
上記のコードは、探しているリンクが見つかるまで、ウィキペディアのすべてのリンクを再帰します。
(うまくいけば)findpath最終的には「戻り」(つまり、自分自身を再度呼び出さない) ため、スタックに巨大なネストされたデータ構造が残るため、それは問題ありません。しかし、これをコンパイルしようとすると、unbalanced-recursionエラーが発生します。
再帰的な単語「findpath」は、スタックの高さが正しくありません
unbalanced-recursion: スタック効果の推論により、インライン再帰ワードに不適切なスタック効果宣言があると判断された場合にスローされます。
私が何をしようとも、Factor は (当然のことながら) スタック効果が一致しないと不平を言っています。これを適切に再帰させるにはどうすればよいですか?