如梦令编程语言是在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差

相关链接

github

D语言版本实现分析

如梦令编程语言发布 (RML)的更多相关文章

  1. iOS10 资料汇总:值得回看的 10 篇 iOS 热文

    本文精选了 iOS大全 9月份的10篇热门文章.其中有软件推荐.技术分享及iOS10.Xcode8新特性等. 注:以下文章,点击标题即可阅读 <兼容iOS 10 资料整理笔记> 本文整理i ...

  2. Python基础 1----Python语言基础和Python环境准备与安装

    引导语: 人们学习Python是因为他们爱这门语言,因为他们追寻美,如果我雇用一个Python程序员,那么他们的技术将非常的棒 1 Python是一门跨平台的语言,是一种面向对象的动态编程语言 发布时 ...

  3. Java匹马行天下之学编程的起点——高级语言大锅烩

    学编程的起点——高级语言大锅烩 前言: 学知识前总想说点鸡汤,想喝的朋友就看看,不想喝的就直接看干货吧,就当鸡汤是给我自己喝的. 前段时间在网上看了一句话感觉挺触动我的,我做个分享: 如果你觉得你的祖 ...

  4. IEEE发布2016年度编程语言排行榜

    C 语言占据榜首,但大数据类是最大赢家. IEEE Spectrum 的第三次"最受欢迎编程语言"交互式排行榜新鲜出炉.因为不可能顾及到每一个程序员的想法,Spectrum 使用多 ...

  5. IEEE发布2017年编程语言排行榜:Python高居首位

    https://news.cnblogs.com/n/574248 编者按:本文由微信公众号“机器之心”(ID:almosthuman2014)编译,机器之心专注生产 AI 领域专业性内容.本文作者: ...

  6. IEEE发布2017年编程语言排行榜:Python高居首位,java第三,php第八

    2017年7月18日,IEEE Spectrum 发布了第四届顶级编程语言交互排行榜.因为有各种不同语言的排行,所以 IEEE Spectrum 依据不同的变量对流行度进行了排行.据 IEEE Spe ...

  7. julia,集Python、C++、R为一体!Julia 1.0重磅发布, MIT发布史上最强科学计算编程语言?创始人独家解答11个问题

    这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 C 语言的速度.Ruby 的灵活.Python 的通用性前所未有地结合在一起,支持并行处理,易于学习和使用,尤其适合科学和工程 ...

  8. Rust v1.39发布 - 这个编程语言真不一般!

    https://zhuanlan.zhihu.com/p/90612241 今天(2019-11-07)Rust终于发布了期待已久的v1.39版本,增加了重量级的async/await关键字支持.Ru ...

  9. 少儿编程崛起?2020年4月编程语言排名发布——Java,C,Python分列前三,Scratch挤进前20

    前三并没有什么悬念,依然是Java,C,Python.C与Java的差距正在缩小,不过我们不用担心,在大数据分析领域Java,Python依然都是不可或缺的. 基于图形的基于块的编程语言Scratch ...

随机推荐

  1. POJ 1166 The Clocks [BFS] [位运算]

    1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...

  2. 如何使用IoTSharp对接ModBus?

    提到对接ModBus 那么或许大家最熟悉的可能是 HslCommunication 和SharpSCADA 了,是GitHub 上关注最多的此类开源项目,  因此IoTSharp将通过HSL组件进行数 ...

  3. 关于在vuejs中动态加载不确定数量和内容的组件的解决方案

    在做一个门户项目的时候,客户要求需要进行私人化定制,每个人进入首页的时候可以自定义首页显示的版块 要在4.50个组件中显示随机N个组件按照每个人选定的顺序排列.需求说完了,接下来说说解决方案: htm ...

  4. starUml破解

    在安装目录的:StarUML\www\license\node 找到LicenseManagerDomain.js 在 try 前面加上: return { name:"0xcb" ...

  5. 20191017-8 alpha week 2/2 Scrum立会报告+燃尽图 07

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9804 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐 ...

  6. 语言篇:Java环境

    语言篇:Java环境 Java是什么? Java 是一项用于开发应用程序的技术语言,可以让 Web 变得更有意思和更实用.使用 Java 可以玩游戏.上载照片.联机聊天以及参与虚拟体验,并能够使用联机 ...

  7. 纯css 实现大白

    首先是用html 语言来搭建框架 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. HDU5521 Meeting 题解 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意: 有 \(n\) 个点 \(m\) 个集合,一个点可能处于若干个集合内,属于第 \(i ...

  9. 「CH2401」送礼物 解题报告

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  10. 图解 kubernetes scheduler 架构设计系列-初步了解

    资源调度基础 scheudler是kubernetes中的核心组件,负责为用户声明的pod资源选择合适的node,同时保证集群资源的最大化利用,这里先介绍下资源调度系统设计里面的一些基础概念 基础任务 ...