在CL里我们可以这样:
$ sbcl * (+ 1 2 3) 6 * (< 1 2 3) T * (< 2 3 1) NIL *
从简单的方面看, CL的+和<就是一个接收多参数的函数,有点类似cpp的add(1,2,3)和less(1,2,3)这样.
所以当C++11开始有了变参模板以后, 就可以玩多参数的加法和多参数比较了
#include <functional> template<typename O, typename A,typename B> bool cmp(O o, A a,B b){ return o(a, b); } template<typename O, typename A,typename B,typename... C> bool cmp(O o,A a,B b,C... c){ return o(a, b) and cmp(o,b,c...); } template<typename O, typename A,typename B> A reduce(O o, A a,B b){ return o(a, b); } template<typename O, typename A,typename B,typename... C> A reduce(O o,A a,B b,C... c){ return reduce(o,o(a, b),c...); } bool foo(int a,int b,int c,int d){ return cmp(std::less<int>(), a,b,c,d); } int bar(int a,int b,int c,int d){ return reduce(std::plus<int>(), a,b,c,d); }
更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/
可能有人会说,这不是坑爹么, 先不管写法比CL的丑, 你还递归调用了,简直弱爆了.....
让我们来看看真相(clang):
foo(int, int, int, int): # @foo(int, int, int, int) cmpl %esi, %edi jge .LBB0_1 cmpl %edx, %esi setl %sil cmpl %ecx, %edx setl %al andb %sil, %al ret .LBB0_1: xorl %eax, %eax ret bar(int, int, int, int): # @bar(int, int, int, int) addl %esi, %edi leal (%rdi,%rdx), %eax addl %ecx, %eax ret
和手写的完全没差噢, 稍微是丑一点,不过你看下CL的汇编, 肯定比C++的慢....(逃
最后,这有啥用?
多参数加法似乎是没啥用处了,还不如写a+b+c+d呢
多参数比较还行
a < b and b < c and c < d
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 参数
, common
, lisp
, commom lisp
, 加法
nil
common lisp、实用common lisp编程、ansi common lisp、common lisp 开发环境、common lisp编译器,以便于您获取更多的相关知识。