重新定义但仍然活着

问题描述 投票:0回答:1

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
已经在单词词典中被替换了?是否可以访问/查看循环定义(第二个)?

forth
1个回答
0
投票

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”中有一个正弦查找表的例子。 该表称为正弦,访问该表的字也称为正弦。 这意味着在定义第二个正弦值后,没有人可以意外写入正弦表。

© www.soinside.com 2019 - 2024. All rights reserved.