Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

InScript 升级 #16

Open
duangsuse opened this issue Aug 11, 2018 · 1 comment
Open

InScript 升级 #16

duangsuse opened this issue Aug 11, 2018 · 1 comment
Assignees
Labels
android Android issue discussion talk with duangsuse enhancement New feature or request semantic Lite semantic syntax Lite syntax

Comments

@duangsuse
Copy link
Collaborator

首先说 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 表达式,其实我提过不过没写
@duangsuse duangsuse added enhancement New feature or request syntax Lite syntax android Android issue semantic Lite semantic discussion talk with duangsuse labels Aug 11, 2018
@duangsuse duangsuse self-assigned this Aug 11, 2018
@duangsuse
Copy link
Collaborator Author

see

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
android Android issue discussion talk with duangsuse enhancement New feature or request semantic Lite semantic syntax Lite syntax
Projects
None yet
Development

No branches or pull requests

1 participant