第 51 节中tex.web
有这样的内容:
name_of_file ← pool_name; { we needn’t set name length }
哪里name_of_file
是(第 26 节):
name_of_file : packed array [1 .. file name size ] of char;
并且pool_name
(第 11 节):
pool_name = 'TeXformats:TEX.POOL ';
{ string of length file_name_size; tells where the string pool appears }
这样的字符串分配是 Pascal 的一个特性吗?在什么情况下 Pascal 允许进行字符串分配?(如上面的第 51 节)必要条件是数组和分配的字符串必须具有相同的大小吗?
类似情况也出现在第 520 和 521 节。
答案1
是的,Knuth 使用的 Pascal 参考仅允许分配具有相同长度的字符串。Pascal 中的字符串是基类型的数组字符与索引类型这是整数的子范围,即 1..n。当然,Knuth 没有留下未分配的字节。(这就是为什么池名称获取文件名_大小(另一个问题中的字符。)
Knuth在文章的第 10 节中tex.web
指出,他遵循 Jensen/Wirth 的用户手册和报告1974 年;Pascal 语言的原始定义。他提出了一些例外情况——在上述书中的定义含糊不清或使代码混乱的情况下明确指出。例如,在案件声明他接受了 else/otherwise 部分。
在 1978 年的修正版中,该书第 41 页指出,包含 n>1 个字符的字符串是压缩数组[1..n]的char。下一句是“赋值(:=)可以在完全相同的数组类型。''
我对 Knuth 使用的 Pascal-H 编译器了解不多。例如,后来的 Pascal(扩展 Pascal 的标准)允许对字符串进行更灵活的分配。