早时候想学写解释器, 因为学一门语言适应别人的习惯其实很难, 不如自己做一遍
马上就会发现这很难, 于是很多时光的烦恼和消磨, 偶然有所得, 努力记录在这里
细节的内容我会在Github上写更多的细节, 这里主要是已经实现的部分的文档记录
希望我之前的努力能带给别人方便, 更主要希望能减轻自己的困境
代码看cirru-editor和cirru-eval两个部分, 代码借助SeaJS组织和拼接到一起
虽然说解释器, 主体还是对于 JS 各种数据类似的封装, 会 JS 的话直接开始看例子吧
如果感兴趣, 可以下载编辑器模块代码, 参考例子搭建. 这里讲界面用法
方向键和几个ctrl+的复制粘贴快捷键我模拟了一下, 另外ctrl+m用来输入中文
点击一块变成蓝色之后, 按下字母数字就能看到反应, 而回车键用来创建嵌套
嵌套是 Cirru 的核心. 方向键和翻页键虽然不够强大, 但还是会频繁被用到
编辑了代码之后, 点击对应红色查看运行结果. 只能算个例子吧, 很多情况会出错的
输出的结果是global作用域当中的内容, 另外就是一数字形式输出的print
Cirru 不用符号来区别不同的数据类型, 需要用单词声明其对应 JS 的类型
对于变量没有等号语法, 相对于 Scheme 这个还是好理解的, 这样再来运算
注意变量名可以是任何字符, 空格通过制表符来进行实现, 另外空字符串比较难对付
可能类似Flow语言. 我用对象的__proto__去把作用域实现出来了, 也许有些古怪
作用域作为数据结构的本身的意义就像 JS 函数能作为类型构造器参与实现新的数据形态
另外我的想法是编程语言自身也应该是能被自己作为数据操作的才对, 比如作用域
参考基于原型的语言中 JSON 和函数作用域的绑定的关系, 我认为这未来能发挥作用
代码中under和inside的区别在于前者创建了作用域, 而后者直接覆写了对象的键
函数是语言必备的, 语法上可行, 我大概进行了测试. 注意隐式的return
能力原因, 列表的头部还只能是字符串, 不然下面最后一个例子里连写函数了
另外 JS 关系, 函数并不能在右侧输出结果的global里显示出来, 所以{}是空的
函数的意思是作用域保存为闭包, 下次调用时可以引用到闭包里的数据
我好奇另一种, 比如函数局部作用域是继承在执行环境中的数据, 动态词法域?
我代码里的处理依然是创建了作用域, 但__proto__是指向执行环境的这个对象的
通过__proto__实现的作用域修改上层作用域比较麻烦, 于是设置了expose函数
另外, 通过self函数可以取出当前函数的作用域, 取出来就是 JSON 了
尝试做了一下判断, 比较简单, 那么尝试写一下递归好了
另外和if搭配在一起用的有do, 否则执行多个语句就显得很不实际了
语法比较死板, 还需要前面的函数可用的情况下才能显示. 分开两个函数
这个大概要涉及代码生成代码了. 我只是尝试做出来两个例子, 验证是否可行
data函数将代码读取成数据, 通过read可以重新作为代码执行
而在mess函数中, 嵌入的~not~macro将会被解析为代码, 其余则解析为函数
mess返回的结果通过eval可以执行, 原本我想用read统一的, 结果可以说是能力不够吧
简单说就是没计划.. 我的目标是展示摆脱符号语法的可能性, 现在明显那是可行的
其中出现了一些有趣的特性, 可以要成为实用的语言, 还不知道要走多少路
如果有人愿意接着这个想法继续往前推进, 尽管不科学, 但那的确是我所期待的
单独的例子将会放到gh-pages上, 建议用 Chrome 访问, 因为兼容性比较难处理
发现 bug 可到Issue里反馈, 虽然说我的能力未必能全修好, 总可以试试