经过几个小时的反复试验,我无法想办法...这是我正在处理的代码:
: 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
答案 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”的字符串