当一个单词被重新定义时,是否可以访问旧单词?
想象一下有一个词foo被定义和重新定义
: foo ( n -- 2*n ) 2* ; ok
: foo ( n -- 2*n+1 ) foo 1+ ; redefined foo ok
10 foo . 21 ok
Run Code Online (Sandbox Code Playgroud)
foo这里执行了两个定义。
是否可以执行第一个定义(“second-foo”)?
21 second-foo . 42 ok
Run Code Online (Sandbox Code Playgroud)
到see它吗?
see second-foo
: foo
2* ; ok
Run Code Online (Sandbox Code Playgroud)
访问隐藏定义的一个简单方法是在创建同名的新定义之前创建该定义的同义词。
synonym old-foo foo
: foo ... ;
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用内省工具,即单词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
;
Run Code Online (Sandbox Code Playgroud)
该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"
Run Code Online (Sandbox Code Playgroud)
在 Gforth 中,该词xt-see可以用作:
"foo" 1 forth-wordlist find-name-nth-in ?name name>interpret xt-see
Run Code Online (Sandbox Code Playgroud)