Racket 把图书馆当作语言?

Racket 把图书馆当作语言?,racket,Racket,我有几个文件是这样开头的: #lang racket/base (require "my-library.rkt") 如果我能以以下内容开始我的文件,我将非常高兴: #lang my-library 是否可以将库用作#lang?我需要对my library.rkt进行哪些更改?首先,使用以下内容创建my library/lang/reader.rkt: #lang s-exp syntax/module-reader my-library 然后,将以下内容添加到my library.rkt

我有几个文件是这样开头的:

#lang racket/base
(require "my-library.rkt")
如果我能以以下内容开始我的文件,我将非常高兴:

#lang my-library

是否可以将库用作
#lang
?我需要对
my library.rkt
进行哪些更改?

首先,使用以下内容创建
my library/lang/reader.rkt

#lang s-exp syntax/module-reader
my-library
然后,将以下内容添加到
my library.rkt

(provide (all-from-out racket/base))

你可以阅读关于如何使用它的更多细节。

我想补充Chris的答案。您还可以设置
#lang
,使其像内置的一样工作:

#lang my-library
为此,您需要设置一个包。获取软件包的最简单方法是使用
raco-pkg-new

输入:

raco pkg new my-library
并将模板替换为您的库

然后,在包的根目录中,添加一个名为:
lang/reader.rkt
的文件夹和文件,并在该文件中放入:

#lang s-exp syntax/module-reader
my-library
现在,安装该软件包(从文件夹的根目录运行
raco-pkg-install
),您现在应该能够使用内置于racket的语言

正如Chris所说,您可能希望确保向库中添加:

(provide (all-from-out racket/base)) 
确保在新语言中有
racket/base
绑定。尽管您不想在其中包含
racket/base
绑定,但可以将其忽略


最后,您可以将您的新花哨语言上载到包服务器,以便其他人下载它。这里是,但我建议您只将其上载到github,然后复制其他包所做的操作。

如果库不想做任何“lang like”操作,您只想消除
require
?您可以:

  • 更改
    my library.rkt
    ,如Chris所述:添加
    (提供(全部来自球拍/球座))
    。但不要创建任何
    my library/lang/reader.rkt
    文件

  • 要使用它:
    #lang s-exp“my library.rkt”
    。请注意
    s-exp
    ,从技术上讲,这并不能准确回答您的问题。:)


  • 请记住,您可以在
    my library.rkt
    中对绑定进行阴影处理,因为它现在被用作lang,而不是
    require
    d.

    注意:在比定义单独的lang目录更容易的情况下,也可以对reader模块进行阴影处理。这是一个错误的答案:它设法最大化所需的麻烦为了一些简单的事情。这就是为什么Greg的答案应该是正确的解决方案,然后Chris的答案应该添加reader部分(但简化为使用子模块),最后应该有一个以符号形式命名语言的解决方案——但即使这样,也不需要包,使用
    链接
    或类似的东西可能更容易。在所有这些都完成之后,可以提到包。。。