You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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š

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:54:04