/tmp/duangsuse.sock
23 subscribers
303 photos
3 videos
92 files
337 links
从 duangsuse::Echo (@dsuse) 跟进出来的分支,将在作者恢复原帐号访问的时候合并删除。
Download Telegram
吾乃天命之子,無懼肺炎也。愛滋病一年死七十七萬之眾,人無少戴套,少幹也。斯肺炎死僅數百人,何懼之?愛情不到吾也,無論肺炎!吾年四時從三樓之高墮地,無死無傷矣,無論肺炎!吾窮,無錢買口罩矣,惟聽天由命。還請各人莫再反駁吾之淺見也!

我是天命之子,不怕肺炎。愛滋病一年死七十七萬人,人們都沒有少戴套,少幹別人。這次肺炎死僅數百人,為什麼要害怕?愛情輪不到我,何況肺炎?我四歲的時候時從三樓之高墮地,絲毫無損,何況肺炎?我沒有錢買口罩,只能夠聽天由命。還請所有人不要再反駁我對這次肺炎的意見了!
Forwarded from Deleted Account
Forwarded from Deleted Account
世界上就是什么人都有,会遇到非常正常
有些东西是根植与人的性格、感情里的,那些无法理性,但偶尔有这样非常不常见的性格也是不容易。

如果你劝别人一个东西,他说「知道,但感情上无法接受」,这往往可以理解
可是别人压根不回你,这就有问题了。尤其是上面这还是明显已阅但不正面回复的

联合国会把拒绝记者的“国家”定义为恐怖组织
#Kotlin #code ParserKt 的……至少是能用的版本
Calc.kt
921 B
支持加法和乘法的计算器
Parser.kt
26.7 KB
#Kotlin #code ParserKt 的……至少是能用的版本
Forwarded from Deleted Account
比如说 listOf(1, 2, 3).fold(0) { acc, x -> acc+x }
从函数式的角度,initial 和 accumulator 是变量、op 是一个闭包(在我们看只是函数),整个 fold left 在算法过程(面向对象的)里是一个循环
fun <T, R> Iterable<T>.fold(initial: R, op: (R, T) -> R): R {
var accumulator = initial
forEach { accumulator = op(accumulator, it) } //loop
return accumulator
}

