如何在Lisp的loop宏内仅计算一次高开销函数f并按条件收集结果
当然有,直接用LOOP宏原生的迭代变量绑定语法就可以实现,完全不需要在LOOP外部额外声明变量:
(loop for i from 1 to 10 for fi = (funcall f i) when (> fi 0) collect (list i fi))
说明
- 这里的
for fi = (funcall f i)是LOOP的标准子句,每一轮迭代只会计算一次(funcall f i),并将值绑定到LOOP内部的局部变量fi上,既满足了函数f仅计算一次的性能要求,也不会有变量泄露到LOOP外部。 - 你最开始的写法无法正常运行,原因是
when (... collect)写在了do的表达式块内部,不属于LOOP宏的原生子句,收集的结果不会被LOOP作为返回值返回,而用上述原生子句的写法可以直接和when、collect等LOOP标准子句配合,完全符合语法规则。
内容的提问来源于stack exchange,提问作者Garrett Badeau
相关产品推荐
相关产品推荐

