Постскриптум: как преобразовать целое число в строку? - PullRequest
15 голосов
/ 25 сентября 2011

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

100 100 moveto
3.14159 cvs show

или

100 100 moveto
3.14159 cvs string show

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

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

Ответы [ 2 ]

13 голосов
/ 26 сентября 2011

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

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

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

/s 20 string def
3.14159 s cvs show
12 голосов
/ 26 сентября 2011

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

1.42857 (       ) cvs show

Вы можете даже сделать форматированный вывод, представив cvs с различными подстроками большей строки.* Но Руководство по стилю Ghostscript запрещает это.И это в значительной степени единственное опубликованное Руководство по стилю PostScript, которое у нас есть.( Обсуждение этого в comp.lang.postscript.) Таким образом, общая рекомендация состоит в том, чтобы выделить новую строку, когда вам это нужно, и позволить сборщику мусора заработать свою память.* В крайнем случае, действительно ленивый хакер перехватит =string, встроенный 128-байтовый буфер, используемый = и == для вывода чисел (используя, конечно, нашего друга cvs).

5.71428 =string cvs show

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

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

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


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

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