17 Creating Languages🔗

前一章定义的 macro 工具允许程序员为某种语言定义语法扩展,但宏有两个局限性:

  • 宏不能限制其上下文中可用的语法,也不能改变周围 form 的含义;且

  • 宏只能在语言词法约定的范围内扩展语言的语法,例如使用括号将宏名称与其子 form 分组,以及使用标识符、关键字和字面量的核心语法。

+Lists and Racket Syntax 中介绍了 reader 和 expander 层之间的区别。

也就是说,宏只能在 expander 层扩展语言。Racket 还提供了额外的工具,用于定义 expander 层的起点、扩展 reader 层以及定义 reader 层的起点,并且可以将 reader 和 expander 起点打包成便捷命名的语言。

    17.1 Module Languages

      17.1.1 Implicit Form Bindings

      17.1.2 Using #lang s-exp

    17.2 Reader Extensions

      17.2.1 Source Locations

      17.2.2 Readtables

    17.3 Defining new #lang Languages

      17.3.1 Designating a #lang Language

      17.3.2 Using #lang reader

      17.3.3 Using #lang s-exp syntax/module-reader

      17.3.4 Installing a Language

      17.3.5 Source-Handling Configuration

      17.3.6 Module-Handling Configuration