如何在Common Lisp中拆解列表以调用固定参数函数?
解决方案
方法一:使用apply函数
这是最直接的外部解决方案,无需修改原函数,也不用编写宏。apply的作用就是将列表元素拆分为独立参数传递给目标函数,只要列表长度和函数参数数量匹配即可:
(apply #'Foo list) ; 输出:6
这里#'Foo用于获取函数Foo的函数对象,list是包含三个参数的列表,apply会自动将列表拆解为三个独立参数传入Foo。
方法二:编写正确的宏
你之前的宏报错是因为语法错误:反引号()后不能直接跟,@,必须搭配完整的表达式结构。另外你预想的(Foo (dissolve list))调用形式本身不符合Lisp函数调用规则——Foo需要三个参数,但该写法只传入了一个参数(dissolve`的返回值)。正确的宏应该帮你生成合法的函数调用表达式,比如:
(defmacro call-with-args (func args-list) `(,func ,@args-list))
使用时调用:
(call-with-args Foo list) ; 展开后等价于(Foo 1 2 3),输出:6
你的宏错误原因
你写的代码:
(defmacro dissolve (list) `,@list)
语法上不成立,因为,@需要嵌入在反引号包裹的模板结构中。即便改成(defmacro dissolve (list) (,@list)),调用(Foo (dissolve list))也会展开为(Foo (1 2 3))——这是把整个列表作为单个参数传给Foo`,完全不符合需求。
内容的提问来源于stack exchange,提问作者MRmHolub
相关产品推荐
相关产品推荐

