`

c++实现类似Common Lisp的多参数加法和比较

    博客分类:
  • C++
 
阅读更多

文章来源:http://www.itnose.net/detail/6050431.html 更多文章:http://www.itnose.net/type/55.html

在CL里我们可以这样:

1 $ sbcl
2 * (+ 1 2 3)
3 6
4 * (< 1 2 3)
5 T
6 * (< 2 3 1)
7 NIL
8 * 

从简单的方面看, CL的+和<就是一个接收多参数的函数,有点类似cpp的add(1,2,3)和less(1,2,3)这样.

所以当C++11开始有了变参模板以后, 就可以玩多参数的加法和多参数比较了

 1 #include <functional>
 2 template<typename O, typename A,typename B>
 3 bool cmp(O o, A a,B b){
 4     return o(a, b);
 5 }
 6 template<typename O, typename A,typename B,typename... C>
 7 bool cmp(O o,A a,B b,C... c){
 8     return o(a, b) and cmp(o,b,c...);
 9 }
10 template<typename O, typename A,typename B>
11 A reduce(O o, A a,B b){
12     return o(a, b);
13 }
14 template<typename O, typename A,typename B,typename... C>
15 A reduce(O o,A a,B b,C... c){
16     return reduce(o,o(a, b),c...);
17 }
18 
19 bool foo(int a,int b,int c,int d){
20   return cmp(std::less<int>(), a,b,c,d);
21 }
22 int bar(int a,int b,int c,int d){
23   return reduce(std::plus<int>(), a,b,c,d);
24 }

可能有人会说,这不是坑爹么, 先不管写法比CL的丑, 你还递归调用了,简直弱爆了.....

让我们来看看真相(clang):

 1 foo(int, int, int, int):                             # @foo(int, int, int, int)
 2     cmpl    %esi, %edi
 3     jge    .LBB0_1
 4     cmpl    %edx, %esi
 5     setl    %sil
 6     cmpl    %ecx, %edx
 7     setl    %al
 8     andb    %sil, %al
 9     ret
10 .LBB0_1:
11     xorl    %eax, %eax
12     ret
13 
14 bar(int, int, int, int):                             # @bar(int, int, int, int)
15     addl    %esi, %edi
16     leal    (%rdi,%rdx), %eax
17     addl    %ecx, %eax
18     ret

和手写的完全没差噢, 稍微是丑一点,不过你看下CL的汇编, 肯定比C++的慢....(逃

最后,这有啥用?

多参数加法似乎是没啥用处了,还不如写a+b+c+d呢
多参数比较还行

a < b and b < c and c < d

 
 
 

 

分享到:
评论

相关推荐

    ANSI Common Lisp 中文翻译版.pdf

    此资源是 ANSI Common Lisp 的中文翻译版,涵盖了 Common Lisp 语言的基础知识和高级主题。该资源包含了 17 章节,从基础的列表、特殊数据结构、控制流程、函数、输入与输出、符号、数字、宏、Common Lisp 对象系统...

    C++ 实现的 LISP 编译器

    在C++中实现LISP编译器,可能需要实现词法分析、语法分析和语义分析等阶段。词法分析负责识别LISP源代码中的基本单元,如数字、符号和括号;语法分析将这些单元组合成抽象语法树(AST);语义分析则检查代码的正确性...

    实用Common.Lisp编程.pdf

    Common Lisp中的Common Lisp Object System (CLOS)提供了多重继承和多态性的支持,使得面向对象编程在Common Lisp中成为可能。 #### 5. 跨平台性 Common Lisp编写的程序可以在多种操作系统上运行,包括Windows、...

    ANSI Common Lisp 中文翻译版含目录

    11. **Common Lisp对象系统(CLOS)**:作为面向对象编程的支持框架,CLOS允许开发者定义类和对象,实现继承、多态等特性。本章会详细介绍CLOS的基本原理和用法。 12. **结构(Structure)**:本章介绍了一种类似于...

    Common Lisp The Language 2nd

    Common Lisp是一种功能强大的多范式编程语言,支持过程、面向对象、函数式和声明式编程风格。这本书的第二版深入探讨了Common Lisp的所有核心特性,旨在帮助读者不仅掌握语言基础,还能深入了解其高级特性和实践应用...

    Practical Common Lisp笔记

    7. **函数式编程**:Common Lisp支持高阶函数、尾递归优化和匿名函数,使得函数式编程风格得以流畅实现。 8. **面向对象编程**:虽然不是其核心特性,但Common Lisp提供CLOS(Common Lisp Object System),一个...

    实用Commonlisp编程

    4. 面向对象编程(CLOS):Common Lisp支持多种编程范式,其中面向对象编程是通过Common Lisp对象系统(Common Lisp Object System,简称CLOS)实现的。CLOS不仅支持类和继承,还支持多重方法分派、组合设计模式等...

    Common LISP书籍中文版pdf格式带书签.rar

    本压缩包包含三本关于Common Lisp的重要书籍,分别是《ANSI Common Lisp》、《On Lisp》以及《实用Common Lisp编程》,都是学习和深入理解Common Lisp的宝贵资源。 《ANSI Common Lisp》由Paul Graham撰写,是...

    Practical Common Lisp pdf

    Common Lisp是Lisp家族中的一个广泛使用的标准版本,它集成了多种子语言,提供了丰富的库支持,包括面向对象编程、函数式编程和元编程等特性。 本书《实用Common Lisp》深入浅出地介绍了Lisp的基本概念,包括符号、...

    ANSI Common Lisp(Pau Graham).pdf

    本书不仅是对Common Lisp语言特性的全面介绍,还包含了丰富的实践指导和理论基础,对于理解Lisp家族语言乃至整个编程领域都有着不可忽视的价值。 ### Common Lisp简介 Common Lisp是一种高级的通用编程语言,它...

    Common Lisp 高级编程技术

    1. **Common Lisp基础**:Common Lisp是一种通用的多范式编程语言,支持过程式、面向对象、函数式和反射等多种编程风格。书中会介绍其基本语法,包括S表达式、读取-求值-打印循环(REPL)以及Lisp代码的读取和评估机制...

    Practical Common Lisp-1st-2005

    《Practical Common Lisp-1st-2005》是一本专注于Common Lisp编程语言的实用书籍,作者Peter Seibel通过这本书向读者展示了如何使用Common Lisp来解决真实世界中的问题,强调程序员作为工程师和艺术家的双重身份,而...

    实用Common.Lisp编程

    这本《Practical Common Lisp》之所以号称Practical,正是因为这本书大量介绍Common Lisp在现实世界中的各种...本书有相当多应用程序的范例,透过本书的各个范例,你会渐渐体会到,运用Common Lisp写程序是很酷的事。

    Common Lisp-对符号计算的温和介绍Common Lisp - A Gentle Introduction To Symbolic Computation

    2. **函数定义**:在Common Lisp中,函数可以接受符号作为参数,并返回新的符号或表达式。 3. **宏定义**:宏是一种特殊的函数形式,它可以接受符号作为输入,并在编译时生成新的代码。 4. **元编程**:通过使用符号...

    ANSI Common Lisp 中文版

    综上所述,《ANSI Common Lisp》不仅适合初次接触Lisp语言的新手,也能让有一定基础的开发者获得新的灵感和见解。无论你是想学习一门新语言还是希望通过实践提升编程能力,《ANSI Common Lisp》都将是你不可或缺的...

    lisp经典教程common lisp A Gentle Introduction To Symbolic Computation

    - **阅读相关书籍**:除了《Common Lisp: A Gentle Introduction to Symbolic Computation》外,还可以参考其他经典的Lisp书籍,如《On Lisp》和《Practical Common Lisp》等。 总之,《Common Lisp: A Gentle ...

    ansi common lisp 教程

    新的和更强大的方法教育学生的思考程序,该文本包含一个教程的例子,说明Lisp编程的基本概念,以及ANSI Common Lisp的一个跟上时代的总结,列出每个运营商在语言。信息和乐趣,它给学生提供了他们所需要的一切,开始...

    一篇CommonLisp中文入门文章Common LISP Hints (CHM)

    一篇CommonLisp中文入门文章Common LISP Hints 从Ubuntu论坛上看到的, 觉着不错就给打包成了CHM 如果看不到请: 右键=&gt;属性=&gt;解除锁定

    实用Common Lisp编程

    本书首先从作者的学习经过及语言历史出发,随后用21个章节讲述了各种基础知识,主要包括:REPL 及Common Lisp 的各种实现、S- 表达式、函数与变量、标准宏与自定义宏、数字与字符以及字符串、集合与向量、列表处理、...

Global site tag (gtag.js) - Google Analytics