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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
草,所以这个到底是什么鬼,花了我40分钟调试 因为不知道为什么结果不和我预期的一致,后来才发现是有个赋值…… 应该说这些赋值真是麻烦
This media is not supported in your browser
VIEW IN TELEGRAM
目前 codegen 已经完全 works 了,也修复了一些其它的小bug ,现在准备做 code cache 和跑分
https://github.com/Experimenter/py-gtk3-codegen/blob/master/py-gtk3-codegen.py #Python #GTK
这是一个 Python GObjects 的事件模板自动代码生成(它还支持嵌套,不过咱的 codegen 加个 _indent 变量然后用递归栈改写它就也实现嵌套了)
它只支持特定的 tags: ,用的当然是 [ for in if ] 生成式啦(啊好怀念Haskell里的写法
['GtkEntry','GtkTextView','GtkComboBox','GtkComboBoxEntry','GtkProgressBar',\
'GtkCheckbox','GtkRadioButton','GtkSpinButton','GtkCalendar','GtkToolBar',\
'GtkStatusbar','GtkFileChooserButton','GtkFontButton','GtkHScale','GtkVScale','GtkTreeView']]


input,text,comboBox,scrollBar+progressBar,checkBox,radioButton(理论应该只有radioButtonBox),spinBox,scale,treeView 和 askOpen/askSave 咱都是有的
calendar,ToolBar,StatusBar,fontButton 咱没有,毕竟 Tk 的控件系统现在已经不标准了(坏家伙)
话说 Python 的解析器感觉好难写啊,要处理的 layout 情况那么多... 要支持"\"消换行,括号还能带开启新缩进的 #ce
https://github.com/BlackHC/implicit_lambda 刚才,好像是第二次遇到类似的实现。

这个其实很简单嘛:
class ImplicitLambda:
def __init__(self, code): self.code = code
def wrap(self, code): return ImplicitLambda(code)
def _op(self, op, x): return self.wrap(self.code+op+repr(x))
def __add__(self, x): return self._op("+", x)
def __call__(self, value): return eval(self.code)(value)
_ = ImplicitLambda("lambda x: x")

list(map(_+1, [1,2,3])) #[2, 3, 4]

