Kotlin 相较于其他『高级程序设计语言』一个最显眼的好处就是对很多东西有更抽象、更泛化更普适的描述。允许程序员只描述问题本身,而不是疯狂描述各种各样为了伺候程序控制流做的制杖事,比如 Ranges。Java 程序员用了不知多少年的
比起其他语言 Kotlin 对抽象层次重视绝对是 Scala/Haskell 的级别,但不至于把抽象本身做成一种问题而是只为实际工程服务,所以 Kotlin 还有 extension function、extension property 这些方便直观而且自然的语法及特性,某辣鸡 Jawa 和 JVM平台上什么 Decorator 呦、什么 capture 呦 PECS 呦、lazy initializer 还『双检锁』高端得跟 upvalue/continuation 一样,不仅类可以"final"而且字段甚至参数也都能"final",真是把数学式"多态"的糟粕都学干净了。还各种 XML 式的『DSL』,还上Groovy这个IDEA都不屑于给好好支持的『脚本化语言』,真是隔壁 Ruby 都比它强 1k 倍,一切皆对象但是一切皆模板,不是太模板甚至于死板就是太『灵活』。好的语言就不该有模板,为什么模板不应该用对语言/库的设计来解决?所以包含了历史沉淀渣设计的辣鸡Jawa应该退休了,立刻。
int i = 0 while (i < stop) { ...; i++; } (或许你也可以说这应该用 for(int i=0; i<stop; i++) 且带step也可以这样,但依然远远不如 Kotlin 直观,更不用说加上函数式风格的 filter/find/zipWith 了),真是忽如一夜春风来就给改 for (i in 0 until stop) ... 了,直白100倍,而且还有基于「块(code block)」的 repeat 直接 EmbeddedDSL,还能让一些程序换 tailrec 写从而更直白,真是打了某些自以为自己的算法很高级而从不考虑可读性的辣鸡程序员的脸,Java真是被爆得渣都不剩啊!这还只是程序抽象级别上的,没提到比 Java 深思更多的语言设计和新世纪以来最有用的设计成果以及19xx年都有的研究(如coroutine、closure)。比起其他语言 Kotlin 对抽象层次重视绝对是 Scala/Haskell 的级别,但不至于把抽象本身做成一种问题而是只为实际工程服务,所以 Kotlin 还有 extension function、extension property 这些方便直观而且自然的语法及特性,某辣鸡 Jawa 和 JVM平台上什么 Decorator 呦、什么 capture 呦 PECS 呦、lazy initializer 还『双检锁』高端得跟 upvalue/continuation 一样,不仅类可以"final"而且字段甚至参数也都能"final",真是把数学式"多态"的糟粕都学干净了。还各种 XML 式的『DSL』,还上Groovy这个IDEA都不屑于给好好支持的『脚本化语言』,真是隔壁 Ruby 都比它强 1k 倍,一切皆对象但是一切皆模板,不是太模板甚至于死板就是太『灵活』。好的语言就不该有模板,为什么模板不应该用对语言/库的设计来解决?所以包含了历史沉淀渣设计的辣鸡Jawa应该退休了,立刻。
尽管Kotlin没法给类级的泛型弄成真泛型,但运行时许多JVM会有优化(其实也不必想这些的)
而且我们的库主要还是给人读写用的不需要太复杂。
Cond 属于之前我没想过的情况,不过还好,也写出来了。
而且我们的库主要还是给人读写用的不需要太复杂。
Cond 属于之前我没想过的情况,不过还好,也写出来了。
final override var position: Cnt = 0🤔 为什么 getter 是 public 的 open class 里的属性只能 final?
private set
JDK 的程序员脑子里是怎么想的,为什么 FileInputStream 没有 position,RandomAccessFile 还非得自带 DataInput?真当所有东西都需要一个 DataInput???
duangsuse::Echo
足以体现抽提代码重要性
这就好像是赶一群羊,找到头羊就可以领着一起走,不然一堆代码各走各的,都不听你的。写起来简单机械一点,改起来看起来通通选择死亡。
Ctrl+V『写代码』一时爽,测试修bug火葬场。
Ctrl+V『写代码』一时爽,测试修bug火葬场。
🤔JavaScript 基于 ArrayBuffer 和 DataView 的兼容抽象部分已经写完,暂时不对其正确性作任何保证。
正在准备开源到GitHub。
正在准备开源到GitHub。
duangsuse::Echo
🤔JavaScript 基于 ArrayBuffer 和 DataView 的兼容抽象部分已经写完,暂时不对其正确性作任何保证。 正在准备开源到GitHub。
https://github.com/duangsuse-valid-projects/Binarie 已经开源
这周可能不会继续开发下去了,那对我的精力来说有点勉强……
目前为止,Binarie 的 JS Reader/Writer 部分已经完成,可是 JVM 利用基础 BasicReader/BasicWriter(待写) 和BitConvert的部分待补完
应该说开发过程也是有点意外的,我开始的时候不知道自己打算用ES6的DataView和Int8Array (ArrayBufferView)来进行BasicReader实现,也没想到MarkReset在大部分子类会以oldPosition的形式被实现,略微有点不适应。
这周可能不会继续开发下去了,那对我的精力来说有点勉强……
目前为止,Binarie 的 JS Reader/Writer 部分已经完成,可是 JVM 利用基础 BasicReader/BasicWriter(待写) 和BitConvert的部分待补完
应该说开发过程也是有点意外的,我开始的时候不知道自己打算用ES6的DataView和Int8Array (ArrayBufferView)来进行BasicReader实现,也没想到MarkReset在大部分子类会以oldPosition的形式被实现,略微有点不适应。
GitHub
duangsuse-valid-projects/Binarie
🐠 Cute functional style binary structure IO library for Kotlin - duangsuse-valid-projects/Binarie
Forwarded from duangsuse Throws
duangsuse::Echo
🤔可悲不进步的 duangsuse 总是想弄一门自己的程序设计语言。 可不管他怎么写代码,连一个有函数和局部作用域的计算器都弄不出来。 于是他又准备设计一门…… 这个计算器是Lambda calculus的计算器。 所谓的Lambda演算就是说,词法作用域(Lexical scoping),不过我还给它加上了 Haskell 一样的 Currying。 Lambda 就是 \formals. body abstraction 不过 currying 的 lambda 只能有一个参数,\formals 需要foldRight才行。…
才发现原来那个 #PL 稿在这里啊…… 我还以为没抄到网上来呢
duangsuse::Echo
systemStack: 20 reports of: 12.580254ms, 529.422micros, ... min=129.954micros, max=12.580254ms, mean=824.48265micros, std=2.6990074188995345ms ascending: 129.954micros, 132.066micros, ... 25%=135.936micros, 50%(median)=154.33micros, 75%=217.637micros AdtStack:…
这是中缀链解析和 NumUnits 单位 format,当然这不稀奇……就是descending accumulator div+mod,我后来又写了一遍……
Lexical Scoping 我不用说吧,递归下降解析了解到
(lambda (a b) (+ a b)) 的 formals 里的 "a" "b" 与 body 里 (+ a b) 存在的1:1对应关系,就可以很自然地把他们联系起来了,之后怎么处理都好,例如像 Lua 一样把它们翻译为函数局部寄存器的编号,然后每次调用的时候给它们分配一对一的存储空间,caller调用侧和callee被调用侧都知道那个"a" "b"是指代哪片分配就好。
duangsuse::Echo
既然都这么弄了,还不如直接把优化写成代码算了……
虽然那个栈的中缀链貌似很高级,而且貌似递归下降的在很极端的情况下输出和 JS 不同,但我还是觉得应该选它,至少它看起来很简单,只 (base, op_left) 两个递归参数就够了,最重要的是它使用的栈是在语言层面受到支持的,而且这个支持本身实现的也很优雅很妥帖(要不然那语言还有用么……)。
duangsuse::Echo
看了某位大佬的 reley (一个类似 Haskell 编译到 Python VM Bytecode 的程序设计语言) 我觉得,其实 Java 和 Kotlin 的 package…… 都不利于代码的简洁性,我是好好想了一会的,其实未必没有办法引入『导出』文法,代价是,必须去掉包声明,不然不好看 ……还是留着吧,毕竟 Java 系的不是 Haskell 的风格 绝句还不是绝句Script 呢。 不过我觉得可以给「包」声明一个扩展: — 数域.jue 包 绝句.区间, 物,节域、短数域、数域、长数域、…
绝句开始的时候的「包」是这样的,和Kotlin一点的不像,可能是Kotlin要预备原谅了吧 😂