2

经过大约几个小时的反复试验,我不知道该怎么做......这是我正在处理的代码:

: format
    ( n ds -- )
    >r            cr .s
    dup              cr .s
    >r               cr .s
    abs              cr .s
    s>d              cr .s
    <# [char] bl hold #s r> sign #> cr .s
    r@               cr .s
    dup              cr .s
    c@               cr .s
    dup >r           cr .s
    chars +          cr .s
    char+            cr .s
    swap             cr .s 
    dup              cr .s
    >r               cr .s
    cmove            cr .s
    r> r> +          cr .s
    r>               cr .s
    c!
;

顺便说一句......没有更简单的方法来打印输出,类似的东西printf会很棒。另一种可能性是将空格字符指定为一种字符串的第一个字符s" "

编辑:

我发现我可以做到:s\" \040 test"在 Gforth 中(尽管手册上说它不是标准的)。这s\" \x20 test"可能是标准的,但我不太明白句子中表示它是否标准的部分在哪里相关。不过,我很高兴知道如何将它与图中的数字输出结合起来。

编辑2

这就是我希望它被使用的方式:

create test 256 allot
s" prefix " test place
123 test format
s" suffix" test place+
test count type \ prefix 123 suffix
4

1 回答 1

2

我认为对于这个例子,你不需要在这些<# #>东西中添加空间。您可以使用 . 定义带有前导或尾随空格的字符串s"

所以如果你从

\ Push addresses and lengths for the prefix and the number
s" prefix "         \                             -- addr  u
123 s>d <# #s #>    \                      addr u -- addr u addr2 u2

你想要的词是连接它们的东西,例如:

: concatenate
    \ Moves the string addr2 u2 to the end of the string addr u
    >r >r                \        addr u addr2 u2 -- addr u
    dup >r over r> + r>  \                 addr u -- addr u addr+u addr2
    swap r@              \                 addr u -- addr u addr2 addr+u u2
    cmove r> + ;         \ addr u addr2 addr+u u2 -- addr u+u2

因此,如果您调用它并输出结果字符串,如下所示:

concatenate type

输出将是“前缀 123”

然后,您可以将相同的单词应用于字符串“prefix 123”和“suffix”。

这不使用与您的示例完全相同的内存位置,但可以对其进行调整,并且只是我可以演示它的最简单方法。


作为对评论的回应,您似乎非常接近在图片输出中嵌入字符,我认为您只需要删除[char]例如

123 s>d <# # bl hold # bl hold # #>

应该生成一个像“1 2 3”这样的字符串

于 2013-08-16T19:46:35.687 回答