File tree 1 file changed +4
-0
lines changed
1 file changed +4
-0
lines changed Original file line number Diff line number Diff line change 267
267
+ 函数式语言的Algebraic data type可以极其便利的构造树状结构,因此,在函数式语言中,可以利用ADT直接构造程序语义的结构化描述(AST,抽象语法树),进而开始解释语义
268
268
+ ADT(construction)加上Pattern matching(deconstruction),允许对程序的结构化表示进行直观的变换,因此,具备这两个feature的语言,都是进行解释、编译的强力工具
269
269
+ 与结构化表示中ADT和Pattern matching对应的设施,在字符串表示中,是RE和String interpolation。不过,由于RE无法递归(计数)的缺点,后者表达力不能代替前者
270
+ + 直接用ADT构造程序并解释,绕过了语法分析,自然也要付出相应代价,即,失去语法的一部分噪音隔离效果,对终端用户不友好。
271
+ + 语法越简洁(形式上),就需要语法/语义分析做更多事(比如类型推导);而语法越薄,语法分析容易,但形式上就更复杂。
272
+ + Lisp是这方面的典型代表,S表达式极易Parse,但语法噪音太大。相应的,得到的好处之一是,语法树通过宏被直接递交到终端用户手中,用户手中的语法树和源码结构上一致,因此用户可以以解释器的身份,进行语法变换。
270
273
+ Lisp适合写解释器的原因就是,被quote后的S表达式,其实就是结构化的语法树(缺点是没有静态类型安全),从而不必再进行词法分析和语法分析(实际上S表达式的parse,还是由Lisp编译器来做的),直接进入语义处理的环节(解释,或者编译)
271
274
+ S表达式中的List作为ADT可以高效的构造树,而Pattern matching又可以高效的解构树,所以可以便捷的进行各种语法变换。所以,即使是语义处理环节,Lisp仍然表现强力。当然,具备ADT和PM的任何函数式语言,都是解释器/编译器的好工具。
275
+ + 总结下,不做词法分析怎么样?不怎样,延迟到语法分析中即可。不做语法分析怎样?不怎样,直接构造AST即可。既然通过ADT直接构造程序语义这么方便,为什么Lisp没有占领市场?噪音太大,体验差,更适合做解释器研究(大量使用宏也算一种,即语法抽象)。
You can’t perform that action at this time.
0 commit comments