String PostScript:`cvs`是否终止字符串缓冲区?

String PostScript:`cvs`是否终止字符串缓冲区?,string,data-conversion,postscript,String,Data Conversion,Postscript,使用cvs时的一个想法是通过重新使用字符串缓冲区来帮助垃圾收集器,如 /s 5 string def s 2 cvs %... s 66 cvs %... 但是,在循环中执行此操作时,在缓冲区中实际找到的字符串是: (-40.0) (-30.0) (-20.0) (-10.0) (0.0.0) (10.00) (20.00) (30.00) (40.00) 因此,转换结束时字符串似乎没有终止(见GhostScript 9.26)。不幸的是,GhostScript参考手册对字符串是否将被终止有

使用
cvs
时的一个想法是通过重新使用字符串缓冲区来帮助垃圾收集器,如

/s 5 string def
s 2 cvs %...
s 66 cvs %...
但是,在循环中执行此操作时,在缓冲区中实际找到的字符串是:

(-40.0)
(-30.0)
(-20.0)
(-10.0)
(0.0.0)
(10.00)
(20.00)
(30.00)
(40.00)
因此,转换结束时字符串似乎没有终止(见GhostScript 9.26)。不幸的是,GhostScript参考手册对字符串是否将被终止有些沉默

所以问题是:预期的行为是什么

当尝试类似于
val str dup 2 0 put cvs的操作时,结果是(如
=
所示):

那么,重新使用字符串缓冲区到底是个坏主意吗

更新1:

我发现堆栈上的值是正确的,而缓冲区中的值不是:

val s1 cvs pop            % leaves the wrong value in s1
val s1 cvs /s2 exch def   % leaves the correct value in s2

Postscript字符串不是C字符串。特别是,它们不是NUL终止的;相反,它们有明确的长度,就像Postscript数组一样。创建字符串(或数组)后,无法修改其长度,但可以创建子字符串(或子数组)的视图(“Postscript术语中的间隔”)。间隔不是拷贝;它与基础字符串(数组)共享存储


cvs
将字符串(用作缓冲区)作为参数,使用转换为字符串的值参数覆盖缓冲区的初始段,并将该段作为间隔返回。(请参阅PLRM的第568页;我懒得重新键入。)如果不希望在转换后的值末尾出现垃圾,则需要使用该返回值。(但返回的值只有在不使用底层缓冲区进行其他操作时才有效。)

实际上,信息是分散的:第38页(数组):“此外,还有一个运算符(getinterval)这将创建一个新的数组对象,其值是现有数组的子间隔;旧对象和新对象共享该子间隔中的数组元素。”,第40页(字符串):“复制字符串对象或创建子间隔(子字符串)将导致共享字符串的值。”。我一直认为返回的值只是为了方便起见的缓冲区(解释第568页:“将文本存储到字符串(…),并返回指定实际使用的子字符串的字符串对象。”)。
val s1 cvs pop            % leaves the wrong value in s1
val s1 cvs /s2 exch def   % leaves the correct value in s2