有人知道#+
中#-
和.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的一部分?
答案 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实现缺少功能/是“错误”实现/任何标志,它们就会停止存在。