当前位置:  开发笔记 > 编程语言 > 正文

对几个原子使用读时条件化

如何解决《对几个原子使用读时条件化》经验,为你挑选了1个好方法。

我想使用Lisp的读取时间条件化功能来合并我的代码的两个版本,无论是旧的还是新的.我有类似的东西:

'(ant bee #+new cat #+new dog #+new eel fish)

所以旧版本是:

'(ant bee fish)

当定义功能new时,新版本是:

'(ant bee cat dog eel fish)

有没有一种方式更简洁地写这个,只有一次#+ new



1> Joshua Taylo..:

如果您也可以使用反引号,这里的解决方案至少可以在三个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中对它进行了测试,它适用于所有这些.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有