2016-05-15 23 views
1

我們都熟悉:計劃中的「包括守衛」的推薦模式?

#ifndef MY_HEADER_FILE_H 
#define MY_HEADER_FILE_H 
... 
#endif 

直到最近,我從來沒有擔心加載相同的方案文件兩次(在SICP Scheme解釋的實施改變了...)

有沒有推薦的模式在計劃模仿'包括衛兵'?它可以是可移植的,還是最有可能的實現特定?

我目前使用的scm落實,我想出了這個至今:

(if (not (defined? my-file-included)) 
    (begin 
    (define my-file-included #f) 
... 

)) ; include guard 

所以我已經開始粘貼周圍的所有我的文件這種模式,但我不能說我喜歡這個非常。此外,defined?scm中的一個關鍵字,它的參數未被評估:(defined? my-var)雖然它似乎是一個正常功能,但在guile(defined? 'my-var)mit-scheme不會有。

回答

1

您可以編寫一個宏來檢測給定的標識符是否綁定或不使用syntax-case。請參閱:http://saito.hatenablog.jp/entry/2012/09/14/010849(它是用日語編寫的,但您可以複製&粘貼代碼。)儘管它僅使用R6RS過程和宏,但它在某些實現中可能不起作用。 (提及R6RS第10章表達過程的博客文章的評論。)

如果您正在使用R6RS或R7RS實現之一(稱爲Guile兼容R6RS),最好將包含文件作爲庫並使用import

如果你想要做這樣的事情:

#if __GUILE__ 
# include "foo.incl" 
#else 
# include "bar.incl" 
#endif 

那麼你可以使用cond-expand這樣的:

(cond-expand 
    (guile ...) 
    (else ...)) 

注:cond-expand在R7RS和SRFI-0定義。

+0

非常感謝你對我很好,我會仔細看看 –