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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from 层叠 - The Cascading
网友的想象力是无止境的……

https://t.me/lychee_wood/17004
不过说句实话 @Telegram 好像支持 GIF 头像了吧? 🤔 #Telegram
Forwarded from dnaugsuz
嘛,吃早饭的时候想到 ParserKt 跳过 Expr 里的 /* 注释的问题,说是不可能完成(因为要 lookahead),发现是我错怪它了……
它读取 Expr 链用的是 InfixPattern ,而这个 Pattern 接收的是 Pattern<Char, InfixOp<T>> 所以只要给 Trie 外面包层 Piped.decide, 然后如果是 /* 就返回一个跳到 */ 的解析器,否则 always(op) ,实际上是可以实现,只不过那个跳到 */ 的Pattern超级难写,而且这个做法超级鸡肋而已(只为区别除号和注释就得在 Trie 外再包一层…… 还不如允许 lookahead 开销小呢)
Forwarded from dnaugsuz
不过我是真打算抛弃老的 ParserKt 了…… 看起来 crossinline 更有魅力一些,而且老版的代码虽然不冗余但也有很多比较鸡肋的功能,对实践的意义有疑问,而且新版一样支持 Trie,NumUnit,Lexical,Layout 这样复杂的 pattern 和 unparse ,只不过就不能写 !element('x') 这种利用 OOP PatternWrapper 的特性了。
草,花了好长时间就做了个 logo …… 而且动画还要另做
Forwarded from iseki 萍水相逢,相聚是缘
之前写了个codegen,处理vertx eventbus的,就是比较粗糙 https://gist.github.com/cpdyj/34f77d3bd56903247dc2a9e92196c6eb 上次不是纠结vertx的Service gen没法用吗
duangsuse::Echo
http://sargunv.github.io/cakeparse/ https://github.com/h0tk3y/better-parse/ 草, Kotlin 居然还有 cakeparse 这个解析组合子库…… 完事后我也应该把 ParserKt 弄上 awesome list 还好
两个大佬都比我聪明,都用了 Kotlin sequences 和大量的 infix notation ,而且是 LL(*) 的 (regex)tokenizer-parser 架构;并且,我也见到不少和函数式领域有交叉的名词(总之高大上就是了)
CakeParse 的包结构相当复杂,而且还用的是 CachedSequence<TokenInstance> …… 真不是一般的复杂,尤其是命名上。
better-parse 的 Tuple 和 And 用了 codegen(n_max, output) Gradle task 代码生成,而且它的 (a and b) 还能针对 skip(a) 这种特例创建不同的 tuple ,这种思路我是想不到如何尽可能优化地实现……

的确很厉害,但它们都没做到能弄出(即便还有缺陷的) HanCalc 那样复杂的文法,止于玩具的程度而已。 想写出好东西光靠聪明是不行的…… 还要懂得如何分配自己的聪明 ☹️
一个作为底层为高层服务的库,就应该简单。 应该首先为使用它的东西的目的着想,尽可能少的使用不能使代码变好看的技巧或在API上制造麻烦。

聪明才智都用到设计这种“复用”库上了,如何才能真正在它上面轻松构造和谐优美的应用?
或许这样的代码,单独放到台面上是 A 级;但作为应用程序忠实的仆从,反而大放光华、喧宾夺主,就会毁了所依赖它的应用以及它自己。 写好复用库的关键在于看到它不是单独一个“人”。

顺便: CakeParse 真可爱,它的子解析器调用动词是 eat() , 吃输入 😂
#statement #fp #kotlin #ce #lowlevel #dev
…… 看看 kotlinx.cli 他们这个,笑死我了, 简直不配叫 Kotlin ,草
This media is not supported in your browser
VIEW IN TELEGRAM
不过这也正常,因为我找到了数个几个月没修复的 typo,难道这就是所谓的『贪多必失』么……

一个 kotlinx 库,居然把错误信息写得那么详细! GNU 的文档链接都有了…… 而默认无法更改的 -help 命令的帮助却又那么简略!
duangsuse::Echo
…… 看看 kotlinx.cli 他们这个,笑死我了, 简直不配叫 Kotlin ,草
解释一下。 Kotlin 代码的 if 嵌套层次能深到如此地步,而且 val 下面的 if 可以 early-continue 或者 invert if 的,它非要加缩进,真是让人无言以对,我内心已经开始自暴自弃一样的大笑了…… (大概是看谁的代码都有对它同理心吧)。

arg.startsWith('-') 又是一个和上文不对仗的用法,上面用的是 startsWith(optionShortFromPrefix) , 就算说是过滤性预判也极其牵强,只能说是作者嫌应用起来太长了, Kotlin 能写得这么窝囊我也是醉了。
全貌。 就这么一点逻辑还加一句一注释演技真是浮夸啊…… 很多 if 其实都只有一个语句,它偏偏要加缩进 而且还在那句上加个无关紧要的注释,真是把我以前在 Java 见过最烂的注释方式移植到 Kotlin 上了,一句一注释,而不是把这些破烂集合到内联文档垃圾场去,的确是很 Kotlin way 啊。 😠
看着这种优化的「注释」方式,我想起了那句“:shi味咖喱饭,还是咖喱饭味的:shi”…… (和谐
不管你怎么改,也只是从外表难看变成内部难看而已……

还有那个 if (treatAsOption && ..) if (!treatAsOption) 又是什么鬼啊……
还有 if (treateAsOption) { if (!p) // Argument is found } 这个注释又是什么鬼逻辑…… 难道这个开发者不懂 found 是什么意思?
This media is not supported in your browser
VIEW IN TELEGRAM
学到了学到了,不过这样的代码我是不会再以非重构目的阅读了就是。
乍一看非常厉害,其实也没啥算法,而且都是在无用的地方下篇幅,死板的机器 formatting 我也会写那种 reformater 呢,何必呢。

从根本上设计就有问题,过于复杂,看起来再难以理解也只是给自己添麻烦而已,能做出什么呢? 支持的太多,最后反而一个也用不到,自己也弃坑了,简直是暴殄天物。 Kotlin 这样融合OOP和函数式优点的语言拿来写这种烂代码、虚浮的内部建模,没有多大意义