My experience of using Racket

/ 自省, racket

updated_at: 2022-02-27

我越是使用Racket语言,越是明白自己在干些什么,越是感到自己需要探索的东西是有价值的。

1  一年时🔗

粗略算起来,我使用Racket语言来写一些自己的小项目,从刚开始的timable到现在最近在写的http-client,也1年有余了。

Racket语言的文档和学习资料基本上都被官方文档所涵盖了,Racket的官方文档在我看来是颇具学术特色的,行文风格很多时候也都会有意无意的偏向于某种概述。另因为其衍生出来的scribble语言和已经定义好了的官方的很多scribble相关的函数,因此在用scribble写库的文档对库函数做说明时会有显而易见的一致性。但我觉得恰恰因为这种风格的偏向,灵活性也变差了,导致了其开发者在写自己库文档的时候,都会优先侧重于相关函数的说明而忽略示例的重要性,这在我看来是不利于快速理解库的实际用法的。和之形成鲜明对比的是我一直在工作中用的Ruby语言,包含着日本人某种极致追求人性化的内涵,其工程化的文档很多时候都会以示例切入,这在实际工程工作中是非常利于快速理解库用法的。

随着我对Racket语言熟练度的提升,慢慢的开始可以理解Racket语言的精髓所在了。通俗来说,随着一个人对编程语言的深入理解,慢慢会发现不同的编程语言之间是有相似性的,比如Ruby/Python,所以基本上来说,一周时间熟悉一下其它语言的语法就可以debug和写另外一个语言的项目代码了。但这时如果跟非常熟悉另外一个语言的人沟通,就会发现你写出来的代码可能会非常不符合这个语言的约定习惯。

所以除非一个语言一开始的时候就是草草了事,并没有弄清楚其自身的定位和目标,否则一个语言之所以存在的价值和精髓,正是它在风格上的差异所衍生出来的固定使用习惯。Racket语言的match,某种程度上在我看来就是lisp足够特别的同像性所衍生出来的强大表达力的具体体现。

有时候在使用Racket的过程中,常常不得不惊讶于lisp用一层一层的括号所构造出来S-expression的同像性,这种同像性牺牲了掉其他语言所谓的可读性,却换来了异常强大的语法表达力。

2  三年时🔗

最近又有了实现比如qweatherdaily-report,算是有了新的感悟。

不同于很多其他语言,Racket语言因为所采用的S-expression的那种极其异常的同像性所衍生出来的其附属的一切周边都不同寻常的拥有一种原始性,又因为这种原始性另起仿佛另有一种别样的生命力。比如其官方文档所使用的的Scribble,在Scribble中使用的interaction来运行一段代码并自动在文档中生成结果的这种方式。

另外值得提的是,Racket语言的官方文档的写作风格也很具结构性。非常引人注目的是比如其文档中所有关键字的说明都是基于某种格式从代码中直接生成的,起初如果不够熟悉这种结构性的说明,看文档会很费力,但一旦足够熟悉,因为这种固定的说明风格仿佛就是一种固定的数学公式,数学公式学起来很枯燥,但是掌握之后,读起来和用起来都会更加方便。