在 PostScript 中,cvs 操作符 被称为将数字转换为字符串。我该如何使用它? 我尝试过:
100 100 moveto
3.14159 cvs show
或。100 100 moveto
3.14159 cvs string show
但是它没有起作用。
有任何帮助吗?
在 PostScript 中,cvs 操作符 被称为将数字转换为字符串。我该如何使用它? 我尝试过:
100 100 moveto
3.14159 cvs show
或。100 100 moveto
3.14159 cvs string show
但是它没有起作用。
有任何帮助吗?
尝试3.14159 20 string cvs show
。
string
需要一个大小并将创建的字符串保留在堆栈上。cvs
需要一个值和一个字符串来存储转换后的值。
如果你需要进行多个字符串转换,最好创建一个字符串并在每次转换中重复使用它,这样更高效。
/s 20 string def
3.14159 s cvs show
一种常见的习惯用法是使用字面字符串作为模板。
1.42857
( ) cvs show
你甚至可以通过展示更大字符串的各个子字符串来进行格式化输出。
%0123456.......
(2/7 = ) dup 6 7 getinterval
2.85714 exch cvs pop show
但是,Ghostscript风格指南禁止这样做。而且这几乎是我们唯一公开发布的Postscript风格指南。(在comp.lang.postscript中有关此问题的讨论。)因此,通常建议在需要时分配新的字符串,并让垃圾回收器来完成其工作。
4.28571 7 string cvs show
如果您将这个操作封装在一个过程中,那么新分配字符串可能非常重要。
/toString { ( ) cvs } def
% vs
/toString { 10 string cvs } def
如果你分配了一个新的字符串,那么封闭的程序可以被视为其输入的 纯函数。如果你使用嵌入的文字字符串作为缓冲区,则生成的字符串是 与状态相关的,如果再次运行生成过程,则该字符串将失效。
作为最后的手段,真正懒惰的黑客会劫持=string
,这是内置的128字节缓冲区,用于输出数字(当然要使用我们的朋友)。这是解释器特定的,根据标准不可移植。
5.71428 =string cvs show
如果你喜欢这个,你可以将它与=
的另一个技巧结合起来:立即评估名称。
{ 7.14285 //=string cvs show } % embed =string in this procedure
这种做法可以省去额外的微秒级时间,并且使交互式代码检查变得更加困难。在这个过程中调用 ==
并不会暴露你正在使用 =string
,它看起来就像任何其他的字符串。
以这种方式使用 =string
继承了上一节描述的所有“状态依赖性”问题,并因为只有一个 =string
缓冲区而加剧了这些问题。此外,它还增加了可移植性问题,因为 =string
是非标准的——尽管在历史上的 Adobe 实现和 Ghostscript 中可用——它是一个传统的 hack,应该仅在适当的情况下使用。
另一个技巧,来自comp.lang.postscript 中 Helge Blischke 的帖子。这是获取零填充整数的简单方法。
/bindec % <integer> bindec <string_of_length_6>
{
1000000 add 7 string cvs 1 6 getinterval
}bind def