2014-02-24 33 views
3

我正在嘗試寫一些在DrRacket/plt-r5rs和Gambit/gsi中都有效的東西。便攜式加載/在R5RS計劃中包含define-syntax?

我遇到的問題是在Gambit中(load "foo.scm")不會加載define-syntax -blocks。在Gambit中使用(include "foo.scm")有效,但當然會導致DrRacket中的語法錯誤。

有沒有辦法解決這個問題,以便我可以編寫便攜式R5RS代碼?

事情我已經嘗試:

  • 重新定義(include "foo.scm")(load "foo.scm"),反之亦然。問題:非法重新定義Gambit中的宏。
  • (if gambit ...)包裝所述重新定義。問題:如果內部定義非法(除非另有定義)。
  • 將帶有filename的字符串傳遞給庫文件中的include。問題:在解讀開始之前似乎發生了包含在Gambit中。

回答

2

編寫兼容Gambit和Racket的模塊非常困難。

確實有方法可以測試特定實現並有條件地定義事情。事實上,有兩個系統可以做到這一點:SRFI 0SRFI 7Most implementations support one or the other. Not very many support both.

開局支持SRFI 0球拍支持SRFI 7.

+0

對於Erik:你選擇了這個作爲最佳答案......那麼你做了什麼? – Quasaur

+0

我幾乎放棄了讓我在Gambit和Racket之間進行可移植的代碼,因爲它對於那個特定的項目並不是真正的需求,而只是一些很好的東西。特別是當我想出如何從Racket中的Gambit中獲得我想要的東西時(問題的答案是「這是目前在終端上運行嗎?」)。 –

2

在情況下,它可以幫助:在球拍可以在R5RS文件中使用包括:

#lang r5rs 
(#%require (only racket include)) 
(include "foo.scm") 

如果定義#%require什麼也不做的開局,那麼你可以在兩個實現中使用相同的源文件。

+0

由於我遇到的部分問題是我無法重新定義其中的一個,因此我無法看到如何使用它。我錯過了什麼嗎? –

+0

當你調用gsi時,你可以給它一個文件列表。第一個可以包含Gambit特定的定義。 – soegaard

+0

據我記得,球拍具有相同的功能,因此我可以在該文件中執行'(定義包含加載)'。不喜歡對代碼的運行方式做出假設,但我認爲這是最接近的。 –