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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
因为苹果商店审核通过了这次更新,所以他们删除了阴阳怪气的话语
你依然可以在网页存档欣赏这段话
嗯…… 写完了。 明天开始给 funcly-PKT 写测试了,写完测试和 unparse 我就走…… 因为 Kamet 的设计不需要所以不写 Layout 解析和 LexicalScope 解析了,赶快 publish 的好
This media is not supported in your browser
VIEW IN 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 能写得这么窝囊我也是醉了。