首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Gforth的解释器指令的word定义中的新行

使用Gforth的解释器指令的word定义中的新行
EN

Stack Overflow用户
提问于 2015-01-12 11:33:29
回答 1查看 215关注 0票数 1

我正在使用Gforth的解释器指令(非ANS标准)控制结构,如手册5.13.4口译指令部分所述。我基本上想要使用循环单词来创建一个包含文字的动态大小的单词。例如,我想出了这个定义:

代码语言:javascript
复制
: foo
   [ 10 ] [FOR]
      1
   [NEXT]
   ;

然而,这会在[FOR]之后产生地址对齐异常(是的,我知道您不应该在Forth中使用for循环)。这只是一个简单的例子)。

最后,为了确保循环的正确执行,必须将循环写成一行代码。这样做

代码语言:javascript
复制
: foo [ 10 [FOR] ] 1 [ [NEXT] ] ;

相反,它是按预期工作的。运行see foo会产生:

代码语言:javascript
复制
: foo  
    1 1 1 1 1 1 1 1 1 1 1 ; ok

这正是我想要的。

有什么方法可以在单词定义中找到新行吗?我想写的单词要复杂得多,对于演示文稿,我需要它们更好的格式化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-13 00:24:27

最好用一个直接的词来代替。例如,

代码语言:javascript
复制
: ones ( n -- ) 0 ?do 1 postpone literal loop ; immediate
: foo ( -- ten ones )  [ 10 ] ones ;

使用SEE FOO生成与您的示例相同的结果。使用POSTPONE,特别是使用Gforth的]] .. [[语法,重复的代码可以像您喜欢的那样详细。

多行[FOR]需要做四件事:

  1. 使用REFILL读取后续行。
  2. 保存读入行,因为您需要逐一对它们进行评估,以保留期望行的解析行为(例如注释:\ )。
  3. 当您匹配终止的[NEXT]时,停止按行读取,然后循环。
  4. 注意在[NEXT]之后离开>IN,这样解释就可以正常进行。

您可能仍然会遇到一些代码问题,比如代码检查SOURCE-ID

关于使用REFILL跨多行解析的示例,下面是Gerry从CLF最近发布的一篇文章编写的代码:

代码语言:javascript
复制
: line,  ( u1 caddr2 u2 -- u3 )
    tuck here swap chars dup allot move +
; 

: <text>  ( "text" -- caddr u )
    here 0
    begin
        refill
    while
        bl word count s" </text>" compare
    while
        0 >in ! source line, bl c, 1+
    repeat then
;

它收集<text>和位于自己行的</text>之间的所有内容,比如这里的文档,同时也添加空格。为了以一种简单的方式为[FOR]保存各个行,我建议将0保留为数据堆栈上的哨兵,然后将SAVE-MEM 'd行放在上面。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27901018

复制
相关文章

相似问题

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