模块 454 中的错误处理中单独的“打印”调用的原因是什么?

模块 454 中的错误处理中单独的“打印”调用的原因是什么?

这是模块 454 的内容(扫描fil单元;goto attach_fraction如果找到):

if scan_keyword ("fil") then
  begin
    cur_order ← fil;
    while scan_keyword ("l") do
      begin
        if cur_order = filll then
          begin
            print_err("Illegal unit of measure (");
            print("replaced by filll)");
            help1("I dddon´t go any higher than filll."); error;
          end
        else
          incr (cur_order);
      end;
    goto attach_fraction;
  end

当检测到错误的附加信息时l,程序会报告“非法计量单位(由 filll 替换)”。难道不能简单地通过 来完成吗print_err("Illegal unit of measure (replaced by filll)")

答案1

TeX 的字符串处理基于 20 世纪 70 年代计算的一些限制(特别是,它没有让某些标准库处理字符串的分配,而是将它们全部保存在一个静态分配的数组中,Knuth 将其称为字符串池。有关这方面的说明,请参阅§50。结果是生成的 Pascal 代码中的实际调用不是例如,print("replaced by filll)"而是实际上print(447)(或实际的字符串编号)。相关代码在第 5 部分(§54–71)。

正如 Barbara 所说,Illegal Unit of measure (在 tex.web 中出现了三次(您可以在 weave 的输出中检查索引)。这可以节省几个字节,这在内存通常以 GB 为单位的当今时代似乎是一种愚蠢的优化,但多用户系统的总可寻址内存以兆字节为单位的情况并不罕见,甚至在 80 年代也是如此。原始 TeX 具有 16 位内存寻址是有原因的。

相关内容