Loop macro使用技巧:如何同时将多返回值收集到多个不同列表?
实现方案
跨实现通用写法(最稳妥)
你可以借助multiple-value-setq在单次调用函数后直接绑定两个返回值,再用原生的collect语法收集:
(loop with name and phone for i upto 2 do (multiple-value-setq (name phone) (name-and-phone i)) collect name into names collect phone into phones finally (return (values names phones)))
这个写法满足所有需求:
- 每个
name-and-phone仅调用一次,无额外性能损耗 - 不需要临时存储cons对,也不需要事后拆分临时列表,逻辑清晰
- 完全复用Common Lisp标准
loop宏的原生语法,所有兼容ANSI CL的实现都可以运行
扩展语法写法(更简洁,部分实现支持)
SBCL、CCL等主流Common Lisp实现支持loop的多值绑定扩展,可以直接用values关键字在for子句中绑定多返回值,代码更直观:
(loop for i upto 2 for (values name phone) = (name-and-phone i) collect name into names collect phone into phones finally (return (values names phones)))
内容的提问来源于stack exchange,提问作者Dominik Mokriš
相关产品推荐
相关产品推荐

