R++是专为懒人设计的国产编程语言。支持无操作系统裸奔、编译成机器码、android、cocos2dx绑定、中文编程、闭包、惰性求值、JSON、Lisp的S表达式、内联汇编、伪代码、模板、宏、多重继承、元编程、反射、自省、指针、引用。
为什么须要它?
1.眼下DIY操作系统一般使用gcc+nasm,R++是编译型语言,抽象能力强过C,可直接内联汇编。不须要面对讨厌的AT&T汇编,绝对是您DIY操作系统的利器(支持GRUB从U盘或硬盘引导)。
2.R++没有GC,所以理论执行速度和C++一样。能够作为lua的替代者候选。
3.R++既能够编译执行又能够解释执行,既能够用静态类型又能够用动态类型。
语法层支持C++、JS、Lisp、python、asm混合编程,一种语言,五种语法。
4.R++自由度极高。您能够任意DIY运算符的优先级,添加新运算符,添加改动“内置类型”,甚至于int、double这些基础类型都是由用户自己定义的,一切由您做主。(假设您想制作属于自己的编程语言并进入有用阶段,R++将是您的最佳參考。没有之中的一个)
5.它的语法相当简洁,支持N种省略语法,最大程度降低您的击键次数。
(R++支持类似《算法导论》的伪代码)
6.R++支持多种花括号风格,不管是python的无花括号风格还是K&D风格。或者是花括号单独占一行,随你喜欢。
7.它是C++的山寨版,假设您习惯了C++的语法。又须要一种类似C++的脚本语言,似乎选择R++是一个明智的决定。
8.既然它是C++的山寨版,所以R++差点儿不须要学习成本,非常多C++和C的代码经少量改动都可以移植过来。甚至可以写出同一时候兼容R++和C++的代码。
9.又由于它是C++的山寨版,R++全部数据类型和C++二进制兼容,不管是静态链接还是动态链接,想如何就如何。
10.R++源码文件能够使用随意后缀,在R++的世界里。一切都是代码。
11.支持中文编程是必须的。
R++2.0正在紧急研发中,敬请期待:
以下是用160行R++代码实现的flappy bird:
下载地址:
http://pan.baidu.com/s/1i31IG77
用R++写窗体程序十分简单:
import rcc.h main { cc.jump_scene(lambda(void* parent){ void* a=cc.label_create("hello") cc.set_pos(a,240,400) cc.add_child(parent,a) cc.set_color(a,255,255,255) }) }
仅用1行代码就实现了一个带三角函数、乘方的全然功能四则混合计算器:
main{void[meta('(){putsl '+getsl+'}')]}
类似《算法导论》的伪代码:
/* 能够把R++当做伪代码写, 以下就是《算法导论》开篇的插入排序代码 (因为R++数组从下标0開始而算法导论从1開始,故略微改动了下) */ define ← = insertion_sort(rstr& a) { for j ← 1 to a.count-1 key ← a[j] i ← j-1 while i>=0 && a.get(i)>key a[i+1] ← a[i] i ← i-1 a[i+1] ← key }
仅用60行代码就实现了一个httpserver:
/* 简单的httpserver,參考《深入理解计算机系统》 执行后在浏览器输入http://127.0.0.1/example/1.h */ import rsock.h import rfile.h import rdir.h main { rsock svr rsock client svr.listen(80) for svr.accept(client) proc(client,client.recv_s(65536)) client.close } class http_item { rstr name rstr cont } proc(rsock& client,rstr& s) { s.print vstr=s.split(' ') rbuf<http_item> vitem for i in vstr pos=vstr[i].find(' ') http_item item item.name=vstr[i].sub(0,pos) item.cont=vstr[i].sub(pos+1) vitem+=item proc(client,vitem) } proc(rsock& client,rbuf<http_item>& v) { if v.empty||v.get(0).name!='GET' return path=v[0].cont.sub(0,v[0].cont.find(' ')) path='.'+path rfile file(path) s='HTTP/1.1 200 OK ' s+='Server: R++ Web Server ' s+='Content-Length: '+file.size+' ' s+='Content-type: '+get_type(path)+' ' s+=file.read_all client.send_s(s) } rstr get_type(rstr name) { name=rdir.get_suffix(rdir.get_name(name)) if name=='htm'||name=='html' return 'text/html' elif name=='gif' return 'image/gif' elif name=='jpg' return 'image/jpg' else return 'text/plain' }