/tmp/duangsuse.sock
23 subscribers
303 photos
3 videos
92 files
337 links
从 duangsuse::Echo (@dsuse) 跟进出来的分支,将在作者恢复原帐号访问的时候合并删除。
Download Telegram
/tmp/duangsuse.sock
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/index.html 原来 Kotlin 里已经有 Iterable.toMap 了,就是 associate…… 还有 associateBy…… histogram 也早就有了,就是 groupBy…… 原来 partition 只是特殊化的 groupBy 啊…… 还有 chunked, windowed 这种高级操作…… 还可以用 onEach,许多 method 还有 withIndex…
突然对 ParserKt 的代码质量很失望,草,必须重构了
原来那都是我自己所谓的叫法,什么俩重载的 toMap 居然是 associate, associateBy、hist 居然是 groupBy…… #Kotlin

ParserKt 式的流架构可以说是原创,但存在着一个黑点
我也不确定它到底在多大程度上比 Kotlin sequences 处理能力强
ParserKt 到底配不配冠一个 Kt 的名字…… 简直是在招黑
何必“深刻”?这么浅的细节都能看出
Kotlin 实在是太棒了…… 无论是大理论还是小细节 都完美呈现
为什么是俄罗斯人 不愧是俄罗斯公司
真正理解编程的语言
从不舍本逐末的语言
重视代码抽象的语言
This media is not supported in your browser
VIEW IN TELEGRAM
热泪盈眶
真正懂得设计的程序设计语言
何必那么多 DSL、何必那么多语法、何必那么多变通
只需要一个 大家都应该了解的、最简单却最富有表现力的表示
关注问题本身
像这种就属于不必要的抽提,必须内联进去 #Kotlin
> Task :parserkt-util:compileKotlinJs FAILED
e: java.lang.StackOverflowError
at kotlin.collections.ArraysKt___ArraysKt.map(_Arrays.kt:8888)
at org.jetbrains.kotlin.name.FqNameUnsafe.pathSegments(FqNameUnsafe.java:158)
at org.jetbrains.kotlin.name.FqName.pathSegments(FqName.java:98)
at org.jetbrains.kotlin.descriptors.FindClassInModuleKt.findClassifierAcrossModuleDependencies(findClassInModule.kt:24)
at org.jetbrains.kotlin.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies(findClassInModule.kt:40)

辣鸡 Kotlinc 又出错了
/tmp/duangsuse.sock
> Task :parserkt-util:compileKotlinJs FAILED e: java.lang.StackOverflowError at kotlin.collections.ArraysKt___ArraysKt.map(_Arrays.kt:8888) at org.jetbrains.kotlin.name.FqNameUnsafe.pathSegments(FqNameUnsafe.java:158) at org.jetbra…
我通过 undo last commit 逐个排查修改文件后已经找到了原因,的确是 inline type parameter 的问题

作为一个 Kotlin 程序员的爱心…… 虽然此 bug 有 workaround,但我还是把它提交给 JetBrains 的好
现在正在撰写最小 problem file
This media is not supported in your browser
VIEW IN TELEGRAM
[duangsuse@susepc tmp]$ kotlinc-js SOE.kt -output a.js
exception: java.lang.StackOverflowError
at org.jetbrains.kotlin.js.translate.expression.ExpressionVisitor.getPrimitiveClass(ExpressionVisitor.java:303)

成功重现 bug,正在简化问题文件
inline fun <reified T: Any> T.compareUsing(other: Any?, crossinline compare: T.(T) -> Boolean): Boolean {
if (this === other) return true
return other is T && compare(other)
}

interface Animal<FOOD> where FOOD: Comparable<FOOD> {
val food: FOOD
}

abstract class BaseAnimal<FOOD>(override val food: FOOD): Animal<FOOD> where FOOD: Comparable<FOOD> {
override fun equals(other: Any?) = compareUsing(other) { food == it.food }
}

这是基本问题输入,即便我不用 intersection upper-bound 也是一样

inline fun <reified T> T.causeBug() {}

interface SomeToImplement<SOME_TVAR>

interface SomeInterface<T> where T: SomeToImplement<T> {
val field: T
}

abstract class SomeChild<T>(override val field: T): SomeInterface<T> where T: SomeToImplement<T> {
fun op() = causeBug()
}
即便 causeBug 的 T 不是 receiver 也是一样
只有在 SOME_TVAR 包含对继承自自己的 Type 的引用时候才会引发无尽递归
T: SomeToImplement<Int> 则不会引起 bug

inline fun <reified T> T.causeBug() {}

interface SomeToImplement<SELF_TVAR>

interface SomeInterface<T> where T: SomeToImplement<T>

abstract class SomeChild<T>: SomeInterface<T> where T: SomeToImplement<T> {
fun op() = causeBug()
}
提交了这个 bug 就去睡觉~ 但愿能尽早修复
StackOverflowException when using reified recursive bound for type parameter in Kotlin2Js

https://youtrack.jetbrains.com/issue/KT-37128
提交了
Forwarded from Deleted Account
object Yes {
fun main(vararg args: String) {
while(true) println(args.firstOrNull() ?: "y")
}
}

(迫真)buffer 什么的就算了
鸡它太美……
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-dsl-marker/index.html
@DslMarker annotation class HtmlTag
@HtmlTag class TagHtml()
@HtmlTag class TagHead()

结果 html { head { head {} } } 同名 member 就可以 closest one wins 吗……

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-builder-inference/index.html

无法理解,表述太复杂,看示例是能从 fun <T> (op: @DslMarker Receiver<T>.() -> Unit) 这样的 function argument 推导出 T 一样