2010-07-21 59 views
1

如何創建一個名爲rnrs-modified的庫,它將使下列代碼顯示「Hello,world!」...?在r6rs中重新定義句法關鍵字

#!r6rs 
(import (rnrs-modified)) 
(display set!) 

,甚至這將是很好的(可以說是更好的,實際上):

#!r6rs 
(import (rnrs) (modified)) ;or (import (modified) (rnrs)) 
(display set!) 

基本上我希望能夠重新定義語法關鍵字(讓,λ,設定!等)在庫,然後將該庫導入到另一個庫或頂級程序中,並使用這些重新定義的關鍵字。

不過我老覺得:

module: identifier already imported from a different source in: 
    set! 
    (lib "rnrs/main.ss") 
    (lib "rnrs-modified/main.ss") 

我使用的代碼rnrs改性是:

#!r6rs 
(library (rnrs-modified) 
     (export (rename (f set!))) 
     (import (rnrs)) 
     (define f "Hello, world!")) 

任何想法?


更新:我發現this'mzscheme模塊'。它不適用於r6rs方案,但它提供的功能基本上就是我正在尋找的。如何在r6rs方案中使用provide all-from-except

回答

2

R6RS通過識別要定製的庫(不包括要自定義的零件),然後在自己的庫中定義這些零件來實現您的目標。這裏有一個例子:

myrnrs.sls

(library 
(myrnrs) 

(export set!) 

(import 
    (except (rnrs) set!) 
    (rename (rnrs) (set! rnrs-set!))) 

(define set! "Hello, world.")) 

test.scm

(import 
(except (rnrs) set!) 
(myrnrs)) 
(display set!)(newline)  

不幸的是有沒有像所有的 - 除了像我們在球拍;因此您可以創建一個重新定義集合的庫,但是除了重新定義集合之外,您必須導入rnrs,然後輸入所有這些綁定的導出。你讀了更多關於here;諷刺的是,我想創建一個沒有設置的圖書館!

+0

+1,謝謝你的回答 - 我很擔心這可能是這種情況:(這種糟糕的情況。你認爲如何有效地增加所有其他綁定的出口?我可以自動完成任務解析文檔或其他東西,所以這是可能的,但根據我的經驗,像這樣的硬編碼解決方案通常是不好的,並且很容易中斷,你怎麼看?還有,爲什麼選擇這樣一個限制性的圖書館系統爲r6rs選擇?小世界:P – Cam 2010-07-22 19:24:45

+0

1. R6RS標準不會改變,所以一旦你獲得了正確的出口,你將終身成立 2.我不知道爲什麼它從一個角度來看,R6RS的目標是爲今天在不同Scheme系統中發現的共同特徵定義一個標準,所以也許那些是子t常見的模塊功能? 在我看的最後一個R6RS代碼中,作者痛苦地手動導出了他自己的函數的加載和加載。無所不在的*似乎毫不費力。 – grettke 2010-07-22 19:48:46