本书意图描述的设计语言PLaSM是FL的一个子集的面向几何的扩展. FL是一种在函数层次 (Function Level) 上进行编程的高级语言, 由IBM位于Almaden的研究部门的函数式编程组开发.
FL语言 (可以追溯至Backus的Turing讲座 [译注: 现在有两种Turing讲座, 这个指的是Turing奖获得者给的讲座]) 引入了程序上的代数, 其中函数表达式之间的一集代数等式被建立起来.
程序是函数.
程序复合与应用. PLaSM程序的复合表现得恰如数学函数的标准复合. 例如, 复合数学函数应用于参数的意思是函数先应用于, 然后函数再应用于值. 之前的表达式的PLaSM记号将会是
(f~g):xf:(g:x)
其中~
代表程序复合, 而g:x
代表将函数g
应用于参数x
.命名对象. 在PLaSM中, 一个名字通过使用DEF
被赋予每个由语言生成的值, 可以带有或不带显式参数.
DEF object = (Fun3 ~ Fun2 ~ Fun1):parameters;
参数化对象.
DEF object (params::IsSeq) = (Fun3 ~ Fun2 ~ Fun1):params;
DEF obj1 = object:<>;
DEF obj2 = object:<>;
译者建议: 这部分内容有点年久失修, 建议参考PLaSM主页:
http://www.dia.uniroma3.it/plasm/
http://www.plasm.net/download/
译者建议: 本书所用的PLaSM版本, 是基于PLT Scheme实现的, 也就是现在的Racket. 之前还有Common Lisp实现的版本, 现在还有Python实现的版本. 读者想用哪个版本就用哪个版本, 尽管我觉得每个实现都有点糟糕到离谱, 以至于让我怀疑作者是不是真读了他开头引用的Essentials of Programming Languages第一版.DEF mycube = CUBOID:<1,1,1> COLOR RED;
mycube;
译者建议: 这东西的REPL其实是一个PLT Scheme的REPL (是不是让人想到了LCF之于ML), 然后有一个解释过程, 接受字符串作为参数, 然后parse运行PLaSM程序. 我真的不是很能理解, 别的语言也就算了, 在Scheme里作者为什么不把PLaSM做成embedded DSL.作者必须明白每个PLaSM源程序是一个字符串 [译者: 不明白的话, 读者都不明白如何运行这逆天语言], 即被(双)引号包裹的字符序列.
(plasm "(SQRT:3 + 10) / (3.5 * COS:(PI/4))")
原始FL对象是字符, 数字和真值. 原始对象, 函数, 应用和序列是表达式. [译注: 我又想问一下作者的编程语言到底是怎么学的了.] 序列是由逗号隔开尖括号包裹的表达式:
<5,fun>
应用exp1:exp2
对于exp1
和exp2
求值, 然后将前者的值应用于后者的值. 注意到二元函数既可用前缀形式也可用中缀形式:1+3+:<1,3>4
函数应用是向左结合的:f:g:h(f:g):h
应用比复合绑定得更紧密:f:g~h(f:g)~h
译注: 你会发现这本书的数学都有点奇怪, 因为作者倾向于将具体和抽象杂糅在一起.
一个域上的向量空间是一个集合, 其带有两种复合规则 (即运算)满足以下公理 [译注: 这应该都是常识, 我就不翻译了]:
一个点的集合被称为是上的一个仿射空间, 如果存在一个映射满足以下性质: