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(可以理解)抱怨堆栈效应不匹配。我该怎么做才能让它正确递归?