经过大约几个小时的反复试验,我不知道该怎么做...这是我正在编写的代码:
: 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"
这可能是标准的,但我不太明白句子中表示它是否标准的部分在哪里相关。不过,我很高兴知道如何将其与图中的数字输出结合起来。
编辑2
这就是我期望的使用方式:
create test 256 allot
s" prefix " test place
123 test format
s" suffix" test place+
test count type \ prefix 123 suffix
最佳答案
我认为对于这个示例,您不需要在 <# #>
中添加空格东西。您可以使用 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”
然后,您可以将相同的单词应用于字符串“前缀 123”和“后缀”。
这并不使用与您的示例完全相同的内存位置,但它可以进行调整,这只是我演示它的最简单的方法。
针对评论,您似乎非常接近在图片输出中嵌入字符,我认为您只需要删除 [char]
例如
123 s>d <# # bl hold # bl hold # #>
应该生成一个类似“1 2 3”的字符串
关于string-formatting - 将文字空格字符添加到图中的数字输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18243117/