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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
接下来的计划是:
+ 利用现在的 ParserKt 写出 JSON 和 Kotlin 解析器
+ 讲一下 Infix 解析优化、OverlapRangeMap
+ 编写基本的 Montage Python 程序,生成一些彩色艺术画
+ 写 Binarie 框架
+ 彻底重写 ParserKt
ParserKt 对曾经设计上一个不方便的地方为了想当然的「优雅」少定义了一个接口,结果害得成这样…… Fold 数据结构都有误
duangsuse::Echo
ParserKt 对曾经设计上一个不方便的地方为了想当然的「优雅」少定义了一个接口,结果害得成这样…… Fold 数据结构都有误
我错了!我的定义完全写错了……
可怜的 IDEA,它还帮我指出了 position 分明是一个被该对象 this 引用的 upvalue

它的生命周期已经完全超出应该的每parse一个,导致了这次我浪费大量时间来分析,为什么会出现基于『调用顺序』发生的bug!
这个 Fold 根本不该被定义为 Effect Fold,它应该是普通 Fold 的……
下次不应该胡乱设计,或者过分执着于某些「优雅性」,如果要那种优雅为什么不用继承子类,或者干脆不要写Kotlin了,换成Haskell呢?
我开始觉得保存流位置这件事应该是由 items("abc") 这样的解析器,而不是 seq, or 什么的解析器完成了
duangsuse::Echo
我开始觉得保存流位置这件事应该是由 items("abc") 这样的解析器,而不是 seq, or 什么的解析器完成了
finally,在我死肝debug两个小时后,一吃完饭我才最后成功弄 pass 了 tests
只是加了一个 AtomParser 的 mark/reset 调用而已,居然……

我一点都想不明白,为什么seq里的tryRead(也用了MarkReset)不行,单独MarkReset可以?是不是还有bug?
啊,我艹,果然是写错了!还好我牢记曾经在酷壳看到的『修问题要修在root cause』基本观念,没有轻易放过它
要不然指不定我下次还要再犯!

我最开始的设计也有容易混淆的地方,我把 pfail 和 Kotlin 的 nullability 操作符混在一起了,一些地方没注意到……

难怪我看见里面的逻辑执行了两次,感情是混用了 null elvis (?:) 算符……
Null 『传递』就导致 MarkReset as? 的结果和你后来 let, run 里面逻辑的 null 可能性混淆了,这是一个不常见的坑…… #Kotlin
这个让我调试了2h+的问题啊……
这么多代码,已经足以解析 JSON 的字符串了,当然写法不止一种(repeatUntil(buildCatStr, seq(takeTerminate(element('"','\\')), or(eoString, escapedPart)), item('"')))也行、有了reduceOr/leftrec左递归也可以。 ParserKt 不是一种 DSL,所以 Kotlin 能够描述什么它就能描述什么,不需要太多麻烦的东西,高阶抽象章口就莱。
在我运用自己的迫真数据依赖和过程式里技后,总算是拖了两个小时解决了递归解析的问题;可以用了。
Forwarded from dnaugsuz
动不动就是 null,Kotlin 的编译器检查不出来,它不知道有些东西(比如lazy、inline getter 的)的一些数据还没初始化

我改了很多次,基本都是:
+ map 要用到的 val element 没实际上拿到 val scalar 的值
+ scalar 是空的
+ init {} 陷入无尽递归……

hhhhh,后来我想了半天只得写了个 deferred Parser,因为构造的时候没法直接拿到循环的指针嘛…… 为了保证不空只能等实际用的时候才能断言需求已经架构好

有没有大佬知道,是不是怎么安排可以避免使用架构器外的 deferred(只是好奇)
终于完成了,欸
最后我写三个小程序,算是迫真完成:

1: JSON dump (prettify)
2: JSON2YAML
3: JSON path

然后这三个程序是这么安排命令行的(怎么莫名其妙用到了队列……:

a.json b.json c.json -dump
a.json -toyaml a.yaml
x.json -path $[0].name -path $[1]


[file...] -dump (-indent 2)
[file] -toyaml [new file]
[file] -path [path...]

然鹅,JSON Path 我还要再写解析器…… 不要哇,递归解析器很虐的(莫名感觉)
我以为利用 reset 就可以解决不应该的可变数据生存周期的问题,其实我错了,我真蠢,真是太脑残了。 现在这个样子递归解析也没有用是多可笑啊hhhh
弄一大堆 branch 性能本来就有待优化,还弄什么「finish」「Folding.Effect.reset」,还弄什么 Feeder MarkRest,真是多此一举;我都忘了自己要写 MarkReset 干什么
duangsuse::Echo
Photo
以上输入,反正就是只要有递归的情况,Box unwrap 全部会莫名其妙错误,我真是哔了狗了。
java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.jison.Json

然后你调试看看,就会发现其实错误是在(目前因为没有特别处理 Parser 的格式化和完整面向对象建模,就是快速版本的而已,所以调试起来很麻烦)

kvPair.joinBy(tCOMMA)
.then { it.toMap() }.surroundBy(tLB, tRB) then { Json.Dict(it) }


//...
seq(partialList(1,4),
ws, string, ws, tCOLON, element) then { Pair((it[0] as Json.Str).literal, it[1] as Json) }
seq(snd, ws, deferred { scalar }, ws).unwrap()

在这里,element 的解析结果以 selecting(1) 折叠居然是一些 spaces(ArrayList)!所以 1 难道不是永远代表 deferred { scalar }?莫名其妙,真是莫名其妙。
只不过是因为某个 selecting 的实例被递归使用了而已,所以就被破坏了,明显是作用域没想好,这种烂代码还有什么可以说的呢?
https://t.me/ice_learn_agda_internals

不愧是冰封哥,一天(大概是他在地球对面)时间就发了 47 条消息广播
这个频道居然是要重置 Agda???
……不愧是冰封