racket - 如何制作 Racket #lang 的修改版本? (添加/删除一些定义)

标签 racket

我想采用一种现有语言,例如 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/

相关文章:

scheme - Racket URL 发送规则

racket - 如何消除 Racket 中的浮点?

scheme - 花括号 {} 替换 Racket 中的 'begin'

sorting - 使用 sort with key in racket 对功能列表进行排序

lisp - Scheme中的Push和Pop怎么写?

numbers - 如何计算Scheme中数字的位数之和?

racket - Racket "universe"教学包是 FRP 的一个例子吗?

使用记忆化计算组合 nCk 的方案

scheme - 有在 Racket 中打印的想法吗?

scheme - 递归函数计算从1到n的所有数字的总和?