我想使用Lisp的读取时间条件化功能来合并我的代码的两个版本,无论是旧的还是新的.我有类似的东西:
'(ant bee #+new cat #+new dog #+new eel fish)
所以旧版本是:
'(ant bee fish)
当定义功能new时,新版本是:
'(ant bee cat dog eel fish)
有没有一种方式更简洁地写这个,只有一次#+ new?
如果您也可以使用反引号,这里的解决方案至少可以在三个Common 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)
在文档部分2.4.8.17 Sharpsign Plus中,我们读到了(强调添加):
#+首先读取要素表达式,然后在要素表达式失败时跳过表单.在阅读测试时,当前包是KEYWORD包.跳过表单是通过将*read-suppress*绑定到true然后调用read来完成的.
没有反引号的通用实现,所以我并不完全确定这是完全可移植的.我们依赖于,@
将被视为一个表单的假设,以便它被跳过.如果它可以作为多个表单处理,这将不起作用.我已经在Clozure CL,SBCL和CLISP中对它进行了测试,它适用于所有这些.