运算符#+和# - 在.sbclrc中

时间:2011-12-28 04:00:47

标签: lisp common-lisp sbcl reader-macro

有人知道#+#-.sbclrc运算符的含义吗?我在手册中找不到它。 安装quicklisp后,我在#-中看到了.sbclrc

#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

我也在SBCL用户手册中看到#+,但我找不到其功能的说明。看起来像是加载单个模块相关的东西。

它们仅适用于SBCL实施还是Common lisp的一部分?

2 个答案:

答案 0 :(得分:18)

这是Common Lisp的一般设施,不仅仅是SBCL。

有一个变量cl:*features*,它列出了当前Lisp系统中应该出现的'features'符号。典型特征是:字节序,实现,子系统,处理器,扩展,Lisp方言等。

在Lisp文件中,表达式#+quicklisp(foo)表示:只有在功能列表(foo)中存在功能quicklisp时才读取并执行*features*

在Lisp文件中,表达式#-quicklisp(foo)表示:只有在功能列表(foo)中不存在功能quicklisp时才读取并执行*features*

此工具通常用于隐藏或显示某些其他Common Lisp实现的特定于实现的代码。

参见文档:

答案 1 :(得分:7)

他们是Common Lisp READ的一部分。这个想法是他们“隐藏”文本,除非某个特征(通常是某个CL实现)是(#+)或不是(#-)可用。

这些可能是CL概念最像C / C ++的“文本宏”概念 - 从概念上和实际上,它们非常类似于

 #ifdef __MSVC12__
 #ifndef __cplusplus__

......等等。它们实际上隐藏了来自READ的传入源代码的一些内容,因此它们永远不会被修改 - 解析 - 解释 - 编译 - 评估 - 实习 - 虚无...如果您运行的CL实现缺少功能/是“错误”实现/任何标志,它们就会停止存在。