Postscript: как преобразовать целое число в строку?

В postcript говорится, что оператор cvs * преобразует число в строку. Как его использовать? Я пробовал:

100 100 moveto
3.14159 cvs show

или

100 100 moveto
3.14159 cvs string show

но это не сработало.

Любая помощь?

Ответ 1

Попробуйте 3.14159 20 string cvs show.

string требуется размер и оставляет созданную строку в стеке. cvs требуется значение и строка для хранения преобразованного значения.

Если вы делаете много преобразований строк, может быть более эффективным создание одной строки и ее повторное использование в каждом преобразовании:

/s 20 string def
3.14159 s cvs show

Ответ 2

Общей идиомой является использование литеральной строки в качестве шаблона.

1.42857 (       ) cvs show

Вы даже можете сделать форматированный вывод, представив cvs с различными подстроками большей строки.

%0123456.......
(2/7 =         ) dup 6 7 getinterval
2.85714 exch cvs pop show

Но Руководство по стилю Ghostscript запрещает это. И это в значительной степени единственный опубликованный Руководство по стилю Postscript. (Обсуждение об этом в comp.lang.postscript.) Поэтому общая рекомендация состоит в том, чтобы выделить новую строку, когда вам это нужно, и позволить мусору коллекционер зарабатывает.

4.28571 7 string cvs show

В крайнем случае, действительно ленивый хакер захватит =string, встроенный 128-байтовый буфер, используемый = и == для вывода чисел (используя, конечно, нашего друга cvs).

5.71428 =string cvs show

И если вам это нравится, вы можете комбинировать его с = другим трюком: сразу оцененные имена.

{ 7.14285 //=string cvs show }   % embed =string in this procedure

Это позволяет избавиться от лишней микросекунды и значительно усложнить процесс проверки кода. Вызов == в этой процедуре не покажет, что вы используете =string; он выглядит так же, как и любая другая строка.


Еще один трюк для сумки, от сообщение от Helge Blischke в comp.lang.postscript. Это простой способ получить нулевое целое число.

/bindec         % <integer> bindec <string_of_length_6>
{
        1000000 add 7 string cvs 1 6 getinterval
}bind def