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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
幸好,我已经准备好弄内部 DSL 版的了😥
中午还没吃饭,那就不吃了,最近浪费时间第一的实践...

#JavaScript 其实最开始我是不打算用 fold 解释器的,打算直接用 eval() 处理变成 clickingOn("wtf").addsClass("") 这种形式的代码,为此还定义了一个


foldReplace(/(\S+)\s+(\S+)("[^"]*")?/, (a,b,c) => a+capitalize(b)+c?(${c}):"", "apple fd") function capitalize(s) { return (s=="")?"" : s[0].toUpperCase()+s.substr(1, s.length); } function foldReplace(re, op, input) { var text=input; var matched=false; do { matched=false; text = text.replace(re, (_, ...args) => { matched=true; return op(...args); }); } while(matched); return text; }


但是发现这样没法区别处理 "" 里的东西,不得不换成兼容 ES5 的 RegExp sticky flag 分词法。

总之,这次感觉血亏,跟着一个30岁,还只会前端、冒鬼点子的大叔,也没学到写CSS。

嗯…… 也不全对,学到了个 requestAnimationFrame((t_ms) => void) 算 start/elapsed
还有魔怔的 +function(){}() 等于 (function(){})() IIFE 技巧
This media is not supported in your browser
VIEW IN TELEGRAM
每次打破计划后都不知道为什么会浪费时间(但是这次是复制粘贴的比较多,然后 EDSL 的数据封装、JS 的歧义语法差错和codegen都浪费了时间),但是站起来的时候腿软了,即便这样还要继续编程么?
#China #Freedom 写好的东西, git push 不了。

有的觉得是 http buf 和压缩的问题,有的说是要上梯子


V2Ray 下了,不知道是不是USB绑定网不能用,完全复制手机的JSON配置也不行。

真棒, GH 的 SSH 和 github.io , githubusercontent.com 都已经屏蔽了,马上中国的开发者就要分为认识GH和墙内的两拨了,嘿嘿嘿嘿嘿嘿…… 不错,真棒。
#algorithm 之前 Kotlin 的 DeepRecursiveFunction 有一个建树的示例,如果 n 指二叉树深度那对象分操作数配肯定比 O(n) 大吧……
Forwarded from Phonograph (Ralph 萌新喵)
我人傻了
互评作业,有人说他建树算法时间复杂度是 O(log n)
您把输入的节点遍历一遍都是 O(n) ,好吗
只好试着用 Termux (Pocket Git),唉,晚上就不必开电脑了,真可惜
Forwarded from dnaugsuz
emmm
JDK 是 java.util.MessageDigest
C++ 一般都用 OpenSSL init update finalize
#android #sysadmin #freedom 头疼死了,以后这里开发贼不方便啊(得先 commit 了再打包到手机 push……),早知道就把 V2Ray 复制到这台电脑了
#css #js https://github.com/duangsuse-valid-projects/Share/tree/master/HTMLs/uilang/uilang.js
这个就是我的重写版本(感觉。十分鸡肋,人家的是用 trim split" & 元编程,我的是倾向于解释器&EDSL(嵌入式DSL) ,看起来就一个 onclick CSS add/remove/toggle class 的问题,不值得这么大费周章(但即便这样我的代码去掉codegen还是比他短,100行,emm )
也不是 10 行之内我实现不了这个逻辑,就是写太弱类型化,感觉总是不合适(虽然JS本该如此😳

理论上这个前端虽然滥用面向对象,他的性能应该是比我高的,毕竟我是 EDSL (就要创建只含数据的字句对象)而非提数据元编程(突然觉得中缀算符优先级对DSL挺重要的啊…… clickingOn .action adds (.wtf on div) 不比纯左结合优雅)

这个就是看起来还可以,语言实现像是视图实现教程附赠的

所以我写严苛点吧…… 搞得我还没有前端熟悉编程和消模板一样

不过在重构原作者一个不会写的线性查找时我也糊涂了,

while (i--) {code=codes[i]; if (p(code)) break;}

没有定义无符合的情况
原作者很不明智地新建了 codeBlock 这个同义词变量,其实应该是

rfind(p, xs) { var i=xs.length; while (i--) { if (p(xs[i]) return xs[i] } return null; }

,看看这个 while 的穷举居然不可以重构掉(废话),实在是草生
今天下午在实现 Tokenizer DOM/JS 应用(基本就是包一下 Trie 树,方便咱唱有日文假名字的歌用的,这个功能苹果有,网易云音乐早就该加了哼。)

因为这个家伙设计得比较方便,可以查看字典树结构和合并后的词对应关系表(而且还能用来查单词……带自动补全草),必须设计一个字典树 string-value 遍历算法。

这个算法咱在 ParserKt 里实践过(毕竟字典树是一遍过解析关键字的重要结构),那时候写了一个纯函数(优点是没有参数所以直接 public 即可),大概就是各种 flatMap 修改合并下一层递归返回的列表啊,麻烦死了,而且性能不高

字典树这个结构也没比嵌套 Map (K-V 里 V 是 Map 的那种) 复杂多少,就是每层映射本身多对应一个『节点本身的值』而已 (比如 "stand", "standby" 里 "d" 也有存值,这种很常见的)

开始我避免了使用递归算法(虽然我最爱写递归算法了 误),想想这个遍历是嵌套 1-N 次组合,肯定要用栈,当时觉得有 keySeq, stack 这两个栈就够了(对应关系是 stack[i] = keySeq.subSeq(0,i-1).fold(routes) { it,k -> it[k] } ,主要是缓存路径结果)

我开始发现现在写的算法虽然都很麻烦,但就像是思考“通项公式”一样,就是一个状态机或者操作一两个结构,明白了就很简单。

写的是每层 Trie 先给其值(如果有),然后访问它的子节点,这时候我就发现为了能递归完成这个动作,循环必须可以打断(循环的 label TypeScript 是支持的,然后要保存索引……)

我把 for in 变成 o[Object.keys(o)[i]] 这样可以保存迭代状态(ES6 也不支持 ObjectIterator ,然后 Object.entries 在 TS 上很麻烦),写出来了(递归的话直接把 i 给 push 上去 然后 i == length 的时候就 pop),现在也感觉好不爽啊…… 索性又换成了带副作用的递归的形式。

写了好多次显式栈之后,我果然还是觉得递归好,至少不需要你加 hack 。

一天半后,项目完成了,然后我突然想到了一个 #Kotlin #coroutine 必须要 executor 来执行的理由(之前一直搞不懂 runBlocking, launch 什么的是干嘛)
一个协程 yield 后要把执行权交出去,如果只是用 CPS (理解为无返回,只 callback ,但在这里收 callback 的还能恢复协程) 的话会造成调用栈不断增长,所以不能直接这样干,只能先把 Continuation 交给收它的地方,返回调度器取任务继续
关于 await/async 不知道能不能完全只用 CPS 变换来实现(反正我觉得实现起来枚举语法生成很复杂),但完整的协程是可以的。
#web #js #TypeScript #tool 过于生草😳
This media is not supported in your browser
VIEW IN TELEGRAM