Racket 球拍:在子模块中启用涂鸦语言

Racket 球拍:在子模块中启用涂鸦语言,racket,scribble,Racket,Scribble,似乎lang语句在嵌套子模块中无效,并且上面的扩展模块版本缺少某些内容: 错误:模块:没有%module开始以模块的语言绑定 更新: 看起来这或多或少有效,但有更好的方法吗?scribble是否对未处理的输出端口执行某些操作 #lang racket/base (module x scribble/text @(display 123)) 首先,您的代码有一个可以删除的冗余%模块begin lang做了几件事——一件是控制文件的语义 通过确定初始导入的绑定集 模块表单在lang出现之前已经做

似乎lang语句在嵌套子模块中无效,并且上面的扩展模块版本缺少某些内容:

错误:模块:没有%module开始以模块的语言绑定

更新: 看起来这或多或少有效,但有更好的方法吗?scribble是否对未处理的输出端口执行某些操作

#lang racket/base
(module x scribble/text
 @(display 123))

首先,您的代码有一个可以删除的冗余%模块begin

lang做了几件事——一件是控制文件的语义 通过确定初始导入的绑定集 模块表单在lang出现之前已经做过的事情。具有 子模块,也可以将模块用于文件的某些部分。 但是,lang还可以确定解析文件的读取器,以及 子模块不可能做到这一点,因此只能使用一个 顶级lang设置整个文件的解析器

旁注:这有一个技术原因。朗朗的读者阅读 文件的其余部分,直到达到eof值,因此 lang需要先获得eof值,然后才能获得 文件,或添加一种新的类似eof的值。这意味着它是 一个应该仔细做的改变——当然,这是可能的 当然,但这种需求并没有经常出现。希望它会,在未来 未来

但在您的情况下,您不需要一个全新的具体语法,只要 s表达式的扩展-以及选择用于 对常规代码的影响最小。所以在几乎所有的情况下都是好的 只需为整个文件启用@-form语法,然后使用 @-表格在你想要的地方。因为这只是另一种方式 阅读sexprs,您甚至可以将其与模块一起使用,从而实现这一点 不需要使用读卡器的代码:

这里有一点奇怪,就是使用scribble/text/lang和 不仅仅是涂鸦/文字。通常情况下,郎孚和其他人完全一样 模块x foo。。。在使用foos reader阅读代码之后。但是在 对于涂鸦/文字语言,还有另一个区别: 将其用作lang可以输出模块体的语义 每件事。这个想法是,作为一种语言,你会想吐出来 大部分是文本文件,但作为一个库,您需要在其中编写代码 然后自己打印出来

由于此代码使用模块,因此使用scribble/text意味着 没有得到吐出所有功能,这就是为什么你需要 显式切换到scribble/text/lang。但是您可以改为 只需使用语言的输出自己吐口水,这会 给你这个代码:

#lang at-exp racket/base
@module[x scribble/text/lang]{
  hi
  @(+ 1 456)
}
(require 'x)
请注意,此处不使用scribble/text作为语言,因为它是 在lang之外使用时,无法提供足够的内容。 你已经发现了,导致多余的%模块开始

这个版本稍微有点冗长,但我猜它会 在您的情况下更有意义,因为在代码的某些部分使用它意味着 你想把它用作图书馆

最后,如果您真的不想用@ 语法,只有一些部分,那么您找到的读取器是 很好。这是通过涂鸦/文字来实现的 将列表视为串联输出,因此您只需要为
每块文本。

Re scribble是否对未处理的输出端口执行某些操作?:您的意思是看不到输出?如果是,请在模块表单后添加require'x,以便对其主体进行计算。Re是否有更好的方法?:虽然我不确定,但我不这么认为。lang可以方便地为一种语言(如读卡器)协调各种配置。您可以手动执行这些操作,但与使用单独的.rkt文件和lang scribble/text.Re相比,使用起来不太方便。有更好的方法吗:我和Greg的观点相同。但是,请询问racket邮件列表。即使没有更好的解决办法,也可能会有人受到鼓舞,改善目前的状况。
#lang at-exp racket/base
@module[x scribble/text/lang]{
  hi
  @(+ 1 456)
}
(require 'x)
#lang at-exp racket/base
(module x racket/base
  (require scribble/text)
  (output @list{
    hi
    @(+ 1 456)}))
(require 'x)