首页 > 代码库 > 热烈庆祝国产编程语言R++1.8研发成功

热烈庆祝国产编程语言R++1.8研发成功

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这些基础类型都是由用户自定义的,一切由您做主。

5.它的语法相当简洁,支持N种省略语法,最大程度减少您的击键次数。

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+‘}‘)]}



仅用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‘
}