在C中,为了确保不重新包含包含的标头,我们使用以下结构:
#ifndef UTILS
#define UTILS
#include "my_utils.h"
#endif我已经将我的Lisp程序分解成不同的文件;多个文件有时使用同一个文件(例如,多个文件使用my_utilities )。当我运行这个程序时,我会收到警告,说我正在重新定义东西(多次调用同一个文件的load )。
通过在C中执行类似于#ifndef的操作,就可以解决这个问题。公共Lisp的等效或标准方法是什么?
我对Lisp很陌生。让我知道是否有最佳实践(也许,一种不同的方法来构造我的程序?)我错过了。
发布于 2016-07-27 16:29:08
发布于 2016-07-27 16:29:17
示例:
(unless (fboundp 'foobar)
(require "foo")
(load "bar"))
(unless (find-package 'foobar)
(require "foo")
(load "bar"))PROVIDE和REQUIRE正是为此内置的函数。如果您需要一个模块,它将被加载,除非已经provided。不幸的是,该功能在标准中未得到充分说明,但实现可能提供有用的功能。*features*上有一个特性列表。你可以用它来做广告和检查功能。示例:
在你的图书馆:
(push :cool-new-graphics-library cl:*features*)在您的应用程序代码中:
(when (member :cool-new-graphics-library cl:*features*)
(funcall (find-symbol "DRAW-SPACE-SHIP" "CNGL")
:death-star))通用Lisp提供了一种将读取时间限定为条件的方法。只有在:cool-new-graphics-library特性出现时才会读取以下代码,因此只有在以后才会执行它:
#+cool-new-graphics-library(cngl:draw-space-ship :death-star)公共Lisp还允许您表达一些逻辑:
#+(and lispworks cool-new-graphics-library)
(cngl:draw-space-ship :enterprise)
#-cool-new-graphics-library(warn "no cool graphics library available")请注意,您可以强制Lisp在编译时执行代码:
(eval-when (:load-toplevel :compile-toplevel :execute)
#+(and lispworks cool-new-graphics-library)
(cngl:draw-space-ship :enterprise)
#-cool-new-graphics-library(warn "no cool graphics library available")
)要使其工作,EVAL-WHEN必须位于文件的顶层。这意味着它不会在嵌套形式中深入工作。不过,它确实在一层PROGN、LOCALLY、MACROLET和SYMBOL-MACROLET中工作。
因此,EVAL-WHEN允许您运行代码,这是当前编译的文件的一部分。此代码可以查找加载的系统、提供的模块、可用的函数等。
https://stackoverflow.com/questions/38617905
复制相似问题