如何将`#lang reader" path / to / reader.rkt"`转换为`(module ...)`语法?

时间:2017-01-07 04:13:40

标签: syntax module racket

the Racket docs中,我找到了以下解释:

  

对于#lang球拍,语法为

#lang racket
decl ...
     

相同
(module name racket
  decl ...)

但是如何将#lang reader "path/to/reader.rkt"语法转换为(module ...)语法,而不会在DrRacket中生成错误?

1 个答案:

答案 0 :(得分:1)

一般情况下,你不能。 #lang语言比模块语言更强大,实际上它们是模块语言的超集。使用#lang定义的语言只提供“reader”函数,该函数接受模块的主体作为输入并生成(module ...)形式作为输出。

对于Racket生态系统中的某些语言,例如#lang racket/base#lang racket,从源到模块的这种转换非常简单。对于这些语言,#lang racket/base(module m racket/base ...)之间没有区别。但是,对于其他一些语言,语法完全不同 - 它甚至可能不是基于s表达式的!例如,考虑Scribble及其受LaTeX启发的语法。

这意味着#lang有能力控制 reader ,即解析源代码的Racket,而模块语言只能控制a的初始命名空间。模块。