首页 > 解决方案 > 如何访问 Forth 中的阴影定义?

问题描述

当一个词被重新定义时,是否可以访问旧词?

想象有一个词foo定义和重新定义

: foo ( n -- 2*n ) 2* ;  ok
: foo ( n -- 2*n+1 ) foo 1+ ; redefined foo   ok
10 foo . 21  ok

foo这里执行了两个定义。

是否可以执行第一个定义(“second-foo”)?

21 second-foo . 42 ok

see它?

see second-foo
: foo
  2* ; ok

标签: forthgforth

解决方案


访问影子定义的一种简单方法是在创建具有相同名称的新定义之前为该定义创建同义词。

synonym old-foo foo
: foo ... ;

另一种方法是使用自省工具,即单词traverse-wordlist. 使用这个词我们可以定义一个find-name-nth-in与标准化词相似的词find-name-in ( c-addr u wid -- nt|0 ),但它会找到第 n 个阴影词,如下所示:

: find-name-nth-in ( c-addr1 u1 u wid -- nt|0 )
  >r 1+
  [: ( sd u nt -- sd u true | sd nt 0 false )
    2>r 2dup r@ name>string compare if rdrop r> true exit then
    r> r> 1- dup if nip then dup 0<>
  ;] r> traverse-wordlist ( sd u | sd nt 0 )
  if 2drop 0 exit then nip nip
;

find-name-nth-in单词返回给定单词列表中具有给定名称的单词的nt ,之后在单词列表中定义了具有相同名称(区分大小写)的确切u个单词,否则为 0。

一个测试用例:

: ?name ( nt|0 -- nt ) dup 0= -13 and throw ;

: foo ." old" ;
: foo ." new" ;

"foo" 0 forth-wordlist find-name-nth-in ?name name>interpret execute
\ prints "new"

"foo" 1 forth-wordlist find-name-nth-in ?name name>interpret execute
\ prints "old"

在 Gforth 中,这个词xt-see可以用作:

"foo" 1 forth-wordlist find-name-nth-in ?name name>interpret xt-see

推荐阅读