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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
duangsuse: #kt #book 元编程 http://www.bilibili.com/video/BV1XH4y1w7mT https://drive.bennyhuo.com/zh-CN/talks/2018.11.17-%E4%BC%98%E9%9B%85%E5%9C%B0%E4%BD%BF%E7%94%A8%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B_final.pdf https://weread.qq.com/web/reader/f7632a00…
#kt #元编程 嗯。。我有个点子,有没有懂ktx序列化的人批判一下😊

基于Visitor实现json/toml.. 的读写,data class 只提供零参构造和 KVlit.see(instance,"field",jsonVisiter)接口

数据类的KVlit,就是给dict支持了个拆箱赋值,结合零构造和field Visitor自然而然就实现了序列化
设计CLI解析器时想出来的,就挺像xmlpull

const N=Double
data Num2(x:N,y:N)

interface KVlit {
fit(o:Any?, k:StrInt, v:LitSeer)
companion 注册表: IType<KVlit>
}
next=File(..).jsonLits

typeof<Num2>
(KVlit).fit object:LitSeer {
see(x:N):N =next.Float
//我们要read,所以忽略旧x
see(o:Any?, T:KVlit) = skip'{', T.fit(o, next.Str, this).. defaults(o);return o
see(o:Any?) //null模仿动态类型、Any.kvlit.testy 不为空

//BDFL optimize (Boxed ints, Date/Decimal/UUID, float[]s, List Map<,Any>
o.(Integer x)仍调用int返回的重载; int[]在长度不变时返回自身

see(o:MutKV<*,*>, K:Class,T:KVlit?) //传入Class.INT等常量即可
see(pair:Any?, T:Class, vararg Ts:KVlit?).. //可通过实现 typeof<Pair>(f2Any)转接list,base64
}

这是读取,写入的话接口一样是
x=fit(jsonStream,x) 。如果 T.seal? 字典不为空,就先读个'type'键 然后同上。 期间 T.setLit Bitset用于检测是否需赋默认值

扩展的话,直接 override Visitor 的最后一个函数! 数据、格式、模块,完全解耦

codegen上就是一个大when{}的语句字典
然后对diff update(亦可DeepCopy)
以及CSV(KVlit能实现.eachIndex)很友好,这点是我最满意的

想支持ClassFile等binfmt,除了重写list,sealed编码还要支持 UInt,bitstruct,Magic012,CPool<> 等类型,但比从头开始好

实现上, T.fit(o,key,this) 应外提为线程局部 T.fit(o,key,)KVlit.seer
T.fit(map,T,)KVlit.mapK
应支持创建iterList.setEach{}随访问更新流