从面向对象的角度,你也可以弄出一个『类』版本的 interface Reducer<in T, out R>,抽象出最关键的 accept(T) 和 finish(): R
然后就可以有 class JoinFold 把这个 initial, accumulator 变成 private val (私有属性),op 提升一层变成 this 上的函数(也就是方法)
就得到了面向对象版本的 listOf(1,2,3).fold(JoinFold(0, {this+it})
#Haha #Low #China #huawei 呵呵,这种自 high 都能做得出?
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (Yuuta | 武汉加油 | 😷)
https://t.me/himself_65/340

华为对苹果的最大一次胜利:日前,欧洲统一了手机借口标准,欧盟投票通过,未来在欧洲销售的手机都必须采用统一的华为口式借口(Type-C)。
谷歌对苹果的最大一次胜利:日前,欧洲统一了手机借口标准,欧盟投票通过,未来在欧洲销售的手机都必须采用统一的谷歌口式借口(Type-C)。
小米对苹果的最大一次胜利:日前,欧洲统一了手机借口标准,欧盟投票通过,未来在欧洲销售的手机都必须采用统一的小米口式借口(Type-C)。
戴尔对苹果的最大一次胜利:日前,欧洲统一了手机借口标准,欧盟投票通过,未来在欧洲销售的手机都必须采用统一的戴尔口式借口(Type-C)。
苹果对苹果的最大一次胜利:日前,欧洲统一了手机借口标准,欧盟投票通过,未来在欧洲销售的手机都必须采用统一的苹果口式借口(Type-C)。
非洲猪瘟也是中国设计的,没控制好而已 🌝
#NSFW 好像是 porn 群呢 @newsob
好了,Parser.kt 基本出山 🤔
Forwarded from Deleted Account
val dict = TriePattern<Char, String>().apply {
mergeStrings("hello" to "你好")
mergeStrings("world" to "世界")
}

val noun = Repeat(asList(), dict)
val pharse = JoinBy(Decide(elementIn('0'..'9'), elementIn(' ', '\t', '\n', '\r')), dict)

>>> pharse.rebuild("hello world")
res21: kotlin.String? = hello world
>>> pharse.rebuild("hello world a")
res22: kotlin.String? = null
>>> pharse.rebuild("helloworld")
res23: kotlin.String? = hello
>>> noun.rebuild("helloworld")
res24: kotlin.String? = helloworld
>>> noun.rebuild("hello world")
res25: kotlin.String? = hello

>>> pharse
res19: JoinBy<kotlin.Char, kotlin.Char, kotlin.String> = {Path{h=Path{e=Path{l=Path{l=Path{o=Bin[你好]{}}}}}, w=Path{o=Path{r=Path{l=Path{d=Bin[世界]{}}}}}}}([0-9]|(' '|'\t'|'\n'|'\r'))

>>> pharse.read("hello world")
res20: DoubleList<kotlin.String, kotlin.Char>? = Tuple2(first=[你好, 世界], second=[ ])
Forwarded from Deleted Account
这次的解析器框架是纯 one-pass 的,靠 Contextual, Peek, Pipe 的组合完成附加的处理过程,不存在 mark/reset 和 k>1 的情况,但完全可以兼容那种好像需要 lookahead 的情况,所用的数据结构更贴近编程语言而不是一些栈和自动机。

框架的 Pattern<IN, T> 是全泛型、面向一切序列(Iterator、InputStream、Slice也即List、Array、CharSequence)的,这意味着你甚至可以用它抽提反射元数据或者 Array<out String> 里的信息

为了方便测试以及一些其他的考虑,解析器框架不止负责数据的提取,还负责管理提出的数据,并且能够(允许在修改变动后)重新把它们架构回输入数据(rebuild),这可能是比较独特的一点——其他方法都仅仅只有提取基本值的解析器,不包含对提出数据的建模,但 ParserKt 利用 Tuple 和 Fold 两个扩展完全包办了整个生命周期。

就错误处理方面,ParserKt 的 Pattern<IN, T> 返回 null 代表解析失败,目前支持的错误策略是 ErrorListener { onError: ActionOn<Feed<*>, IN> } 和 clamWhile(pat, defaultValue, message),对输入的扩展方法,大家都知道的,随便里面分配个 MutableList 引用加给 onError 闭包。

行号当然必须支持啊,就是 Input<T> 的扩展 CharInput 有。CRLF 也是可以计入的,也就是说 Kotlin 实现语法需要的特殊处理,也没问题喽。

而且提供了一个简单、带注释的中缀解析器实现,以及字典树(方便解析关键字什么的)

代码里有用到 Kotlin 的 intersection upper bound (在 extension fun 的 receiver 里)
@UnsafeVariance (Seq 和 Decide 的兼容)

感兴趣的大佬可以看下
同样的东西,这是我写的第十遍。
Deleted Account
val dict = TriePattern<Char, String>().apply { mergeStrings("hello" to "你好") mergeStrings("world" to "世界") } val noun = Repeat(asList(), dict) val pharse = JoinBy(Decide(elementIn('0'..'9'), elementIn(' ', '\t', '\n', '\r')), dict) >>> pharse.rebuild("hello…
val ints = Seq(::IntTuple, item(1), *Contextual(item<Int>()) { i -> satisfy<Int> {it>i} }.flatten().items() )

>>> i.rebuild(1,2,3)
res1: kotlin.collections.List<kotlin.Int>? = [1, 2, 3]
>>> i.rebuild(1,2,1)
res2: kotlin.collections.List<kotlin.Int>? = null
>>> i.rebuild(1,0,1)
res3: kotlin.collections.List<kotlin.Int>? = [1, 0, 1]

val xsv = JoinBy(elementIn(',',':'), Repeat(asString(), !elementIn(',',':')))

>>> xsv
res1: JoinBy<kotlin.Char, kotlin.Char, kotlin.String> = {{!(','|':')}...(','|':')}
>>> xsv.rebuild("adadc,dasda,de")
res2: kotlin.String? = adadc,dasda,de
>>> xsv.read("adadc,dasda,de")
res3: DoubleList<kotlin.String, kotlin.Char>? = Tuple2(first=[adadc, dasda, de], second=[,, ,])
>>> xsv.rebuild("adadc,dasda,de:dasd,fsd:f") { second = second.mapTo(mutableListOf()) { if (it == ':') ',' else it } }
res4: kotlin.String? = adadc,dasda,de,dasd,fsd,f
又新加了个 elementIn('A'..'Z', 'a'..'z', '0'..'9') or elementIn('_') “逻辑连接符” 支持