如梦令编程语言发布 (RML)
如梦令编程语言是在Rebol语言核心语法的基础上,做了一些自以为是的修改而来。谨以此为Rebol语法的传承,略尽绵薄之力。
基本概念
如梦令语言分属Lisp语系,代码本身是一个层层嵌套的Token列表,代码与数据具有同像性,与目前流行的C系编程语言有较大区别。RML的代码在运行时分割为Token列表,每个Token通过其字面表示的格式确定类型。 主流的编程语言通常会定义一系列的语法规则来实现程序所需的各种功能,而RML中只有一种核心语法:表达式的长度和实现的功能由头部Token确定,当获取到的Token数量满足头部Token的要求时,判断表达式完整,并进行求值。其与传统Lisp语言的区别在于,Lisp中表达式的长度依靠括号()来确定,因此Lisp往往被吐槽括号太多,影响阅读。RML中剔除了这一依赖,便于书写,另一方面也带来了表达式定长的限制,通过修饰字的概念,能够减少这种限制带来的不便,这便是RML在语法上的取舍。
基本语法
第一行代码
print "hello word"
注释
;这是单行注释
数据类型
n i: 123 4.56 true "hello" #'A' [1 2 3] (1 2 3) {a: 123} a/b/c %rml/go/rml.go #{0a0b}
Rebol中提供了多达50种数据类型,RML目前实现了常用的一些基本数据类型,从左到右分别是 单字,设字,整数,小数,逻辑,字符串,字符,方块,圆块,对象,路径,文件,二元 类型,数据类型有对应的字面表达格式,主要通过空白字符分隔。集合类型首先被视为单个Token,内部另行分割。
赋值
i: 123 j: 456
x: j: 789
取值
i ;输出123
中缀运算
1 + 2 * 3 ;输出9
1 + (2 * 3) ;输出7
传统Lisp语言不支持中缀运算符,RML中为了贴近使用习惯,提供了中缀运算支持。中缀运算优先级比一般表达式高,但中缀运算符间优先级相同。
路径类型
路径类型用于集合类型的存取操作,形式上是一串连续的以 / 连接的Token,以此表示层级关系,例如 a/b/c/1
路径中可以插入圆块和取字进行动态求值,例如
b/(1 + 2)/a ;等同于b/3/a
方块类型
方块类型 [] 等同于Lisp中的列表,类似于其他语言中的Array/List的概念,通过路径类型可以对方块进行设值、取值操作。
blk: [1 2 3]
blk/2 ;输出2
blk/2: 5
blk ;输出[1 5 3]
方块主要通过序号作为索引,且序号从1开始。
对象类型
RML中的对象对应了Rebol中语境的概念,其本质是一个具有层级关系的 map,每个对象都存放了其父级对象的指针。与Rebol不同,RML中对象的字面格式类似于 js
obj: {a: 123 b: 456 c: {d: 789}}
对象类型支持嵌套,同样通过路径进行操作
obj/c/d ;输出789
obj/c/d: 987
obj/c/d ;输出987
自定义函数
f: func [n] [n * 2]
f 2 ;输出4
通过内置的原生函数 func 可以实现用户自定义函数。 func 需要两个参数,第一个是参数列表的方块,第二个是要执行的代码方块。函数会返回最后一个表达式的返回值,也可以通过 return 来手动返回值。
循环
loop 3 [print "hello"] repeat i 3 [print i] for i 1 3 1 [print i] while [i < 5] [print i]
分支
if 1 > 2 [print 1] ;跳过
either 1 > 2 [print 1] [print 2] ;打印2
多线程
fork [fib 40] ;启动一个Goroutine进行计算,不等待
res: 0
fork/result [fib 40] res ;通过修饰字,指定分支线程返回值的接收者 spawn [ [print fib 40] [print fib 40] ] ;启动两个Goroutine进行计算,不等待
spawn/wait [ [print fib 40] [print fib 40] ] ;启动两个Goroutine进行计算,并等待其全部执行完毕
中文支持
打印 "你好,世界" ;中文版hello world ;下面是求10000以内素数的中文代码
集合为 [] 历 甲 1 10000 1 [
是素数为 真
历 乙 2 (甲 除以 2) 1 [
若 甲 模 乙 等于 0 [是素数为 假 跳出]
]
若 是素数 [
添加* 集合 甲
]
] 打印 集合
即时帮助
RML的内置函数都定义在最底层的lib语境中,可以通过以下方式查看lib语境中的定义
lib? ;中文为 库?
RML支持在定义函数时添加关于函数和参数的描述,并可以在解释器中查看这些帮助信息。目前RML中初始化定义的中文函数都添加了相关的帮助信息,查看方式如下:
帮助 写出 ;英文对应 help write 或 ? write ;输出的帮助信息
FUNC:
desc: 将数据写出到文件中 args: 路径 要写出数据的文件
数据 要写出的数据,接受字符串和二元类型 props: /添加 无参,在文件的结尾添加数据而不是覆盖
性能
目前RML语言的性能很差。用于采用了逐字解释和动态作用域,整体性能相对主流语言有较大差距。尤其是在深层次递归函数运算中,由于语境的堆叠,影响了取值操作的性能。一定时期内,性能问题都不是RML主要考虑的问题。对计算性能有较高要求的部分,RML可以通过宿主语言定义原生函数,从而实现宿主语言的性能。例如求斐波那契数列,用RML实现 fib 30 在E5-1620CPU上大约耗时8秒,而通过在go中定义,在RML中调用的方式,则只需6毫秒,性能提高上千倍。
语言谱系
RML分属Lisp语系,对,就是那个一边被认为高逼格,同时又被疯狂吐槽括号太多的语言。从语言发展的历史来看,Lisp和C分别代表了编程语言的两个极点。C语言是贴近硬件和高性能的典范,而Lisp则是高度抽象的代表。虽然Lisp语言日渐式微,但由其首创的许多特性如 GC 在当今主流语言中得到了延续。
RML直接继承自Rebol语言。Rebol语言由Carl Sassenrath于1997年发布问世,并进行了持续数年的商业化运作,但最终没能获取商业上的成功。Carl是世界上第一个提供真彩色的操作系统AmigaOS的架构师,其编程功力可见一斑。
与Rebol的区别
- 引入语境类型的概念,增强对语境的操作
- 取消间接值的概念,复杂数据类型字面值解析前后一致
- Rebol不支持多线程,RML提供多线程并行功能
- RML采用动态作用域,性能较Rebol差
相关链接
如梦令编程语言发布 (RML)的更多相关文章
- iOS10 资料汇总:值得回看的 10 篇 iOS 热文
本文精选了 iOS大全 9月份的10篇热门文章.其中有软件推荐.技术分享及iOS10.Xcode8新特性等. 注:以下文章,点击标题即可阅读 <兼容iOS 10 资料整理笔记> 本文整理i ...
- Python基础 1----Python语言基础和Python环境准备与安装
引导语: 人们学习Python是因为他们爱这门语言,因为他们追寻美,如果我雇用一个Python程序员,那么他们的技术将非常的棒 1 Python是一门跨平台的语言,是一种面向对象的动态编程语言 发布时 ...
- Java匹马行天下之学编程的起点——高级语言大锅烩
学编程的起点——高级语言大锅烩 前言: 学知识前总想说点鸡汤,想喝的朋友就看看,不想喝的就直接看干货吧,就当鸡汤是给我自己喝的. 前段时间在网上看了一句话感觉挺触动我的,我做个分享: 如果你觉得你的祖 ...
- IEEE发布2016年度编程语言排行榜
C 语言占据榜首,但大数据类是最大赢家. IEEE Spectrum 的第三次"最受欢迎编程语言"交互式排行榜新鲜出炉.因为不可能顾及到每一个程序员的想法,Spectrum 使用多 ...
- IEEE发布2017年编程语言排行榜:Python高居首位
https://news.cnblogs.com/n/574248 编者按:本文由微信公众号“机器之心”(ID:almosthuman2014)编译,机器之心专注生产 AI 领域专业性内容.本文作者: ...
- IEEE发布2017年编程语言排行榜:Python高居首位,java第三,php第八
2017年7月18日,IEEE Spectrum 发布了第四届顶级编程语言交互排行榜.因为有各种不同语言的排行,所以 IEEE Spectrum 依据不同的变量对流行度进行了排行.据 IEEE Spe ...
- julia,集Python、C++、R为一体!Julia 1.0重磅发布, MIT发布史上最强科学计算编程语言?创始人独家解答11个问题
这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 C 语言的速度.Ruby 的灵活.Python 的通用性前所未有地结合在一起,支持并行处理,易于学习和使用,尤其适合科学和工程 ...
- Rust v1.39发布 - 这个编程语言真不一般!
https://zhuanlan.zhihu.com/p/90612241 今天(2019-11-07)Rust终于发布了期待已久的v1.39版本,增加了重量级的async/await关键字支持.Ru ...
- 少儿编程崛起?2020年4月编程语言排名发布——Java,C,Python分列前三,Scratch挤进前20
前三并没有什么悬念,依然是Java,C,Python.C与Java的差距正在缩小,不过我们不用担心,在大数据分析领域Java,Python依然都是不可或缺的. 基于图形的基于块的编程语言Scratch ...
随机推荐
- tikz 常用命令总结
使用斜线填充区域,并绘制边界 \fill[pattern color=red, pattern=north west lines, opacity=0.4] (0,0) -- (0,1) -- (1, ...
- Mybatis 多对多(易百教程)
mybatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作.因此在进行实体类多对多映射表 ...
- 看demo1
http://pytorch-cn.readthedocs.io/zh/latest/package_references/torch/ pytorch文档 1.json JSON(JavaScrip ...
- python版飞机大战代码简易版
# -*- coding:utf-8 -*- import pygame import sys from pygame.locals import * from pygame.font import ...
- centos7下图形界面和命令行界面切换
在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 ...
- Using TFRecords and tf.Example
-----这篇其实是TensorFlow的官方tutorials,由于没有翻译,笔者姑且翻译一下,用来日后思考.------- 原址:https://www.tensorflow.org/tutori ...
- ENS使用指南系列之一 [ 注册 .eth 域名详细教程 ]
ENS 域名系统中目前支持三种顶级域名,分别是 .eth .xyz .luxe.其中, .eth 是 ENS 系统的原生域名,是由一系列智能合约控制的去中心化的域名,另外两种是从互联网域名中接入的,要 ...
- Date、Time类型拼接成字符串
Date.Time类型拼接成字符串 语言用的是kotlin,和Java类似 var time = "" val sdf1 = SimpleDateFormat("yyyy ...
- spring boot集成jsp
我们在使用spring boot进行web项目开发的时候,可能会选择页面用jsp.spring boot默认使用的html的,现在我们来看下如何集成jsp页面进行开发. 1.pom.xml文件引入所需 ...
- 【tf.keras】AdamW: Adam with Weight decay
论文 Decoupled Weight Decay Regularization 中提到,Adam 在使用时,L2 与 weight decay 并不等价,并提出了 AdamW,在神经网络需要正则项时 ...