在Starting Forth教程的第4节中,第5个问题的答案是:
: STAR [CHAR] * EMIT ;
: STARS ( #stars -- ) 0 ?DO STAR LOOP ;
: STARS ( n -- ) ?DUP IF STARS THEN ;
第三个定义使用之前的定义重新定义了
STARS
词。
翻译说:
redefined STARS ok
当我打字时
see
:
SEE STARS
: STARS
?dup
IF STARS
THEN ; ok
为什么以前的定义仍然存在,因为单词
STARS
已经在单词词典中被替换了?是否可以访问/查看循环定义(第二个)?
STARS
的第二个定义尚未取代第一个定义。 它已经隐藏了它。 第二个定义调用第一个定义。
words
STARS STARS STAR mov-regv-Iv mov-reg8-Ib xchg-ax jcc-short conditions...
\ Stars appears twice in the words listing
第四个翻译在词典中搜索单词的最新定义。 在这种情况下,一旦找到
STARS
,它就会停止继续寻找。
: STAR [CHAR] * EMIT ;
: (STARS) ( #stars -- ) 0 ?DO STAR LOOP ;
: STARS ( n -- ) ?DUP IF (STARS) THEN ;
see stars
: STARS
?dup
IF (STARS)
THEN ; ok
see (stars)
: (STARS)
0
?DO STAR
LOOP
; ok
words
STARS (STARS) STAR mov-regv-Iv mov-reg8-Ib ...
通过将第一个
STARS
命名为其他名称,在这里 (STARS)
,仍然可以访问第一个定义。
这种隐藏对于常量数据表非常有用。 我认为在“Starting Forth”中有一个正弦查找表的例子。 该表称为正弦,访问该表的字也称为正弦。 这意味着在定义第二个正弦值后,没有人可以意外写入正弦表。