forth - 如何访问 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
推荐阅读
- javascript - 如何为反应组件添加优先级?
- html - 如何将数组映射到头像元素
- sql - 如何在 DB2 存储过程中使用 SET OPTION
- vim - 如何在 {string} 所在的位置用之前的 `*` 搜索的结果预填充替代命令?
- rest - 带有 NGINX 入口控制器的 REST URI
- javascript - 在javascript中,为什么下面的代码不退出循环?
- android - Glide:当第一个 URL 加载失败时尝试第二个 URL
- php - 将月份名称格式化为当地语言
- javascript - 如何使用赛普拉斯测试网页已禁用滚动?
- html - 无论屏幕大小如何,在元素上保持相对于其他元素的相同位置