racket中的读取宏 reader

2016-09-28  本文已影响0人  liewhite

racket不同于别的语言,它是一门可编程的语言。其首页上万年不变的一行大字A programmable programming language已经说明了一切。

当我们处理一个复杂编程问题时,如果是一般的编程语言,我们只能设计数据结构或类,然后编码实现方法。但是这一切在racket中都变了,我们首先要做的是设计一门最适合解决这个问题的语言,实现语言,然后实现解决问题的方法。

为什么这么说,这得益于racket中的源代码解析过程。在racket程序运行前,会经历两个运行前过程:read和expand,分别对应于读取期和编译前,read可以将任意的输入字符解析为语法树,expand则任意修改语法树,最后编译器进行编译,解释器执行。也就是说,我们可以在两个阶段改变编译器看到的东西。这就是可编程编程语言的威力。

racket的reader是一个递归下降的解析器,它可以经一个readtable和各种参数进行配置。这个readtable定义了很多分隔符和特殊字,比如:

数据单元的开始

如何解析#开头的数据

number和symbol的分隔符

开闭括号

第一个列表元素后的 .

不过这个我们一般不更改,除非想定义出一门完全崭新的语言,我们还是不要太标新立异,我们一般只考虑默认的readtable。

从一个流中读取产生一个一个datum(数据单元),如果是个复合数据,那么递归调用reader去读取其中的数据单元。

上一篇下一篇

猜你喜欢

热点阅读