/tmp/duangsuse.sock
23 subscribers
303 photos
3 videos
92 files
337 links
从 duangsuse::Echo (@dsuse) 跟进出来的分支,将在作者恢复原帐号访问的时候合并删除。
Download Telegram
Chevrotain is a very fast and feature rich JavaScript LL(k) Parsing DSL. It can be used to build parsers/compilers/interperters for various use cases ranging from simple configuration files, to full fledged programing languages. 我就不说什么了,没啥学术气息、接口又混乱,到处乱用 {} configure object,还是传统的 lexer-parser 架构。
Bennu is a Javascript parser combinator library based on Parsec. The Bennu library consists of a core set of parser combinators that implement Fantasy Land interfaces. More advanced functionality such as detailed error messaging, custom parser state, memoization, and running unmodified parsers incrementally is also supported. 这种框架就不是为了给人用的,主要还是为了让作者能弄一些非常高大上的函数式数据结构弄的。 val aOrB = elementIn('a', 'b') //item('a') or item('b'); aOrB.read("b")//'b'
/tmp/duangsuse.sock
PEG.js is a simple parser generator for JavaScript that produces fast parsers with excellent error reporting. 可惜就是参数名黏糊了一点,不能体现重点。
以上我把许多同类框架/工具/库 都给得罪了一遍 🤪
得罪得真舒服啊

其实 ParserKt 和它们大部分框架都不在一个思维频道上

如果你试着把一些框架的代码移植到 ParserKt,而不是直接从语法的角度重新设计,你可能会发现自己写了很多错误的置换,
因为 ParserKt 完全面向对象设计,Pattern 就是高复用代名词,用 Pattern 和 PatternWrapper 和用一些很基础复用性灵、活性很低的 组合子,思路完全不一样。
This media is not supported in your browser
VIEW IN TELEGRAM
/tmp/duangsuse.sock
[duangsuse@susepc pkt_9]$ kotlin Arithmetic 1 + (2 - 3) + 4 + + 1 (- 2 3) 4 = 4 [duangsuse@susepc pkt_9]$ kotlin Arithmetic 1+(2 - 3 + 4 null = null [(<stdin>:2:0#13, expecting ')' (from <stdin>:1:3)), (<stdin>:2:0#13, infix 1 parse failed at +)] 又拿 ParserKt…
ParserKt 现在的代码简洁性已经蛮够了,用来实现各种解析器/REPL 都不是问题
因为解析器框架本身很具有复用性,现在又有了 LexicalBasics 对其复用性的利用
/tmp/duangsuse.sock
Waxeye is a parser generator based on parsing expression grammars (PEGs). It supports C, Java, Javascript, Python, Ruby and Scheme. 我唯一看得上眼的工具,可惜在文档上还是略微欠缺了些。
可惜 Waxeye 是工程系和学术系表示法的杂交,虽然支持的目标语言多而且也算是蛮工整,
那个又 bash 又 Haskell 的语法规则,我真是一些不懂。
Forwarded from Deleted Account
三种方法,既能让某个“悬浮窗”对象独立于插件的 static root 或至少不泄漏 Context,又能保证所有事件里能引用到这个对象

泄漏和不泄漏,其实就是时间(生命周期)和作用域(可以引用某对象)的问题。
作为一个扩展,泄漏当然会和宿主的使用方法相关。
Android API Platform 对 android.content.Context 的限制也是可以理解为『宿主(系统平台)』对『扩展(应用程序)』的限制的,这个根本的限制就是,Context 不应该是 application-level 的,而是由类似 Activity 的任务启动时由系统提供的。

不说一些很玄学的问题(比如说弄个 static List<Context> 或者在别的线程操作 Context、把 Context 到处传这样)
比如你要 setXXXListener,我们所需要唯一的限制,就是这些 Listener 实例访问到的 Context 必须是 valid 的,这个容易。
不然就无法保证某 Context 存在的时候,它代表的组件也实际“存活”,仅说 Activity,先存某活动"A"的引用,退出稍后再在另一个活动"B"里访问存下的 Context,整个应用的虚拟机可以复用,但是 A 的句柄却失效了,这就是泄漏问题(也不完全算是内存泄漏)。

模型是 线程(只需暴露出类似 Executor 的代码执行资源)、服务(和线程差不多、接口也差不多,但可以直接封送对象协同并发工作)

1. 只要提供 onDestroyPlugin,利用 /*static*/ var ctx: Contex? = null 就可以在插件移除时保证 Context 不再能被访问到,缺点是这种做法对 lint 不可见

2. 利用 GC 细化封装对实例的依赖(所有依赖 context 的操作和 val ctx 封装成一个类,甚至利用 inner class)
插件的实例保留 Context 量,并且提供所有事件和扩展的 handler,只要应用不再需要插件则对应的 Context 也失去了所有引用

3 . 利用“singleton”的 Service 保留一个 context 引用,在插件移除时候终止 Service,可以保证不会泄漏引用的单实例。
实际上是利用插件和插件Service 1:1 的数量关系设计,而对引用本身依然保持在某种 Runnable 的 object instance 里,但那就和主要的 app_process 的 static root 隔离开了
/tmp/duangsuse.sock
https://pokfulamhku.com/whfy/ #China #Low #recomended #statement
“国家好、民族好,大家,才会更好。”
Forwarded from Deleted Account
哈,我又把 不区分大小写 这个封建余孽给加回来了……
ParserKt 已经维护不下去了,我对自己的代码尤其是 typealias 出现了严重的信任危机
现在极其需要项目管理和构件工具的帮忙
Forwarded from Deleted Account
gradle 卡 kotliln compiler 下载,一直没法过
Searched in the following repositories:
Gradle Central Plugin Repository
Forwarded from Deleted Account
墙也越来越大了
Forwarded from Deleted Account
Gradle 终于开始下载了,还是我 pacman -Syu 以后才能下载的,之前都直接卡死在 select() 系统调用上
我去 gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 了 Ali 的 proxy
不对,这个不是阿里的
我开发的动力终于又回来了……
热泪盈眶,终于又有了开发的动力。
好思恋 Gradle 这样的 增量编译啊
世道要变了 (《平凡的世界》里某傻子常说的话)