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 基本连关键字长度都是一致的,有哪门语言想见过这点???都是只考虑『可以表达』、从不想『如何好看地表达』
只想着『完成就好』,从不想如何『更好地完成』,你们这样子是不行的! 🐸
就像只计划着『图灵完全』的语言,是没办法做成工程可以实用的形式的,而且有些更学术的语言甚至都不图灵完全,因为它们还能不是为了解决『如何定时喂猪』那种问题设计的,所以只有追求更高的东西,而后自然而然能够以更好的方法完成更低的东西,只解决问题、从不制造多余的问题。
duangsuse::Echo
这叫『抽提』,是让代码变好看一点的第一步,当然你可以认为这时它只是更难理解了一点;其实这的确只是第一步——没有第一步,何来累积优化? #JavaScript #ES6 #web
更大的改进都是从这时看起来『善恶不明』的抽提开始的,没有一次次小的重构做铺垫,就发现不了代码可能存在更多可以提升的因素,像极了现代编译优化器的 pass-by-pass 架构。
不过 Generator 真的好方便啊!
TSC 默认的实现也和我之前那个 Essay-Java-CtrlSt-Based-Generators 差不多,打断表达式来求值
TSC 默认的实现也和我之前那个 Essay-Java-CtrlSt-Based-Generators 差不多,打断表达式来求值
GitHub
duangsuse-valid-projects/Essay-Java8-CST-Based-Generators
Control structure / java.util.Iterator / class instance private state based suspend functions just like C# yield state machine - duangsuse-valid-projects/Essay-Java8-CST-Based-Generators
折腾了半天,总算是解决了加载时序的问题…… addEventListener 真是不称职,为什么 defer 脚本很多时候就不能执行
#dev 真的开始怀念以前编程的时候,不需要想太多;上次的 Kotlin JS/JVM 的 Binarie 现在没写完,要写完的话其实要给不同平台兼容接口…… 很麻烦呢
待在一门语言、一个环境还真心不累,写点二进制序列化辅助库什么的都太简单了,我太难了!
待在一门语言、一个环境还真心不累,写点二进制序列化辅助库什么的都太简单了,我太难了!
https://duangsuse-valid-projects.github.io/Share/Others/obfus_java
现在这篇文章就妥妥的是使用 TypeScript 3.7+RequireJS/AMDModule 写的脚本。
现在这篇文章就妥妥的是使用 TypeScript 3.7+RequireJS/AMDModule 写的脚本。
Share
手工混淆 Java 与手工编写 Java 解析器
🐕 duangsuse’s shared files(e.g. productive software projects, documents)
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
Photo
从无头苍蝇到有组织、有目的的代码,差别是很大的。
比如想在代码里添加一些新特性,瞎猫式编程很轻易就会把那堆纠缠不清的代码改错,因为作者也不知道为什么它能够工作,最重要的是作者往往不敢改,因为他们对“这一次的”『代码正常工作』心存侥幸。
可是好猫会把代码的目的写得一清二楚,因为他们本身就对代码一清二楚。那样的话重写想写错都难,修改和新增想弄错更难。
比如想在代码里添加一些新特性,瞎猫式编程很轻易就会把那堆纠缠不清的代码改错,因为作者也不知道为什么它能够工作,最重要的是作者往往不敢改,因为他们对“这一次的”『代码正常工作』心存侥幸。
可是好猫会把代码的目的写得一清二楚,因为他们本身就对代码一清二楚。那样的话重写想写错都难,修改和新增想弄错更难。
觉得绝句不允许写
或许
可是…… 我觉得
三月 、三个人 这种名字很…… 不知道该怎么说?或许
三、二 这种数字形式根本不该出现?可是…… 我觉得
一行(a、b、c) 不如 行一(a、b、c) 明确啊,如果允许可能出乱子,为了一致最好还是不许的,汉字一般不把『五个人』当名词用的。