我想采用一种现有语言,例如 htdp/isl
,并添加一些默认情况下未包含的定义。我可以在每个文件的顶部 (require blah)
,但我希望能够在顶部写入 #lang my-modified-isl
,并获取这些定义以及语言的其余部分。如果这仅适用于与 Racket “接近”的语言(即,有一个无聊的读者),那也没关系。
最佳答案
在 Racket 中,#lang
基本上就是任何提供 #%module-begin
的模块(以及可选的读取器/解析器)。例如,您可以查看我的 SML
package (与标准 ML 无关),这几乎是普通的 Racket,但进行了一些自定义调整,使其非常适合描述数据(如 YAML)。
假设您想要制作一个普通 Racket 版本,但其中包含函数 standard-fish
,并且缺少除法 (/
) 函数。您可以制作您的文件:
#lang racket ; custom-racket.rkt
(require pict)
(provide (except-out (all-from-out racket) /)
standard-fish)
现在您可以使用 s-exp
将新语言放入 #lang
行:
#lang s-exp "custom-racket.rkt"
(standard-fish) ; A fish
(/ 10 2) ; Error, `/` undefined
(请注意,如果您想完全摆脱 S-Expressions 并替换读取器,则可以使用 #lang reader
来代替。)
最后,你可以将你的文件打包成自定义的Racket包直接使用。将上面的 custom-racket.rkt
重命名为 custom-racket/main.rkt
,添加 info.rkt
文件,然后安装软件包:
$ mkdir custom-racket
$ cd custom-racket
$ vim main.rkt
#lang racket ; custom-racket.rkt
(require pict)
(provide (except-out (all-from-out racket) /)
standard-fish)
(module reader syntax/module-reader
custom-lang)
$ vim info.rkt
#lang info
(define collection "custom-racket")
$ raco pkg install
现在您可以直接在 #lang
行中使用 custom-racket
:
#lang custom-racket
(standard-fish) ; A fish
(/ 10 2) ; Error, `/` undefined
关于racket - 如何制作 Racket #lang 的修改版本? (添加/删除一些定义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74310002/