Skip to content

InScript 升级 #16

Open
Open
@duangsuse

Description

@duangsuse

首先说 InScript(duangsuse 有习惯把本应该记录在笔记上的文字记录在这里

InScript 名来自与 Inspect 和 Script 两词,我想让 Lite 成为一个专门扩展其他语言的 AST 解释器,所以我觉得这个名字比较可以突出它的性质

InScript 开始计划开的坑有

  • Highlights 高亮配置们
  • Ideains IDEA 插件
  • Inside InScript 打算做一个 Android IDE 的
  • instd 因为解释器本身不携带类库... 准确的说是「扩展」类库,因为 InScript 虽然是 OO 的,但是不能创建类,一切依赖「方法覆盖」
  • inspec 类似 RSpec,必须的测试框架
  • ink 包管理器
  • instruct 类 Rake 构建系统,因为 InScript 非常依赖平台原生的类库,而脚本不能而且不需要编译(最多到 AST 格式而已)
  • indoc 一个内联文档的构建工具是必须的

解释器方面打算有 Kotlin 的、ES6 的、C# 的

如果有时间还打算出 Ruby 和 C 的版本,虽然更加没有意义(

另外 Lite 变成 InScript 自然是不会没有任何改变的,实际上改动很大很大

  • 允许为块指定「全局」环境

Lite 比较蹩脚,因为不像 Ruby,有些东西不是方法(全局 LiteBlock 对象)
所以拿这个弥补一下

  • 当前 self

整个解释器(一个线程一个解释器)应该有一个全局的 self,显然 self 应该是一个函数调用的本地参数...
Lite 目前是使用填充 self 符号再调用方法的,考虑将 self 作为真正的参数

  • 无括号调用

学习 Ruby,因为有时候没有参数还要括号很蠢

以前必须这样写

System.gc()

现在不需要括号

  • InterpreterOptions

解释器允许不同的解释模式,如使用 self 填充或本地变量,不支持 @ 处理器等等

  • forIndex

for i = 0 to i >= 100 do i++
puts(i)

  • TLS errno

线程安全的 Errno,但是我觉得没有必要,现在已经安全了(一个线程一个解释器上下文)

所以确认增加了更好的 StackTrace(增加脚本行号)和 saved exception,因为 InScript 不支持异常

  • Option & Result 值

类似与 Rust,因为我们没有异常系统,必须要有办法处理异常

Rust 拥有 Option 是为了不让所有引用类型都可能为空,Rust 为安全设计,而 Java 和 Kotlin 中引用完全可能是 null,InScript 支持没有意义

Result 方便处理错误,Lite 应该要有类似的东西,不过我觉得实现 Promise 即可替换掉 Result,所以解决方案变了。

using std.Promise

Promise.try(|>
a = File.read('a.txt'))
.catch(Exception, |>

.....

)

Promise 会在 errno 被设置时「捕捉」异常,因为 InScript 是完全的 AST 解释器,Promise.try 对于每一个可能设置 errno 的语句都能进行异常处理(修改块对象)

  • statement processor

就像 ES6 的 decorator 特性一样

using std.Httpd

def Processor_get(path)
Httpd.add_route(Httpd::Methods::GET, path, self)

@get('/')
def hello_world = "你好,世界!"

Httpd.run host: '127.0.0.1', port: 8080

  • String templating / interpolating

foo = gets
foo_bar = $foo ${Bar::FOO}

  • 箭头函数

fn = (a) => puts a

hello = |> puts 'Hello'

  • Hash 支持 [] 语法

a = 1
puts {
[a]: '2333333'
WWWwwwwW: a
}.to_s

  • InScript 的新模块化模式:scope、using、inscript.unload

require 'load_scope'

using LoadedScope # 导入作用域环境

using load_scope.LoadedScope

using load_scope/LoadedScope # 先 require 再载入

scope main # 默认作用域

puts foooo # 在本地作用域和作用域链上查找

inscript.unload :LoadedScope

  • Tail Call Optimization

InScript 支持尾调用优化,所以可以节省尾递归操作的时间

但是,这不是解释器自动实现的,我懒得做 CFA(控制流分析)

scope Algorithm

fibonacci = inscript.tco do |n, ac?, ac1?|
ac |= 1
ac1 |= 1
return ac2 if n <= 1
return fibonacci(n - 1, ac1, ac + ac1)

scope main
using Algorithm

fibonacci 2333

  • case 表达式,其实我提过不过没写

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions