2009-09-19 32 views
4

Common Lisp中我可以有條件地排除或包括用於這樣不同的實施方式的代碼:編寫便攜式Scheme代碼的最佳方式?

#+sbcl (use-sbcl-cool-feature) 
#-sbcl (use-my-own-not-so-cool-version) 

這樣我可以通過分離非便攜位編寫可移植代碼。

這怎麼能在Scheme中完成?有沒有辦法向Scheme解釋器或編譯器詢問它的名字(甚至是它實現的標準)?

(cond ((r6rs?) 
     (make-eq-hashtable)) 
     ((gambit?) 
     (make-table)) 
     ;; other cases here 
     (#t (make-my-inefficient-hash-table)) 

我知道我可以換的代碼的所有可能的不可移植件在不同的程序,然後有兼容性包這樣的:

;; in my-libs-gambit.scm: 
(define make-hash-table make-table) 

而且僑胞,爲我-libs- [其他-schemes-這裏] .scm

這是唯一的方法嗎?

我不會嘗試在Scheme中製作一個完全可移植的應用程序,但如果我可以讓我的程序在兩個或三個不同的實現中運行,那將會很好。

回答

2

Slides of a talk由Dorai Sitaram關於此主題。 按照給定的指示here也可能有所幫助。

+0

非常感謝Vijay!我會看看scmxlate - 它似乎很適合我的需求。 – Jay 2009-09-20 11:35:15