首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#ifndef在公共Lisp中

#ifndef在公共Lisp中
EN

Stack Overflow用户
提问于 2016-07-27 15:55:22
回答 2查看 200关注 0票数 3

在C中,为了确保不重新包含包含的标头,我们使用以下结构:

代码语言:javascript
复制
#ifndef UTILS
#define UTILS

#include "my_utils.h"

#endif

我已经将我的Lisp程序分解成不同的文件;多个文件有时使用同一个文件(例如,多个文件使用my_utilities )。当我运行这个程序时,我会收到警告,说我正在重新定义东西(多次调用同一个文件的load )。

通过在C中执行类似于#ifndef的操作,就可以解决这个问题。公共Lisp的等效或标准方法是什么?

我对Lisp很陌生。让我知道是否有最佳实践(也许,一种不同的方法来构造我的程序?)我错过了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-27 16:29:08

你问的问题

像C中的#if这样的预处理条件的直接模拟是#+读时条件化设施。

你想问的问题

为了避免文件多次加载,您可以使用标准(但不推荐使用) require工具,也可以使用像ASDF这样的外接程序系统。

票数 7
EN

Stack Overflow用户

发布于 2016-07-27 16:29:17

  1. 对于通用Lisp应用程序和库,最好使用系统管理工具。比如ASDF或您的实现可能提供的任何东西。系统是具有依赖关系和各种操作(load、compile、.)的文件集合。
  2. 您可以始终检查运行时的状态并执行一些操作。

示例:

代码语言:javascript
复制
(unless (fboundp 'foobar)
  (require "foo")
  (load "bar"))

(unless (find-package 'foobar)
  (require "foo")
  (load "bar"))
  1. PROVIDEREQUIRE正是为此内置的函数。如果您需要一个模块,它将被加载,除非已经provided。不幸的是,该功能在标准中未得到充分说明,但实现可能提供有用的功能。
  2. 常见的Lisp运行时在列表*features*上有一个特性列表。你可以用它来做广告和检查功能。

示例:

在你的图书馆:

代码语言:javascript
复制
(push :cool-new-graphics-library cl:*features*)

在您的应用程序代码中:

代码语言:javascript
复制
(when (member :cool-new-graphics-library cl:*features*)
  (funcall (find-symbol "DRAW-SPACE-SHIP" "CNGL")
           :death-star))

通用Lisp提供了一种将读取时间限定为条件的方法。只有在:cool-new-graphics-library特性出现时才会读取以下代码,因此只有在以后才会执行它:

代码语言:javascript
复制
#+cool-new-graphics-library(cngl:draw-space-ship :death-star)

公共Lisp还允许您表达一些逻辑:

代码语言:javascript
复制
#+(and lispworks cool-new-graphics-library)
  (cngl:draw-space-ship :enterprise)

#-cool-new-graphics-library(warn "no cool graphics library available")

请注意,您可以强制Lisp在编译时执行代码:

代码语言:javascript
复制
(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必须位于文件的顶层。这意味着它不会在嵌套形式中深入工作。不过,它确实在一层PROGNLOCALLYMACROLETSYMBOL-MACROLET中工作。

因此,EVAL-WHEN允许您运行代码,这是当前编译的文件的一部分。此代码可以查找加载的系统、提供的模块、可用的函数等。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38617905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档