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部分(但简化为使用子模块),最后应该有一个以符号形式命名语言的解决方案——但即使这样,也不需要包,使用链接
或类似的东西可能更容易。在所有这些都完成之后,可以提到包。。。