很长一段时间以来,我一直在问自己 TeX 语言是如何分类的。我曾多次在互联网上寻找一些有用的信息,但都没有成功(甚至没有提示!)。在此列表中(这里),没有提到 TeX。我不知道有什么语言与 TeX 语言类似,无法进行比较。我只知道它是图灵机完备的,仅此而已。
TeX 编程语言应该如何分类(或者你如何对其进行分类)?它的编程范式是什么?
提前致谢。
答案1
它是一种宏扩展语言(它的宏部分,而不是排版程序),可与其他宏语言(如 C 预处理器宏)相媲美。
C 预处理器
#ifndef ZZZ
#define ABC 3
#else
#define ABC 4
#endif
TeX
\ifx\zzz\undefined
\def\abc{3}
\else
\def\abc{4}
\fi
答案2
TeX 是一种宏扩展语言。宏在使用时会被其定义替换。最终,此过程将产生文字文本(排版)、可扩展基元(扩展为其结果)或不可扩展基元(执行)。
答案3
TeX 有两个编程系统,即“嘴”(主要进行宏扩展)和“胃”(进行排版和分配)。它们仅以松散同步和按需方式运行。
对于编程目的而言,它们是盲系统和跛脚系统的配对,因为“胃”不能根据变量的值做出决定(条件只存在于“嘴巴”中),并且“嘴巴”不能影响变量的值和其他状态。
虽然 eTeX 增加了一些可以在口中操作的算术功能,但按照最初的设计,口中并不进行算术运算。有一种可疑的 hack 可以在给定的运行时在口中执行指定数量的迭代,它依赖于将\romannumeral
11000 转换为的语义mmmmmmmmmmm
。
由于嘴和胃的同步问题,人们有相当大的动力只用嘴来完成一些任务。由于嘴巴跛足且患有计算障碍,这有点类似于用 lambda 演算来编程图灵机。
TLDR:TeX 语言的编程范式很糟糕。
答案4
范式是“替代”——要么不替代任何内容(让原始文本通过),要么替代某些内容(以某种方式影响输出)。
结合所有答案和评论:
(a)TeX 是一种标记,因此是 SGML 的一个子集。
(b)它是一个隐式循环(“读取直到文件末尾”)和一个隐式命令(“打印”);其他一切都发生在其中。
(c) 其印刷控制能力与DCF非常相似,并且其作业控制能力与JCL相似。
(d) 它可以映射到 html、css、javascript、文件 i/o 方法和命令行/批处理的组合。
(e) 它的宏扩展能力类似于 SAS 宏处理器:SAS 宏生成和控制 SAS 代码;TeX 宏生成和控制打印输出;两者混合宏和非宏材料;并且两者扩展其宏直到达到原语或代码/文本。
(f) 在电子表格中,如果我创建一个公式,'=if(a1="",substitute(a2,"#1",b2),"")' - 如果单元格 a1 为空,则将单元格 a2 内容中的字符'#1'替换为单元格 b2 中的内容,否则不执行任何操作” - 这是 TeX 技术。
(g) 它是自定义和可扩展的,并且可以与其他输入/输出接口,这意味着没有语言“边界”。
包和命令不仅可以添加额外的功能,还可以通过重新定义意义现有的包和命令,包括它们自己。
(h) 反过来,这意味着 TeX 更像是一种“结构”或系统,而不是一种语法“语言”,事实上,一个文档中的指令“\X”(或“qΨ”)可能与另一个文档中的指令(或其语法)不兼容,也可能不兼容。此外,语法和句法正确性可以重新定义(甚至取消定义)。
(i) 这种可定义性意味着每个文档实际上都是它自己的“语言”。
也许正在发生的事情是,原始文本的存在很容易被归类为“不属于语言”,并且重点放在显式命令上,因为它们明显标有转义字符。但隐式命令(循环、打印)也属于这种情况,它们类似于语言学中变格中的 -0 格结尾。如果没有要打印的内容,则不会发生任何事情。
显式命令只有一个目的:修改隐式命令如何以及何时执行其工作,或者继续执行其工作。这是“标记”的另一种说法。
(j)因此原来的描述“TeX 是一个文档准备系统”仍然是最恰当的。
(k)TeX 是语言的超集。