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
差强人意
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; 一个也不能省。
该省的你们留着、不该省的你们简写、不该有的你们加上,我去我还是写『脚本语言』算了,至少第一眼看起来是好一些。
无论是 TypeScript 还是 JavaScript ES5、甚至 ES6,都没法改变这种程序的写法,一点可读性都没有。
fun List<String>.preetyShow(seprator: String = ", ", lastSeprator: String = " and "): String = if (size == 0) ""
else this.slice(0 until lastIndex).joinToString(seprator) + lastSeprator + this.last()

甚至还可以

fun List<String>.preetyShow(seprator: String = ", ", lastSeprator: String = " and "): String
= this.lastOrNull()?.let { slice(0 until lastIndex).joinToString(seprator) + lastSeprator + it }


如果觉得 if (size==0) 或者 if(isEmpty()) 不好看,还可以

fun <R> Collection<*>.takeIfEmpty(value: R): R? = value.takeIf { isEmpty() }
fun List<String>.preetyShow(seprator: String, lastSeprator: String) = takeIfEmpty("") ?: slice(0 until lastIndex).joinToString(seprator) + lastSeprator + last()

顺便提一句,Collection<T> 里其实已经有 takeIfEmpty 的 functional 版本了,我也可以写 takeIfEmpty {value} 的。

所以说 Kotlin 的 elvis operator (?:)、safe access (?.) 是对 Java 所谓的『Nullability问题』化腐朽为神奇,变成了不得、对提升语言表现力有极大作用的宝物,不少函数式编程语言都没法表现得那么直白。

所以说 Java 真是烂泥扶不上墙啊,果然修问题要修在 root cause 上,就是语言设计辣鸡,『生态』『工具』再好也只会制造更多问题。 #PLT #statement #Java #Kotlin

Kotlin 整门语言都是极其对称的,fun、val、class、object,都是写在前面,放在一个地方的东西如 fun, val, var 基本连关键字长度都是一致的,有哪门语言想见过这点???都是只考虑『可以表达』、从不想『如何好看地表达』

只想着『完成就好』,从不想如何『更好地完成』,你们这样子是不行的! 🐸

就像只计划着『图灵完全』的语言,是没办法做成工程可以实用的形式的,而且有些更学术的语言甚至都不图灵完全,因为它们还能不是为了解决『如何定时喂猪』那种问题设计的,所以只有追求更高的东西,而后自然而然能够以更好的方法完成更低的东西,只解决问题、从不制造多余的问题。
这叫『抽提』,是让代码变好看一点的第一步,当然你可以认为这时它只是更难理解了一点;其实这的确只是第一步——没有第一步,何来累积优化? #JavaScript #ES6 #web
duangsuse::Echo
这叫『抽提』,是让代码变好看一点的第一步,当然你可以认为这时它只是更难理解了一点;其实这的确只是第一步——没有第一步,何来累积优化? #JavaScript #ES6 #web
更大的改进都是从这时看起来『善恶不明』的抽提开始的,没有一次次小的重构做铺垫,就发现不了代码可能存在更多可以提升的因素,像极了现代编译优化器的 pass-by-pass 架构。
模块化果然还是很重要……
😂 Bug 总算是捉住了,哎呀妈呀,果然是一个小模块的数据结构格式问题……
woc,果然是不能 Ctrl C Ctrl V 代码啊!就多了个星号就大不一样了……
Modules 实在是太艹了,我想利用 Global 来链接这两个依赖,可要用 modules 就不能这么做!但我只有 plain JavaScript 格式的 Kotlin playground 啊!
折腾了半天,总算是解决了加载时序的问题…… addEventListener 真是不称职,为什么 defer 脚本很多时候就不能执行
#dev 真的开始怀念以前编程的时候,不需要想太多;上次的 Kotlin JS/JVM 的 Binarie 现在没写完,要写完的话其实要给不同平台兼容接口…… 很麻烦呢

待在一门语言、一个环境还真心不累,写点二进制序列化辅助库什么的都太简单了,我太难了!
时序上居然还有问题,我佛了。
JavaScript 浏览器环境的模块系统真是麻烦死了,还 async, defer 还居然有顺序,怎么安排啊?我不就是依赖个外部脚本嘛…… 怎么还能和 Globals 导不导出有关系?
我修改了 waitsElement 函数的实现,给添加『监听』时 DOMContentLoaded 已经触发(readyState=='complete') 的情况立了分支,现在没问题了……
waitsElement (e: Element, op: Action)
|e === document.body ->
if document.readyState == "complete" op()
else document.addEventListener('DOMContentLoaded', op)
|else ->
e.addEventListener("load", op)
duangsuse::Echo
#JavaScript #ES6 #web 我真是受不了 ES6,怎么都是 ES6 了还是这么不爽。
所以你们看到,我重写一个东西居然用了差不多一天…… 艹

但是这还是有很大意义的,至少我学会怎么写 TypeScript+RequireJS 组合了。
而且把一个代码正确性完全是靠瞎猫撞耗子的程序,重写为一个我自己能够肯定至少它原逻辑不存在意外的程序。