Replies: 2 comments
-
当前提供了一个可是试用的实现 #45 . |
Beta Was this translation helpful? Give feedback.
0 replies
-
又改了一片, 主要是替换了一些方法... #53 . 有个特殊的地方要说明, 调整了一下之前的实现, 使用的时候从原来的, ; "Old semantics"
def Num $ %{} %Num
:inc $ fn (x) $ :: Num (&+ x 1)
:show $ fn (x) $ str x 改成了, def Num $ %{} %Num
:inc $ fn (x)
update x 1 inc
:show $ fn (x)
str $ &tuple:nth x 1 其中传递的参数 相对应的, 这时候需要能够操作 tuple, 这里扩展了 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
#43 当中提供了一个简易的多态的模仿, 对已有代码没有修改.
不过这个结构不够通用, 打算进一步深化, 扩展到更多的场景, 以及更可靠的运行逻辑,
目前的思路:
CalcitTuple
类型, 代替 List 用于构造:: Num 1
这种数据, 记为:: Num 1
先用
::
这个符号表示 Tuple, 具体后续是否调整再看了..m x y z
识别为内部函数, 用内部实现执行.m
.这里涉及 js codegen 当中的对应语法需要适当兼容.
invoke
调用过程中自动加载内置 class,如果涉及到
CalcitTuple
本身, 就需要特殊处理.其中
:: Num 1
整体被叫做 "instance", 其中Num
叫做 "class", 强行参考 Haskell 了.对应的, 内部需要对常用的类型进行一下处理, 提供内置类型的 class.
对 Macro 的影响
由于当前的方案是作为
proc
处理的, 暂时对 macro 系统没什么影响.对 js codegen 的影响
主要是生成 js 需要改成动态的实现, 对性能有影响.
并且 js 实现, 类比 Rust runtime 中的内置 class, 也需要提供相应的 class.
为了已有的 js 实现, 可以考虑用
.!m x
来表示x.m()
这种调用具体实现和产生的影响
按照当前的实现, class 部分的变量定义检查相当于断开了.
比如
.m a
这个方法调用, 由于a
的类型未知, 也就无法判断.m
是否存在.这样之后大范围的方法调用都是动态的代码, 无法在编译的时候简单判断.
未来尝试下是否有办法做局部的追踪, 目前没办法.
目前运行到 method 再调用的函数的位置, 处理是非常动态的,
Rust runtime 中是借助 runner 文件解释器实现去调用,
而 js 部分靠的时候 mutable reference 从运行时注入, 实现显得有些脏.
所以有部分逻辑目前需要人工维护保证正确性了.
还没有在 Respo 等场景当中进行检测..
其他
这个修改还挺大的, 目测没有大问题. 另外 class 和 instance 实现可能存在的性能问题暂时先次要考虑.
Beta Was this translation helpful? Give feedback.
All reactions