2013-08-14 2 views
1

Примерно через несколько часов проб и ошибок, я не мог понять, как это сделать ... Вот код, я работаю над:Добавить буквальный пробел в изображенном цифровой выход

: 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 
    [email protected]    cr .s 
    dup    cr .s 
    [email protected]    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" ".

EDIT:

я обнаружил, что я могу сделать: 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 
+0

Это не очень понятно, что ваш код пытается достичь, поэтому я не знаю, как помочь. Не могли бы вы либо объяснить свое намерение, либо прокомментировать код? Предпочтительно оба. – sheepez

+0

@sheepez Я пытаюсь получить слово, я бы назвал число и указатель на строку, выделенную на кучу, а затем напечатал бы это число в данной строке после последнего символа в ней, длина для учета количества добавленных символов. Часть, которую я не могу сделать, - это часть, где я хочу добавить символ пробела после номера, напечатанного в строке.Я также добавил код к вопросу, чтобы проиллюстрировать его использование. –

+0

С какой проблемой или ошибкой вы сталкиваетесь? Выполняется ли 'format' и просто не выполняется то, что вы ожидали? – sheepez

ответ

1

Я думаю, для этого примера вам не нужно, чтобы добавить пространство в <# #> вещи. Вы можете определить строки с ведущими или конечными пробелами с 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 [email protected]    \     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»

+0

Спасибо за усилия, но нет. Я действительно хотел знать, как иметь место в том, что генерируется '<# #>'. Наверное, другой пример поможет. Как напечатать '1 000 000', если мой ввод - это число 1000000? –

+0

@wvxvw Я добавил добавление, которое, я думаю, ближе к делу. – sheepez

+1

О, дорогой ... да, вот и все! :) Большое спасибо! –

Смежные вопросы