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

在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编译器,以便于您获取更多的相关知识。

时间: 2024-10-21 19:34:55

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

shelisp 3.0发布 Common Lisp的语法扩展

shelisp 3.0该版本添加了一些新功能,如:wget-test,bash-result,这个版本是基于Lisp LGPL重新发布. Shelisp是一款Common Lisp的语法扩展,使能够从Lisp和混合shell和Lisp结构中组成和运行Unix shell脚本. 软件信息:http://dan.corlan.net/shelisp/ 下载地址:http://dan.corlan.net/shelisp/shelisp.lisp

CLOS - Common Lisp Object System

CLOS - Common Lisp Object System 一种无阻塞网络架构模型,也被称为CLOS组网结构,类似于大型机内部总线的组网方式.这种架构满足集群环境中所有服务器的对等通信要求,任意节点之间可以达到相等带宽(当前是以千兆为主),服务器应用程序不再关注数据交互节点是否在一个机架内.CLOS架构的系统,消除了带宽限制的特性使内部数据交换更灵活,数据访问不再受限于服务器的物理位置,有利于云计算性能的充分发挥. (责任编辑:蒙遗善)

Steel Bank Common Lisp 1.0.52发布 编程语言的开发环境

Steel Bank Common Lisp是一个高性能的Common Lisp编译器,它提供了一个交互式的开发环境,包括一个调试器.统计监测,代码覆盖工具,和其他多种扩展.支持ANSI标准,包括:垃圾收集,词法闭包,http://www.aliyun.com/zixun/aggregation/17547.html">功能强大的宏,强大的动态类型,增量编译,和Common Lisp对象系统.它包含了多种扩展,如原生线程,套接字支持,统计探查器,可编程的数据流,等等.这些都是可以通过一个集

Steel Bank Common Lisp 1.0.51发布 编程语言的开发环境

Steel Bank Common Lisp是一个Common Lisp编程语言的开发环境,支持ANSI标准,包括:垃圾收集,词法闭包,http://www.aliyun.com/zixun/aggregation/17547.html">功能强大的宏,强大的动态类型,增量编译,和Common Lisp对象系统.它还包含了多种扩展,如原生线程,套接字支持,统计探查器,可编程的数据流,等等.这些都是可以通过一个集成互动的本地编译器来完成.SBCL的独特之处是一个多平台的原生编译器从源代码完全

vs项目发布时提示类似Default-Web.config Connection String”参数不能为 Null 或空的报错问题

参考地址: http://stackoverflow.com/questions/28996604/the-defaultconnection-web-config-connection-string-argument-cannot-be-null-or Create a Parameters.xml file in the Project root with the following content: <?xml version="1.0" encoding="ut

通俗解释主要编程语言及其用途

在 Quora 网站上有这样一个问答贴:<In layman's terms, what are the major programming languages, and what are they used for? >如何用通俗语言来解释主要的编程语言及其用途.这个问答贴回复很多,不乏精彩回答.伯乐在线挑选得票数排前二的回复.编译如下: Isaac Lewis 的回复 (3457 票,最有特色的回复,把编程语言比作女人) PHP 是十多岁的花季恋人,是你在那个夏天首次笨手笨脚寻求的女孩.但

跨越边界: Lisp之美

Lisp 长久以来一直被视为伟大的编程语言之一.其漫长的发展过程(接近五十年)中引发的追随狂潮 表明:这是一门非同凡响的语言.在 MIT,Lisp 在所有程序员的课程中占了举足轻重的地位.像 Paul Graham 那样的企业家们将 Lisp 卓越的生产力用作他们事业成功起步的推动力.但令其追随者懊恼万分 的是,Lisp 从未成为主流编程语言.作为一名 Java 程序员,如果您花一点时间研究 Lisp 这座 被人遗忘的黄金之城,就会发现许多能够改进编码方式的技术. 我最近第一次完成了马拉松赛跑

Lisp 匿名递归函数

主流的 Lisp 实现(CLISP.Guile.Emacs Lisp 等)中默认都没提供定义匿名的递归函数的方法.上 Google 搜索了一下,看到不少人也都在抱怨.不过 Lisp 一个特色就是你可以自己动手添加需要的语言特性!于是我就尝试着自己写一个宏来实现这个功能. 用 Lisp recursive lambda 做关键词搜索,找到老外一篇 08 年的文章,里面提到一种用两个 Lambda 实现的递归方法.我将格式整理了一下: (funcall (lambda (fn n) (funcall

Lisp的本质

简介 最初在web的某些角落偶然看到有人赞美Lisp时, 我那时已经是一个颇有经验的程序员.在我的履历上, 掌握的语言范围相当广泛, 象C++, Java, C#主流语言等等都不在话下,我觉得我差不多知道所有的有关编程语言的事情.对待编程语言的问题上, 我觉得自己不太会遇到什么大问题.其实我大错特错了. 我试着学了一下Lisp, 结果马上就撞了墙.我被那些范例代码吓坏了.我想很多初次接触Lisp语言的人, 一定也有过类似的感受.Lisp的语法太次了.一个语言的发明人, 居然不肯用心弄出一套漂亮的