首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问Forth中的阴影定义?

如何访问Forth中的阴影定义?
EN

Stack Overflow用户
提问于 2021-09-24 08:42:32
回答 1查看 131关注 0票数 4

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

假设有一个单词foo被定义和重新定义

代码语言:javascript
复制
: foo ( n -- 2*n ) 2* ;  ok
: foo ( n -- 2*n+1 ) foo 1+ ; redefined foo   ok
10 foo . 21  ok

这里的foo执行了两个定义。

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

代码语言:javascript
复制
21 second-foo . 42 ok

see吗?

代码语言:javascript
复制
see second-foo
: foo
  2* ; ok
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-24 14:22:53

访问隐藏定义的一种简单方法是在创建同名新定义之前为该定义创建同义词。

代码语言:javascript
复制
synonym old-foo foo
: foo ... ;

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

代码语言:javascript
复制
: 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来表示给定单词列表中的给定名称,而在之后,在单词list中定义了确切的具有相同名称的 u 单词(大小写敏感),否则就定义了0。

测试用例:

代码语言:javascript
复制
: ?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一词可以用作:

代码语言:javascript
复制
"foo" 1 forth-wordlist find-name-nth-in ?name name>interpret xt-see
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69312047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档