还是因为我不会用 Python 元编程(那需要理解它那和 JavaScript 一样混乱的面向对象模型,不像 Ruby define_method 和hooks那么简单),不然元方法可以立刻定义
当然如果用解释器模式一层一层剥开树形结构也可以做(但我觉得对这个 DSL 性能其实不重要

之前设计绝句编程语言的时候(别喷我和王垠一样谈自己没实现过的编程语言,它仅作为设计也是真正有价值的),我也考虑过添加类似 Haskell 的 sectioning: map (+1) [1,2,3] 这种:
建行(1、2、3)去映为「+1」 ,这被称为中缀链。可后来我把它换成 局限于中缀表达式/无参访问或中后缀算符引用的 block 了 ( 此行去映为「它+1」 ) ,不会像 Haskell 一样把隐式参数「它」省略掉,我超喜欢这种人类可读的设计的。哈哈。
duangsuse::Echo
目前 codegen 已经完全 works 了,也修复了一些其它的小bug ,现在准备做 code cache 和跑分
🤔 说起来, #Python 的开发者们也真是怪纯的,不喜欢用这些杂七杂八的小技巧。
我到 GitHub 搜 "Python codegen"&lang=python ,得到的七页结果没一个是生成 Python 代码的,要么是模板系统:
https://github.com/mattduan/codegen
https://github.com/AlexFinder/CodeGen
要么是特定的模板化代码生成器:
https://github.com/siggame/Creer

看起来好像大家并不知道 Python 的动态类型可以结合上代码生成,被用来替换语言内建的调用和成员访问语法(callNew,invoke,getAttr),从而在实现原有语义的同时做到生成代码以内联铺平内部式DSL,做到零开销抽象一样。

还有数个 Swagger REST API defs file 的生成实现…… 对了,其实我觉得 Swagger 也太纯真了,都没有受到函数式大佬们的污染,因为它"优化"后也只是支持 YAML 的缩进来"简写"深层嵌套结构而已。
我之前写过类似 Swagger 的玩意,它用的 DSL 完全不需要你写出每个参数的 - name:"WTF" - type: xxx,与之相比 Swagger 那 YAML 语法简直就像所有调用参数都要求 kwarg 的 Python 一样冗长……

其实我很好奇为什么 Swagger 有那么多语言的 codegen 实现、有那么多人实现这些实现,却没有一个人想着怎么优化它的“源语言”并提交给Swagger社区呢?(猜过分点,还是有人设计了但太烂所有没采用呢emmm)

其实这个算法并不复杂,甚至不一定可以被称为「算法」(我一直相信是因为自己智商欠缺才要那么多时间才弄好的),那么为什么没有其他工程派人士弄出一样的东西来呢? 😟
我想可能是因为那些程序员平时不使用定义式风格,所以他们不会想办法进一步设计更广阔,以至于跨语言、跨底层框架的代码复用;如果有,那就是人太少了,或者没人同时了解一些编译原理入门(相对更专业的常量折叠/回填而言)习惯。

我真的是个定义式编程迷,我设计过的所有复用库都不包含复杂的逻辑/数字/几何/数据结构/树图算法(尽管我做梦都想),但它们通通具有定义式的编程 API — 多数是用 vararg 尽可能在构造时就完成配置而不用如 .addXXX 的变更调用。尽管我一点也不愿意写 Haskell 和 Scala / Scheme(respect for its s-expr.) 等格调品味超高的(纯)函数式编程语言,函数式对我的影响我没照本宣科的接受,逼自己思考它们眼中的问题或是尝试实现它们那令人困惑的命名/建模方法。当然我知道放弃不值得炫耀,但这使我找到了不同于函数式但比函数式更易读、易维护的接口建模风格,就是 Kotlin 的风格和设计哲学,用于解决问题的东西就应该在平衡下解决尽可能多的问题、并且从不会制造其它问题。 #statement #design

当然如果你写代码只是为了弄出一个 "working" 的东西,或者觉得因为自己足够聪明所以 “重构甚至重写是码农做的事”、 “调试是愚蠢的”、 “把自己所知道的明确举例讲明白是为蠢人费力的无聊事” ,那就想不到你所想不到但的确可以实现的东西了。
This media is not supported in your browser
VIEW IN TELEGRAM
在修复了 TreeWidget.TreeItem 的 id 问题后(但它的tuple第一项就只限str了 和用UUID的效果差别大),终于又完成对 Scale(slider) 的 TTk interval 支持移植(原版不支持的特性) ,我添加了一个简单的roundInterval查找算法解决这个库里的显示不准确问题,但目前还没能完成纵向的渲染(有一部分原因是它的代码质量太差了!水平线以下!害得我没时间写 code object cache)
This media is not supported in your browser
VIEW IN TELEGRAM
虽然我写得很累,但我觉得应该改正下自己的坏脾气。 别人的代码即便不好,也是可以帮忙更改的。 虽然混乱的代码给我造成了麻烦,但他们设计逻辑也是很累的,代码质量不好不能全怪他们,也怪环境不好。
如果别人的库有可以改进的部分,你会费 15 分钟来提交 Pull Request 吗
Anonymous Poll
60%
会。开源就该支持
40%
会,但只改影响功能的部分
0%
不会。不好维护的代码应该由他们的创建者负责到底
也要看我有没有能力改。
https://github.com/microsoft/pyright/blob/da39a2a78a442d2a6b29d664b32475c361c853f1/packages/pyright-internal/src/tests/samples/dataclass8.py
@dataclass
class BaseClass:
my_ref: "ReferredClass"

欸,有更新 data class 支持,而且还内部支持 typing 实现 gradual typing 不像 Ruby 太 duck typing 了,看来 Py 还是有点东西
https://github.com/microsoft/pyright/blob/930c2021c63531248c6a979e3d3afdbcca14f16b/packages/pyright-internal/src/analyzer/types.ts#L530
export function hasUnknownBaseClass(classType: ClassType)
欸,原来不报类型错误必须要在超类链上啊... 真是过分呢,我只是想面向对象 Mixin 啊
啊…… 看来数学不好果然难呢。 重构的时候我把 xs[a:-1] 的 exclusive end -1 省略了(那就包括末项了)、 map(it*b, round(n/b)) 给理解成 range(a, n, b) 了,我加的 while a%b != 0 查找其实就是 (a/b) *b ... 虽然都是很简单的倍数关系啊
不过,在我经历无数烂代码的洗礼后,终于找到了bug的源头(一个str属性配置没适配...) 现在终于可以移植过来了emmmm...
duangsuse::Echo
不过,在我经历无数烂代码的洗礼后,终于找到了bug的源头(一个str属性配置没适配...) 现在终于可以移植过来了emmmm...
有意思的是这位大神作者(可惜代码质量怎么那么差) 写出的代码虽然很好用,但其实它是薛定谔程序! 测试里应用范围内无变量,但程序行为却间隔1次时好时坏!