[英]How can I access a shadowed definition in 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
訪問影子定義的一種簡單方法是在創建具有相同名稱的新定義之前為該定義創建同義詞。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.