Lisp 在几个原子上使用读取时间条件化

Lisp 在几个原子上使用读取时间条件化,lisp,common-lisp,Lisp,Common Lisp,我想使用Lisp的读取时间条件化特性来合并代码的两个版本,旧版本和新版本。我有点像: '(ant bee #+new cat #+new dog #+new eel fish) 所以旧版本是: '(ant bee fish) 当定义了新功能时,新版本为: '(ant bee cat dog eel fish) 有没有更简洁的方法,只出现一次#+new?如果您也可以使用反引号,这里有一个解决方案,至少可以在三种常见的Lisp实现中使用。您可以简单地对列表进行反报价,然后在拼接列表中的逗号前使

我想使用Lisp的读取时间条件化特性来合并代码的两个版本,旧版本和新版本。我有点像:

'(ant bee #+new cat #+new dog #+new eel fish)
所以旧版本是:

'(ant bee fish)
当定义了新功能时,新版本为:

'(ant bee cat dog eel fish)

有没有更简洁的方法,只出现一次#+new

如果您也可以使用反引号,这里有一个解决方案,至少可以在三种常见的Lisp实现中使用。您可以简单地对列表进行反报价,然后在拼接列表中的逗号前使用条件:

CL-USER> `(a b #+new,@'(c d e) f)
(A B F)

CL-USER> (push :new *features*)
...

CL-USER> `(a b #+new,@'(c d e) f)
(A B C D E F)
在文档一节中,我们了解到(重点添加):

#+通过先读取要素表达式,然后在要素表达式失败时跳过表单进行操作。在阅读测试时, 当前包是关键字包。跳过表单是不正确的 通过将*read suppress*绑定为true,然后调用read来完成


backquote没有通用的实现,所以我不能绝对肯定它是否完全可移植。我们的假设是,,@将作为一个表单来读取,因此它是跳过的。如果可以将其作为多个表单进行处理,那么这将不起作用。我已经在Clozure CL、SBCL和CLISP中对其进行了测试,并且在所有这些方面都有效。

类似这样的内容是否有帮助:

#+new
(defvar *new-items* '(cat dog eel))
#-new
'(ant bee fish)
#+new
(append '(ant bee fish) *new-times*)
为了更方便携带?不完全是一次使用
#+new
,但它使其使用不那么分散