2 初见
2.1 中文化一角
我在序的《如何改进LISP的难读性》一章节中,曾谈到说把LISP中文化是很有意义的,中文可以改进LISP的难读性并为其带来新的活力。本章节即是我结合之前所说,所实现的一部分名语言的代码。
2.1.1 make-list和build-list
我们以两个Racket标准库里面的例程(Procedures):make-list和build-list为例来尝试阐述所说。
2.1.1.1 原英文
从他们的英文名字上,我们很容易得出这两个例程都是用来创建“list”的(名语言称之为“链”)。
- 对于make-list有:很容易明白,它是用来创建一个包含n个相同值的链的。
- 对于build-list有:
> (build-list 5 values) '(0 1 2 3 4)
; 生成一个包含0-4这个5个数的链。 > (build-list 10 values) '(0 1 2 3 4 5 6 7 8 9)
; 生成一个包含0-9这个10个数的链。 > (build-list 10 add1) '(1 2 3 4 5 6 7 8 9 10)
; 生成一个包含0-9这个10个数的链,并且每一个数都加上1。 > (build-list 10 (lambda (e) (* e e))) '(0 1 4 9 16 25 36 49 64 81)
; 生成一个包含0-9这个10个数的链,并且每一个数都是自身的平方。 build-list的行为更加复杂些:它是用来生成一个链,这个链包含从0数起的n个数,并且生成的时候,这些数是可以被做一些附加处理的。
对于make-list和build-list这两个例程的具体作用,从名字上我们仅仅能看出它是用来创建链的,并不能看出它的其它更具体的作用。
2.1.1.2 中文化后
中文化后,make-list叫复链,意为链内部的每个元素是重复的;build-list叫序链,意为链内部的元素是按照一定的顺序排列的。
第一,显然这两个例程的名字有着较原英文更加丰富的含义,这是我上文提到的我所说的中文化的意义;
第二,古中文即文言文中,字词的词性很弱,或者说是常常有名词活用动词,动词活用名词的用法。故此,“链”这个字是可以被用作动词的,意为创建链、链起来一组数据、将一组数据存在链结构中。总之,字词的表意性因其所处的语境而可以有被活用的留白;
第三,从整体性的角度讲,和其他例程名放在一块,名字显得有更加有规律可循,语言使用者更容易从整体的角度出发获取到更多意义上的理解。
当然你可以说,这其中的“第一”是因为这两个例程原本的英文名字起的不好。
但我们更加应该看到的是,这本质上反应的是一种文化上的差异:英文世界里是存在着一种把事情都简单化的趋向的,这是我认为这两个例程都采用了make-list和build-list的根本原因,我们即使找出更加贴切的英文词汇来作为这两个例程的名字,但或许这些词汇在实际的实现上看起来都是不够直观的。
但对中文来讲就不一样了,中文的造词能力更强:支撑中文造词能力强的技术层原因是它的单字表意特性;非技术层原因是它所造出的词是更加容易被接收者所理解的(这可能和它字的表象特性有关)。
> (链 'val 'val 'val) '(val val val)
> (复链 3 'val) '(val val val)
> (链 1 2 3 4 5) '(1 2 3 4 5)
> (序链 5 加一) '(1 2 3 4 5)
> (序链 5 (入 (n) (复链 n 'val))) '(() (val) (val val) (val val val) (val val val val))
2.2 名语言一览
2.2.1 白马非马
> (名 马 (链 "白马" "黑马" "黄马")) ; 起一个名字马代表一个链结构的数据集合,集合内容是白马、黑马和黄马。 > (名 白马 "白马") ; 起名白马是一个字符串数据,该字符串内容是白马二字。
> (若 (同? 马 白马) ; 如果马和白马所代表的内容一样: (陈 (格 "~v是~v。" 白马 马)) ; 那么就转化整合变量名到字符串中并在屏幕上陈列出:白马所代表的内容是马所代表的内容。 (陈 (格 "~v非~v。" 白马 马)) ; 否则就转化整合变量名到字符串中并在屏幕上陈列出: 白马所代表的内容非马所代表的内容。) "白马"非'("白马" "黑马" "黄马")。
; 因为白马是字符串意义上的白马,而马是一个包含了“白马”“黑马”“黄马”的集合,故此两者不同,结果是“白马非马”。
2.2.2 三年一班点名册
> (名 三年一班点名册 (链 "王小明" "李小花" "赵小红"))
> (若 (同? "王小明" (阳 三年一班点名册)) (陈 "三年一班点名册上的第一个姓名是王小明。") (陈 "三年一班点名册上的第一个姓名不是王小明。")) 三年一班点名册上的第一个姓名是王小明。
> (倘 (阴之阳 三年一班点名册) [("王小明" "王小白") (行陈 "三年一班点名册上的第二个姓名是王小明或王小白。")] [("赵小红" "赵大红" "赵红") (行陈 "三年一班点名册上的第二个姓名是赵小红、赵大红或赵红。")] [否则 (行陈 "三年一班点名册上的第二个姓名是什么暂未可知。")]) 三年一班点名册上的第二个姓名是什么暂未可知。
> (受 ming/racket/list)
> (当 [(同? "王小明" (甲 三年一班点名册)) (陈 "三年一班点名册上的第一个姓名是王小明。")] [(同? "赵小红" (甲 三年一班点名册)) (陈 "三年一班点名册上的第一个姓名是赵小红。")] [(同? "赵小红" (乙 三年一班点名册)) (陈 "三年一班点名册上的第二个姓名是赵小红。")] [否则 (行陈 "三年一班点名册上的第二个姓名是什么暂未可知。")]) 三年一班点名册上的第一个姓名是王小明。