2

我想从 postscript 中获取 StandardEncoding 向量(PLRM 的附录 E.6 中有图形版本,但没有文本)。我正在寻找类似于 [/A /B /C /D] 的东西,但实际上,我可以通过正则表达式将编码向量中的位置与字符命令相关联的任何东西都会很好。

我试过了

(%stdout)
(w)
file
/StandardEncoding
writestring

但它(显然)不起作用,因为 /StandardEncoding 不是字符串。我如何将这样的矢量打印到标准输出?

4

2 回答 2

7

最简单的。

StandardEncoding ==

或使用索引。十进制:

0 StandardEncoding { exch dup =only(: )print 1 add exch == } forall pop

八进制:

0 StandardEncoding { exch dup 8 3 string cvrs =only(: )print 1 add exch == } forall pop

十六进制:

0 StandardEncoding { exch dup 16 2 string cvrs =only(: )print 1 add exch == } forall pop

此外,您应该知道这/StandardEncoding是一个文字名称(因为/),因此名称本身位于堆栈上。如果您进行了下一步并转换为字符串,它只会打印单词“StandardEncoding”。因此,要自动加载(并可能执行)与名称关联的值,请删除斜杠 ( /),以便名称是可执行的。单词StandardEncoding(没有斜线!)成为向量。斜线的工作方式很像quoteLisp 系列语言。

为了说明,这里有更多的方法来打印和迭代数组。

StandardEncoding {
    (%stdout)(w)file exch 80 string cvs writestring
    (%stdout)(w)file (\n) writestring
} forall

StandardEncoding
0 1 2 index length 1 sub {  % Arr i
    2 copy get 80 string cvs print  % Arr i
    (\n) print  % Arr i
    pop  % Arr
} for

[ StandardEncoding 0 {
    {
        2 copy get ==only
        ()=
        1 add
    } loop
} stopped cleartomark

最后一个使用无限循环并捕获在尝试读取不存在的元素rangecheck时发出的错误信号。get它会在堆栈 ( ) 上留下 5 个值StandardEncoding 256 StandardEncoding 256 true,您可以将其丢弃,cleartomark如图所示,或者简单地pop pop pop pop pop(或5{pop}repeat)。

编辑:进一步玩最后一个例子。这将错误捕获隔离到预期会引发错误的操作员。隔离预期错误可以让任何意外错误打印通常的诊断信息。

[ StandardEncoding 0 {
    2 copy
    { get } stopped { exit } if
    ==only ()=
    1 add
} loop cleartomark
于 2013-03-14T03:36:52.230 回答
1

您可以使用“==”和“forall”:

([) =
StandardEncoding { == } forall
(]) =
于 2013-03-13T22:02:39.770 回答