我们都熟悉:
#ifndef MY_HEADER_FILE_H
#define MY_HEADER_FILE_H
...
#endif
直到最近,我从未担心两次加载相同的Scheme文件(SICP Scheme解释器实现改变了......)
在Scheme中是否有推荐的模式来模拟'include guard'?它可以是便携式的,还是最有可能是特定于实现的?
我目前正在使用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}}不会拥有它。
答案 0 :(得分: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中定义。