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行代码就实现了一个http服务器:
/*
简单的http服务器,参考《深入理解计算机系统》
运行后在浏览器输入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('\r\n')
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\r\n'
s+='Server: R++ Web Server\r\n'
s+='Content-Length: '+file.size+'\r\n'
s+='Content-type: '+get_type(path)+'\r\n\r\n'
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'
}