在the Racket docs中,我找到了以下解释:
对于
#lang
球拍,语法为#lang racket decl ...
与
相同(module name racket decl ...)
但是如何将#lang reader "path/to/reader.rkt"
语法转换为(module ...)
语法,而不会在DrRacket中生成错误?
答案 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的初始命名空间。模块。