duangsuse::Echo
709 subscribers
4.23K photos
127 videos
583 files
6.43K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
相信我,这玩意拿来做预览也不错…… 不过还是要尝试下兼容 GTK 什么的,动态类型脏就脏了,反正只要开发者注意好 框架做基本支持 动态类型也没关系,何况还有 codegen 可以用呢。
codegen 已经完成了,还算顺利(并不)
为此我花了昨天下午到今天下午的所有时间,而且昨天熬夜到12点(第三天了)

使用的原理很简单,就是 value-variable substitution , 我利用 Python 的动态特性创建了 call, callNew, invoke 等方法,实现这些函数的语义并且在请求代码生成,就实现了复用
但就在刚刚遇到了一个怪事使我以为 Python 有 bug (看起来一个方法调用没成功执行,事后发现是头部的 if not: return 时序没注意到以及用print调试时看走眼了)

不过这件事也使我找到了 id_map/id_set (object id mapping) 的正确写法不是先 try: except TypeError: return _id.get(key) 而是把 key 直接映射到 id ,所以磨叽了一个半小时后,完成。
下一步可能是收尾这个特性(还要考虑拿它来自动为GTK/Wx忽略第一个 parent 参数,虽然我也不想这么干emmm) 然后发布
老实说(无需重复代码逻辑但可以同时实现codegen的)实现方法虽然对我来说比较新,但总感觉也就这样…… 只有 _names/_exprs/_autoNamed 三个变量, 不是很复杂 ,不过我也算是知道为什么解释器里有 "call-by-name" 这个名词了,因为我开始也把 _names和_exprs 混在一起放,我相信设计好时序那样也能用,不过这也太过分了,昨天晚上也想了半天才明白该怎么写。哈哈。
This media is not supported in your browser
VIEW IN TELEGRAM
这么一看我就是太弱智了才在codegen支持上花这么多时间,明明是一个毫无难度的东西,竟然浪费了我那么多看片的时间,罪过罪过…… 欲哭无泪

这个算法的名字就是 value-name substitution ,我一开始就明白,却想了半天才得出结论

对了,生成的代码貌似是按后序遍历排序的,尽管这个是基于副作用build str
呃……看起来应该还能用 (patchy 吧) 我有点不想写 GTK 支持了
#Python 真是无法保证这样复杂的时序写对…… 在有了Kotlin以后我不会在区间开闭上出错 但时序变量更新还真不能保证。(据说bug还是因为我顺手简化"无用赋值"导致的) 我不想写下去了,花了好大精力还熬了三天夜……刚刚有点好转
This media is not supported in your browser
VIEW IN TELEGRAM
总感觉可以优化,总感觉看着让人觉得要删掉,可按顺序看看倒也没什么,可是关键在于把它删掉看着也没什么…… 直觉要好啊

注:是指 expr = get() ; if (expr == null) { expr = get1(); if (expr != null) bla() } 这种看起来怎么这么相似的
This media is not supported in your browser
VIEW IN TELEGRAM
第一个从生成的代码创建出的Tk frame
This media is not supported in your browser
VIEW IN TELEGRAM
太赞了!我居然做出了这种框架…… 等等,这样又如何呢emm
我准备发布了,发布后就会死掉。 不过对我来说这个无所谓(
加了一些东西(command 参数的 self 的编号, dict.findKey) 又因为实现不了而删了,心里不开心,现在放假了。
草这样不至于吧, Python 里 [for] {for} 都是对应数据的 genexpr ,没想到 () 居然不是 tuple 的 genexpr ……
类似表达式的后序遍历果然不行,需要的变量定义顺序很不对啊(而且这里好像不支持属性访问语法一样)...
看来只能用很脏的全局变量了…… 反正组件树是后序遍历的,那它依赖 但要调用创建它 所以必须提前的东西 就只能用全局变量了…… 不知道会不会有数据竞争之类的问题(但如果有说明应用的代码太飘了……)

有了这个以后,不知道 Codegen 的 autoExpr 该不该留,我想如果出于一些非常迷的目的(比如说 简写法),删代码真和割肉一样斟酌。。。
啊这个bug真的太艹了...
This media is not supported in your browser
VIEW IN TELEGRAM
不想写了,反正别的我是不写了。写完就放假
...服了,用这样脏的修改也会有这样的结果……
做到七点半,就不修了睡大觉。 这个问题是蛮特殊的,在构造器调用里出现,恰巧我没有为赋值的情况考虑。 何况 codegen 本来就是为视图树的后序遍历情况考虑的,根本没想某些构造器还有创建窗口副作用…… 不过我突然想到一个 workaround 估计还可以