1 序
1.1 灵感来源
纵观人类历史,很多有意义的成果往往都不是靠严谨的逻辑推理得来的,而是一时的灵感迸发,先有了结论,然后再去寻找现象去证明结论。
所以有些事情,你不用管他对错有无,感觉对了就要开干。
我大概在2015年的时候,开始使用Emacs编辑器。早之一两年学习Ruby语言的时候我就已经知道了LISP语言。大概从2018年开始,我才终于得以开始投入时间到Racket语言的学习上。
也是在2018年的时候,有次出差北京在和同事们的一次交谈中,我谈到说,自己曾经在维基百科上面看到过一些提及,说在一些学术研究的边缘领域中,有讨论用梵语来替代英语作为编程语言的宿主语言,原因是英语的词法规则不工整(动词时态变形,名词主谓宾等等的单词变形规则不够严谨),梵语是已知的最为严谨的语言,从语法词态构词规则等等的角度讲。
作为天生的中文使用者,但近代科学起源于西方,一二三次工业革命均发生在西方,编程语言亦起源于英语国家,这导致大量的一手文献资料都是英语写成的,工作和学习中不得不接触英文,这常常让我不禁的去思考中英文的语言差异。
我想或许,梵语之说显然是西方人局限于西方语言(德语、法语、西班牙语、意大利语都算是拉丁语的方言吧)的固有模式所做出的推演。而实际上,中文才是更值得尝试的宿主语言,特别是对LISP来说。
2021年夏,我的这个想法变得越发成熟。2022年夏,我着手了实现。
另可见我曾写过的文章:《由汉语编程所想到的》和《我的一种关于lisp方言式的汉语编程语言的构思》。
1.2 LISP的基本语法规则
它首先由括号约定执行优先级;
然后由每个括号中的第一个字词表示此括号内容的含义(称为前缀表达式)。
要理解S表达式,好有一个比喻:自然语言说的“我 爱 你”(主谓宾结构),如果采用S表达式说它的话是“(爱 我 你)”(谓主宾结构)。
1.3 LISP代码为何难以读懂
首先,“谓主宾”的排序方式是不符合大家所使用的的自然语言常见的“主谓宾”排序的,这造成了一部分的阅读障碍。
另外,就是因为括号所衍生出来的语法了:
因为S表达式是前缀表达,相当于把“谓词”前置了。但此时的“谓词”却仅仅只是一个简单的谓词,没有清楚明确的表明出“谓词”随后的数据和“谓词”之间的具体关系(谓词之后的数据将被怎样处理)。而这种关系(或者说将被如何处理)也却并不是单纯而统一的,而是根据这个“谓词”的不同而变化的(因其可以被定义和扩展)。而这种变化在无形当中会造成思维上的负担和混乱。
比如(+ 1 2 3)表达式的“谓词”是+,整个表达式的意思是"1加2再加3"。
同样(if 1 2 3)表达式的“谓词”是if,但其意思却是"如果1是真,则返回2,否则返回3"。
1.4 如何改进LISP的难读性
LISP诞生在上世纪五十年代,现今的编程语言相较之,舍弃了S表达式,引入了更多的关键字来替换括号,表达式也大都采用符合自然语言使用习惯的中缀表达。
但LISP的精髓之处就是他的S表达式,舍弃S表达式并不是我要追求的。
所以进而的去想,S表达式的“谓主宾”形式,其中最为重要的其实是“谓语”,一个表达式的关键含义,也均是由首位的“谓语”来阐述的。这个“谓语”能表达和涵盖的意思越多,也就越让人可以更容易的读懂整个表达式的含义。
比如你可以在这个“谓语”里指明“主”“宾”或者更加具体的位置单词的含义。理想情况下,比如这个“谓语”是一个图画,这个图画明确的表达出来了后面字符应如何组合表达,那么此时整个括号里面的内容就会变得异常的容易解读了。
而提到中文就不得不说,汉语的文字,本身就是由图画演变而来的,天然的在阅读和理解上比英文更加有优势。
另外是显而易见的,中文相较于英文,可以用更短的空间表达出更多有意义的含义。
It’s very obvious to notice that comparing to English, Chinese can use less space to express much more meaningful connotations.
据我调查思考,汉语在语法上更加自由,在语素的颗粒度上更加精细,在书写表达上更有上千年的实践和文化积淀(简练的文言文所淬炼出来的汉字含义,古诗词的工整对账所催生出来的同义词反义词,庞大的地区方言所延展出的在使用上的灵活性),另更有近代吸收西方文化后的白话文改革和简体中文、拼音、标点符号的引入。
上所述种种,更加使用人口之众,都让我认为,将LISP的语法寄宿在汉语下,将拥有强大表达力的中文融入在S表达式幽幽的括号中所产生的编程语言,会将人机交互带入另一层境界......
1.5 如何做
Racket语言,编程语言设计和实现的平台,可先用它设计一个方言,并逐步汉化翻译已实现了的内部库。
在如上的过程中,逐步建立自动化代码翻译工具,以便让更多人更容易的投入到翻译中。
循环往复,另可在翻译中引入切合汉语文化的有切实意义的新特性和语法糖。
1.6 释惑
名语言的目的是为了探索以汉语的博大精深,兼容并包,是否可以让编程语言以另外一种方式变得更容易被人理解。
为什么选择LISP/Racket语言实现:第一,我认为LISP的语法特性间接的做了很大程度的留白,这得以让中文可以最大程度的发挥出它的优势。第二,是认为scheme语言的特殊性,其高级抽象形态的实现都可以回溯到最基本的函数定义上,这也得以让人可以循环渐进的替换完其固有的内部英文定义。
名会秉持实事求是的精神,不会采用通俗的计算机中文中已有的通用翻译作为编程语言关键字,而是在兼顾汉语的古今含义上做出折取选择。故此,其字词的选择不会一味的去追求完全的文言文化,也不会追求完全的白话文化,甚至不会追求完全汉化(西文字母、标点符号所独有的优点不容被忽视)。
另外我认为,名的实现过程,除去代码上的东西外,会类似于一个汉语地方方言的实现。所谓方言,比如河南话更甚于说是吴语,即是选择了汉语中的部分字词,定义出了自己方言的特殊意义。而名的实现,我认为会类似于这样一个过程,只不过是在选择时,需要兼顾编程和相应的英文词汇而翻译。
名的其中之重要一目的是为了给汉语编程探索和指明道路。