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?もう 1 つの可能性は、一種の文字列の最初の文字としてスペース文字を指定することです。s" "

編集:

私ができることがわかりました:s\" \040 test"Gforthで(マニュアルには標準ではないと書かれていますが)。そして、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
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 に答える