2015-11-26 54 views
3

我有一個像這樣開頭的幾個文件:使用庫作爲#lang?

#lang racket/base 
(require "my-library.rkt") 

我會很高興,如果我能開始與我的文件:

#lang my-library 

是否可以使用圖書館作爲#lang?我需要對my-library.rkt進行哪些更改?

回答

4

首先,創建my-library/lang/reader.rkt有以下幾點:

#lang s-exp syntax/module-reader 
my-library 

然後,添加以下my-library.rkt

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

您可以如何使用它的詳細信息瞭解syntax/module-reader

+4

注意:如果這比定義一個單獨的lang目錄容易,那麼也可以爲reader模塊使用子模塊(http://blog.racket-lang.org/2012/06/submodules.html) 。 –

3

我想補充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,你現在應該可以使用你的語言,就好像它是內置於球拍

正如克里斯說,你可能想確保你添加到庫中。

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

確保您的新語言具有racket/base綁定。雖然如果你不想在那裏綁定racket/base,那麼你可以將它們排除在外。

最後,您可以將新的花哨語言上傳到包服務器以便其他人可以下載它。這裏是documentation for it,但我建議你只要將它上傳到github,並複製其他軟件包所做的工作。

+1

這是一個不好的答案:它設法最大限度地發揮應該很簡單的事情所需的麻煩。這就是爲什麼格雷格的答案應該是正確的解決方案,那麼克里斯的答案應該添加讀者的一部分(但簡化爲使用子模塊),最後應該有一個解決方案,以符號形式命名語言---但即使如此,不需要包裝,使用'link'或類似的東西可能更容易。在完成所有這些工作後,可以提及軟件包... –

6

如果你的圖書館不打算做任何「lang like」的事情,而你只是想消除require?你可以:

  1. 變化my-library.rkt克里斯介紹:添加(provide (all-from-out racket/base))。但不要打擾創建任何my-library/lang/reader.rkt文件。

  2. 使用它:#lang s-exp "my-library.rkt"。注意s-exp,所以從技術上講,這並不能完全回答你的問題。:)

請記住,您可以在my-library.rkt現在它被用作郎而不是被require d陰影綁定。

相關問題