将文字空间字符添加到图示的数字输出中

时间:2013-08-14 22:05:38

标签: string-formatting forth

经过几个小时的反复试验,我无法想办法...这是我正在处理的代码:

: 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" "种字符串的第一个字符。

修改

我发现我可以在Gforth做s\" \040 test"(虽然手册说这不是标准的)。而且s\" \x20 test"这可能是标准的,但我不太明白句子的哪一部分说明它是否是标准的。不过,我很高兴知道如何将它与图示的数字输出结合起来。

EDIT2

这就是我期望它的用法:

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

1 个答案:

答案 0 :(得分: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”的字符串