哇原来我之前在 #Haskell 里看到的就是这种…… 这个大佬很厉害
https://teek.readthedocs.io/en/latest/_modules/teek/_tcl_calls.html#init_threads
#Python
*注:Haskell里\a b = lambda a,b: ,而且它的xs::(List a)是纯流式的
Python的slice with step
https://teek.readthedocs.io/en/latest/_modules/teek/_tcl_calls.html#init_threads
def _pairs(sequence):
assert len(sequence) % 2 == 0, "cannot divide %r into pairs" % (sequence,)
return zip(sequence[0::2], sequence[1::2]) #Python
_pairs xs = zipWith (\a b -> (a, b) ) xs (drop 1 xs) *注:Haskell里\a b = lambda a,b: ,而且它的xs::(List a)是纯流式的
Python的slice with step
xs[start:stop:step] 这样写了,默认可以省略的 ( [0:len(self):1] )
duangsuse::Echo
哇原来我之前在 #Haskell 里看到的就是这种…… 这个大佬很厉害 https://teek.readthedocs.io/en/latest/_modules/teek/_tcl_calls.html#init_threads def _pairs(sequence): assert len(sequence) % 2 == 0, "cannot divide %r into pairs" % (sequence,) return zip(sequence[0::2], sequence[1::2])…
之前一直不知道 event loop 长什么样,不知道多线程和单线程怎么结合,现在稍微了解一些了
这个 Teek 是 Python Tkinter 的一个重写,支持了异步组件更新
这个 Teek 是 Python Tkinter 的一个重写,支持了异步组件更新
真是服了 #Python 了…… 开始见到越来越多不常见的语法能用的了
才知道为什么能有
之前不知道 nonlocal 与 global 有啥区别,然后觉得 assert condition message 应该用 :而不是, 切分
上面的 [] slice 省略 end 后一个
今天又有
才知道为什么能有
@property 这种东西,原来 obj.x 其实是 type(obj).x(obj) 的意思,而 Python 的 obj.op() 其实是 Kotlin 里 (obj::op)() 的意思,默认bound,草之前不知道 nonlocal 与 global 有啥区别,然后觉得 assert condition message 应该用 :而不是, 切分
上面的 [] slice 省略 end 后一个
[a::step] 瞬间感觉让人高大上,其实这应该还真能做成DSL语法,因为 Python 是动态类型…… 混乱今天又有
Exception.with_traceback 和 raise exc from None
而且 functools.wraps(op) 加起来到底有没有意义呢…… emmm不过在看过 pygame, tkinter, teek 里的 message loop 后我也终于理解 Android 里 os.Looper 和 Handler::post 的语义了…… 这么说 Handler 应该也有一个 pre(before) 方法, post 是 after 嘛 😂
pygame 和 tkinter 里的设计都蛮像的,不过前者不提供 .mainloop() 而是用
(话说 Python 里的
而且也明白为什么之前有时候不在 Main thread 更改控件树也没抛异常,而onClick阻塞会卡死主线程,就像
其实就 #GUI 而言,我更喜欢 DOM 风格或 GTK# .NET 风格一些(C# 的 event 可以用 operator overloading
恰巧这次我要弄的一个小 GUI 只是个小工具…… 我很奇怪为什么要为弄一个小工具废很大的精力去手建视图树,不过在 TkGUI 里我只用了 pack 布局管理器(算法) 没支持 grid 和 posit
Tk 其实不是很好看,不过我的编程概念就是定义式——只写它是什么,不写怎么实现 ,所以代码基本上都会分为抽象层和stub 层 桥桩层,所以 TkGUI 要是能再走一步,我会让它采用类似 Qt 的 Font/Pen/Palette 风格抽象,当然一切都是抽象的,所以我猜它可以移植到 wxPython, JPython(awt/swing), PyGTK, PyQT 什么的,不止是 tkinter。
Qt5其实也有这个东西…… 就是 Qt 的 QML Quick prototype (对别人来说是原型,对我可能就是成品了,当然我开坑的频率更高),不过那个东西的功能更少使用更复杂…… 但不得不承认无论是作为跨平台框架还是 GUI , Qt 都是最成功的一个。
想着啥时候可以再去了解下 SQL, ORM, Vert.x 的 HTTP 什么的…… 不就是所谓的全栈了么2333
马上要给 TkGUI 加的特性是我从 Teek 移植过来的支持在多线程更新控件树。 Python 标准库的 tkinter 的 bind 实现不是线程安全的, Teek 很厉害,在它的
不过我不打算按照它的方法加这个特性,因为我目前只有做 tkinter wrapper 的精力,我不想动它的隐藏 API ,而且这个要替换 TclInterpreter 实现的重构要从AOP(面向侧面编程)角度修改所有 tkinter.Widget 的行为…… 有时候是构造器参数,但往往是私有属性和私有类,或者全局变量什么的,实在不想研究它的代码。
Qt 的 connect mode 起发了我,其实可以给发起异步动作的 button 什么的单独弄个
pygame 和 tkinter 里的设计都蛮像的,不过前者不提供 .mainloop() 而是用
pygame.events.get_events() 要手动 while True: ,不过 tkinter 里用 tk.after(msec, handler) 注册 event queue poller 也是差不多,如果看 Elm-lang.org 的"四大项目" state/view/message/update ,就会发现它也隐含了一个 message queue(话说 Python 里的
queue.poll 会用抛出 queue.Empty 表示结尾,我觉得这种方法更好,也是我少数赞同的几个 "Pythonic"... 应该说要能取其精华)而且也明白为什么之前有时候不在 Main thread 更改控件树也没抛异常,而onClick阻塞会卡死主线程,就像
ConcurrentModificationException 一样,不一定是每次都会抛出的,有时候只是运气不好碰巧没有挂掉而已。薛定谔程序。其实就 #GUI 而言,我更喜欢 DOM 风格或 GTK# .NET 风格一些(C# 的 event 可以用 operator overloading
+= (ev) => {} 也很好看啊),不那么偏向设计模式所以视图组件树显得很简洁,只需要在 <div> 里 appendChild 或者用 map 函数,也没有 ListView 要加 adapter 来建单项视图什么的,不需要 Model/View 也不必用它的 item delegate 去创建 editor ,简单来说就是因为功能受限,只能开发些常见的小工具啦…… 可是我还是更喜欢 DOM 风格一些恰巧这次我要弄的一个小 GUI 只是个小工具…… 我很奇怪为什么要为弄一个小工具废很大的精力去手建视图树,不过在 TkGUI 里我只用了 pack 布局管理器(算法) 没支持 grid 和 posit
Tk 其实不是很好看,不过我的编程概念就是定义式——只写它是什么,不写怎么实现 ,所以代码基本上都会分为抽象层和
Qt5其实也有这个东西…… 就是 Qt 的 QML Quick prototype (对别人来说是原型,对我可能就是成品了,当然我开坑的频率更高),不过那个东西的功能更少使用更复杂…… 但不得不承认无论是作为跨平台框架还是 GUI , Qt 都是最成功的一个。
想着啥时候可以再去了解下 SQL, ORM, Vert.x 的 HTTP 什么的…… 不就是所谓的全栈了么2333
马上要给 TkGUI 加的特性是我从 Teek 移植过来的支持在多线程更新控件树。 Python 标准库的 tkinter 的 bind 实现不是线程安全的, Teek 很厉害,在它的
_TclInterpreter.init_threads 后会注册好一个 1000ms/20times (=50ms) 的 event loop after-callback 来处理一大堆诸如 call, getstring, eval 的线程安全调用(很像 Qt::connect 里的 Auto/Serial/Queue 参数,不过这个是全局的,整个 Tk 都线程安全,可从任意线程更新控件)不过我不打算按照它的方法加这个特性,因为我目前只有做 tkinter wrapper 的精力,我不想动它的隐藏 API ,而且这个要替换 TclInterpreter 实现的重构要从AOP(面向侧面编程)角度修改所有 tkinter.Widget 的行为…… 有时候是构造器参数,但往往是私有属性和私有类,或者全局变量什么的,实在不想研究它的代码。
Qt 的 connect mode 起发了我,其实可以给发起异步动作的 button 什么的单独弄个
asyncBind …… 不必在全局支持 threading ,只需要 bind callback 是在主线程顺序执行就可以了GitHub
Akuli/teek
Simpler alternative to tkinter. Contribute to Akuli/teek development by creating an account on GitHub.
https://mivik.gitee.io/2020/08/29/kamet-basic-implementation/ #Rust #Kotlin #PLT #CS #ce 草,太大佬了这个
最后还是支持了 traits ,是 Rust 式的 fat pointer 实现,当然也有 struct 和 new 了
(特殊类型
(而C++式的 virtual table 实现是添加虚表指针成员,那样开销更大,当然 vtable/fatptr 的选择也是看创建对象多还是指针引用多啦,显然是创建对象更多)
目前支持 extern,no_mangle,packed,inline 四个 attribute, inline可以是always或never(符合LLVM IR里的版本)
最后还是支持了 traits ,是 Rust 式的 fat pointer 实现,当然也有 struct 和 new 了
(特殊类型
&dyn [TraitName] 会存储两个指针,一个指向实现该 Trait 的相应的函数表,另一个存储指向该对象的指针)(当然这需要 constant method ordering)(而C++式的 virtual table 实现是添加虚表指针成员,那样开销更大,当然 vtable/fatptr 的选择也是看创建对象多还是指针引用多啦,显然是创建对象更多)
目前支持 extern,no_mangle,packed,inline 四个 attribute, inline可以是always或never(符合LLVM IR里的版本)
DimensionX
kamet | 基于 LLVM 的编程语言的实现
摘要本文阐述了一门基于 LLVM 的编程语言的实现过程,分析并解决了多个实现难点,基于实际问题在现有的知识上进行拓展并得出更好的解决方案和理论知识,进而对编译原理获得更加深入的认识。
Forwarded from dnaugsuz
let 这个关键字还是替换掉吧 🤔
这个关键字大概只代表有名字的 IR Value,总感觉在 val/var 之外还有 let 有点奇怪,而且也会对学过 Kotlin/Rust/Swift 的人引入混乱
既然不可变,val ref = val 然后 val = let 应该会好些,或者干脆作为一个基于变量类型的优化 ?
这个关键字大概只代表有名字的 IR Value,总感觉在 val/var 之外还有 let 有点奇怪,而且也会对学过 Kotlin/Rust/Swift 的人引入混乱
既然不可变,val ref = val 然后 val = let 应该会好些,或者干脆作为一个基于变量类型的优化 ?
Forwarded from dnaugsuz
LLVM 的 Aggregate Type 是 constant 的意思啊…… 刚才以为是 Product Type 的同义词,看来既然 LLVM 的 array 是不可变的,用 unnamed tuple 实现语言里的数组是正经
Forwarded from dnaugsuz
2333 ,有没有实现能这种类型推导的说
fun <T> extract(box: Box<T>): T = box.item
val item: T = extract(Box(1))Forwarded from dnaugsuz
啊(老实说这种情况虽然常见,我自己也不知道怎么实现
我不会 unification
不过你这篇文章开头看起来相当有派头, dot 图我到现在也没画过几张,更不知道 AC 自动机和 DFA 压缩算法…… 啥时候去了解下 😂
这两天在写一个GUI小应用,太普通了哈
如果从可读性的角度看,语法分析节可以进行简单的归类和重要性排序,而且 Identifier 也可以改叫 Name,概念上的小建议。
我不会 unification
不过你这篇文章开头看起来相当有派头, dot 图我到现在也没画过几张,更不知道 AC 自动机和 DFA 压缩算法…… 啥时候去了解下 😂
这两天在写一个GUI小应用,太普通了哈
如果从可读性的角度看,语法分析节可以进行简单的归类和重要性排序,而且 Identifier 也可以改叫 Name,概念上的小建议。
duangsuse::Echo
https://mivik.gitee.io/2020/08/29/kamet-basic-implementation/ #Rust #Kotlin #PLT #CS #ce 草,太大佬了这个 最后还是支持了 traits ,是 Rust 式的 fat pointer 实现,当然也有 struct 和 new 了 (特殊类型 &dyn [TraitName] 会存储两个指针,一个指向实现该 Trait 的相应的函数表,另一个存储指向该对象的指针)(当然这需要 constant method ordering)…
喜闻 Mivik/kamet 编译器发布第一版,这个项目教会了我关于 Kotlin 里 receiver 和 first arg 的互换使用(难以想象草),居然可以这么写:
因为这比较不常见, Mivik 起的名字是
而且,最重要的是虽然它没实现等式双边类型推导(好吧,PLT/Type Theory大佬才不会说这种“基础入门”的知识,据说 Kotlin 不是 unification 而是 typing rule..?)
但它实现了多态(类似子类型的东西,上面的 codegen 无需显式判断 receiver 类型即属多态),而且用 LLVM 实现了一门完整的编程语言,这对我来说很重要(以后要用到的)
同时也教我了一个关于 LLVM 的新(比 LLVM Cookbook)信息: phi 指令已经不推荐使用,新编译器的 Context 基本都要维护当前函数引用然后支持在其 entry block 插入 alloca 指令的 allocateLocal 方法 (尽管有 phi node 这一类的控制流 API,LLVM 官方仍然推荐使用 mem2reg 来实现变量。具体来说,我们只需把所有的变量申明为栈空间,随后 LLVM 再专门进行栈空间转寄存器的优化)
同时 Mivik 这次的代码也是所有同类项目中质量最好的一个,非常适合入门者阅读(如果还觉得难可以看看我之前重写的 kamet-dse,少了很多class/fun定义,我估计开学后还会维护下去)
(相信我,对能独立设计从词法-语法分析到LLVM编译器的水平而言这腔调和复杂度是很温柔了,比它难看10倍傲娇4倍的项目我见过很多)
interface ASTNode { fun codegen(ctx: Context) }
class NameRefNode {
fun Context.codegen() = ...
} 因为这比较不常见, Mivik 起的名字是
ASTNode.codegenForThis 然后在 context 加了一个 ASTNode.codegen = this@Context.codegenForThis() 了而且,最重要的是虽然它没实现等式双边类型推导(好吧,PLT/Type Theory大佬才不会说这种“基础入门”的知识,据说 Kotlin 不是 unification 而是 typing rule..?)
但它实现了多态(类似子类型的东西,上面的 codegen 无需显式判断 receiver 类型即属多态),而且用 LLVM 实现了一门完整的编程语言,这对我来说很重要(以后要用到的)
同时也教我了一个关于 LLVM 的新(比 LLVM Cookbook)信息: phi 指令已经不推荐使用,新编译器的 Context 基本都要维护当前函数引用然后支持在其 entry block 插入 alloca 指令的 allocateLocal 方法 (尽管有 phi node 这一类的控制流 API,LLVM 官方仍然推荐使用 mem2reg 来实现变量。具体来说,我们只需把所有的变量申明为栈空间,随后 LLVM 再专门进行栈空间转寄存器的优化)
同时 Mivik 这次的代码也是所有同类项目中质量最好的一个,非常适合入门者阅读(如果还觉得难可以看看我之前重写的 kamet-dse,少了很多class/fun定义,我估计开学后还会维护下去)
(相信我,对能独立设计从词法-语法分析到LLVM编译器的水平而言这腔调和复杂度是很温柔了,比它难看10倍傲娇4倍的项目我见过很多)
GitHub
GitHub - Mivik/kamet: kamet - a simple programming language written in Kotlin.
kamet - a simple programming language written in Kotlin. - Mivik/kamet
duangsuse::Echo
喜闻 Mivik/kamet 编译器发布第一版,这个项目教会了我关于 Kotlin 里 receiver 和 first arg 的互换使用(难以想象草),居然可以这么写: interface ASTNode { fun codegen(ctx: Context) } class NameRefNode { fun Context.codegen() = ... } 因为这比较不常见, Mivik 起的名字是 ASTNode.codegenForThis 然后在 context 加了一个 ASTNode.codegen…
反正绝对是比 LLVM Cookbook 那本书的示例好…… C++ 代码再加上随便乱画的命名风格,即便教你怎么写 adce(bfs)/vectorize IR 优化、怎么实现 LLVM 机器码后端又怎么样,那个代码我真的不想看第二遍,虽然它教会了我怎么写运算符优先级解析。
duangsuse::Echo
喜闻 Mivik/kamet 编译器发布第一版,这个项目教会了我关于 Kotlin 里 receiver 和 first arg 的互换使用(难以想象草),居然可以这么写: interface ASTNode { fun codegen(ctx: Context) } class NameRefNode { fun Context.codegen() = ... } 因为这比较不常见, Mivik 起的名字是 ASTNode.codegenForThis 然后在 context 加了一个 ASTNode.codegen…
不过说起来,不管怎么样这也是我接触过过编译原理领域的大佬里最亲和的一个了,有不少或工程或学术系的大佬,你根本无法跟他们平等交流,因为他们总是喜欢用几个名词或者一篇80页的大部头论文打发你。
duangsuse::Echo
顺便提一句,我想要的框架是这样的,只需要覆盖 layout/setup 方法,然后直接 run(title) 就可以了(当然,控件和窗口属性也可以后期修改)
也不完全是这样的,因为 Python 的 implicit name resolution 是不可能的(它不像 Ruby 可以有 implicit receiver)
“要么然用 global,要么然是方法参数或局部变量”,可是 Python 里偏偏没有 override ,所以连 keyword argument 也不能用于提供不带
所以失败了无数次后我最终选择了 underscore.js / lodash.js 里的方法,看起来还能接受。
关于 Tk 和 Toplevel 的区别我没取消(感觉 MainWindow 什么的区别还是要有的),有一个 BaseTkGUI 拥有 TkGUI/TkWin 两个子类。
“要么然用 global,要么然是方法参数或局部变量”,可是 Python 里偏偏没有 override ,所以连 keyword argument 也不能用于提供不带
self. 的控件定义方法所以失败了无数次后我最终选择了 underscore.js / lodash.js 里的方法,看起来还能接受。
关于 Tk 和 Toplevel 的区别我没取消(感觉 MainWindow 什么的区别还是要有的),有一个 BaseTkGUI 拥有 TkGUI/TkWin 两个子类。
duangsuse::Echo
也不完全是这样的,因为 Python 的 implicit name resolution 是不可能的(它不像 Ruby 可以有 implicit receiver) “要么然用 global,要么然是方法参数或局部变量”,可是 Python 里偏偏没有 override ,所以连 keyword argument 也不能用于提供不带 self. 的控件定义方法 所以失败了无数次后我最终选择了 underscore.js / lodash.js 里的方法,看起来还能接受。 关于 Tk 和 Toplevel…
🤔或许也可以用 Python module 然后
from tkgui.widgets import * ,不过那样 IDE 补全就又不行了…… 我设想里是无需任何 import 的,但是现在 TkGUI 里一大堆成员都 @staticmethod ,冗余代码太长。
duangsuse::Echo
不过在看过 pygame, tkinter, teek 里的 message loop 后我也终于理解 Android 里 os.Looper 和 Handler::post 的语义了…… 这么说 Handler 应该也有一个 pre(before) 方法, post 是 after 嘛 😂 pygame 和 tkinter 里的设计都蛮像的,不过前者不提供 .mainloop() 而是用 pygame.events.get_events() 要手动 while True: ,不过 tkinter 里用 tk.after(msec…
之前重写了一半但是部分有用的代码:
https://gist.github.com/duangsuse/6b9160c9a5ac7706e6165885fc07238d
https://gist.github.com/duangsuse/6b9160c9a5ac7706e6165885fc07238d
Gist
Teek command.py / structure.py rewrite (partially)
Teek command.py / structure.py rewrite (partially) - tkthr_update.py