Scheme中“包含守卫”的推荐模式?

时间:2016-05-15 08:51:41

标签: scheme

我们都熟悉:

#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}}不会拥有它。

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中定义。