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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from Yuuta 🎀 | clrd enroute
继续闲得无聊对代码进行 人 工 混 淆,比如使用变量 oOo,o_o,_O_,_o_,OoO 等等。
Forwarded from Yuuta 🎀 | clrd enroute
fuck
#JavaScript #ES6 #web 我真是受不了 ES6,怎么都是 ES6 了还是这么不爽。
特地简化了很多遍,没 Kotlin 简化的快、有效。
垃圾 ES6 快快还我 elvis operator 和 (?.) null branch access 来!
#iHeartTypeScript <3 立刻使用 TypeScript 重写,抛弃辣鸡 ES6
没有 ES6 怎么能看代码
没有 TS 怎么能编程
duangsuse::Echo
垃圾 ES6 快快还我 elvis operator 和 (?.) null branch access 来!
TypeScript 3.7 已经支持了 (?.) ,和 ES6 修订一样叫 optional chain
sudo npm install --save-dev @types/node
npm update --save-dev @types/node

好了重写马上就完成了!
duangsuse::Echo
sudo npm install --save-dev @types/node npm update --save-dev @types/node 好了重写马上就完成了!
唉,还是有很多很多的问题,只能等着了……

还有 绝句第一稿的一些问题要改…… (虽然马上也不看第一稿了)
还有 Kotlin 关系式博文要写
还有 Literate Kotlin 工具要写……
ParserKt 也可以改一下了……
……
duangsuse::Echo
艹,还不如用 FP.js 的解析器呢(笑话
我终于彻底搞明白 lastItem, peek, next, consume 这些的区别了……

噢……原来 SaveIterator 和 PeekConsume 有本质上的区别啊…… 原来允许不移动数据指针和保存上一项是不一样的啊…… 原来真的不可能直接兼容 takeWhile 啊……
噢……原来 PeekConsume 实际上不能算 Iterator 啊……
噢……原来 tailConsume 是为了方便写解析器而对整体数据输出无影响,原来 tailConsume 也不一定得做成 boolean 判断的形式,只是最后一项得能 yield 出就可以了,Java 形式必须兼容 hasNext 才有 boolean tailConsumed = false;
噢……原来 ES6 Generator 版的 PeekConsume 实现 tailConsume 会更简单啊……
原来流处理应该那样分析啊…… 其实序列 1,2 算算 takeWhile (>=2) 什么的已经足够,再多看看索引 index 抵胡想半小时。
duangsuse::Echo
ES6 的 iterator 真是麻烦死了,hasNext/next 根本分不清
还是 Ruby/Python 式的 StopIteration 好……
class PeekConsume<T> {
iter: Iterator<T>
last: IteratorResult<T>
constructor(iter: Iterator<T>) {
this.iter = iter;
this.last = iter.next()
}
*iterator() {
if (this.last.done) return;
yield this.last;
this.last = this.iter.next()
}
get peek() {
return this.last.value;
}
}

这个很正常,但是 peek 和 next 不在一个地方访问,所以不能直接用 Generator 写。
也可以这么写,不过其实也能不用一个多加的 boolean, 或者不用 IteratorResult
还可以这么写
比如有流 1,2,3

new Peek([1,2,3].values())
peek=1, next=undone(1); this.last = undone(2)
peek=2, next=undone(2); this.last = undone(3)
peek=3, next=undone(3); this.last = done()
peek=undefined, next=done(); this.last = done()

不需要判断是否 hasNext(),也可不用 Generator,因为它实际上就是 fun next() = lastItem.also {...}
Kotlin 里面,我们利用 hasNext 和 tailConsumed 判断是否更新 lastItem、内部流结束后是否要结束外包流,以及那时 lastItem 是什么,这里我们不需要,因为 tailConsumed=truelast={value: undefined, done: true} 是等价的,不需要预先判断,而且 Generator 里你不需要抛出任何异常。

对上面使用真假判断的版本

new Peek([1,2,3].values())
peek consume case
1 1 !askNext.done
2 2 !askNext.done
3 3 askNext.done, !tailConsumed
3 3 askNext.done, tailConsumed
undefined undefined
额滴神呐,ES6 这风格也太诡异了吧……
差强人意
TypeScript 没 extension 和 Kotlin 的 functional extension, like also: T.(Consumer<T>) -> T, let: T.((T) -> R) -> R 实在是太难了!我感觉我的 oldLast = last; last = nextLast(); return oldLast; 和辣鸡 Java 的没区别啊?为什么我不能写 return last.also { last = nextLast() } ?

其中,last 是 inline block T.also(...): T 的一个参数,而这个参数在块里没有被使用,最后此块会返回原 receiver T 的值,同时原 last 也会被重新赋值,oldLast 就是 also 的隐式参数 it,理论和实际一样优雅高效。

写别的语言就跟吃 💩 一样,Java 那种东西是根本救不了了。学 Java 救不了中国人。

不知道那些语言的设计者脑子里都有啥玩意,为啥 TypeScript 顶着强制要求所有 (name:T) => R 类型标记都得加一个 name 的弊端,还是要那样设计,而且 constructor 看起来又那么头晕那么冗余,我真是不明白。

TypeScript 的 constructor 比起辣鸡 Java 简直可以说是没啥改进,除了换成了关键字定义省脑子标准化,该有的 this.filed = field; 一个也不能省。
该省的你们留着、不该省的你们简写、不该有的你们加上,我去我还是写『脚本语言』算了,至少第一眼看起来是好一些。