Forth语言:能否创建地址为已知地址的变量?
实现直接关联目标地址的Forth“变量”
当然可以做到不用每次间接寻址,直接让一个名字对应->list返回的目标地址,下面是两种实用方法:
方法一:用VALUE快速绑定
当->list返回列表地址后,直接用VALUE定义一个词,让它直接返回该地址:
1 2 3 3 ->list VALUE mylist
之后调用mylist就会把列表地址推到栈上,访问元素时不用再额外取一次变量里的值:
mylist @ . \ 输出列表第一个元素1 mylist 1 cells + @ . \ 输出列表第二个元素2
如果之后需要让mylist指向新的列表,用TO就能更新:
4 5 2 ->list TO mylist
方法二:自定义地址变量(更灵活)
如果需要更定制化的行为,可以自己定义一个专用的地址变量类型:
: ADDR-VAR ( addr -- ) CREATE , \ 把传入的地址存入新创建的词的内存区 DOES> ( -- addr ) @ ; \ 调用这个词时返回存储的地址
使用方式和VALUE类似:
1 2 3 3 ->list ADDR-VAR mylist
要是需要更新这个变量指向的地址,可以再加一个辅助词:
: TO-ADDR-VAR ( addr var -- ) ! ; \ 给ADDR-VAR类型的变量赋值
更新时这样用:
4 5 2 ->list mylist TO-ADDR-VAR
原理说明
原来的VARIABLE是在字典里分配一块新内存来存储地址,所以需要mylist @才能拿到目标地址;而上面的方法是让定义的词直接返回你需要的列表地址,相当于把名字和目标地址直接绑定,省去了一次间接寻址的步骤,完全满足你“可选关联变量名”的需求。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

