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
>火之魔女: 不过unification我是想写好久了(应该按年计)但是一直没写的( https://github.com/duangsuse/mkey 写过,不过落后很久了 #sql 这算法就是 unify(a,b); unify(a,1); unify(1,a) 得出 a.v==1==b.v reify([a]) 解引用一下=[1] ,其实也挺有趣,包括npm也在牵强附会这玩意,真让人搞不懂从哪看的 http://minikanren.org/ 使用了一个自有的def: yield 实现,对 a&b…
#OOP #plt 学点设计模式
https://iota.huohuo.moe/OO-in-C.html#:~:text=一种设计模式对应一种语言特性%20%20By%20千里冰封

函数式人有许多「过度设计」,例如美 kotlin.Any.let 其名曰 #FP Functor.fmap (Arrow-KT.io)。这种(私货+算法)的泛滥,给IT带来了灾难,让许多初学者不明觉厉,也当然不能提升其应用能力(毕竟只是"指针别名"嘛)
https://kotlinlang.org/docs/scope-functions.html
https://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

但OOP也有自己的“私货”——用于弥补语法不足的“优雅的”设计模式
例如 Builder,Utils,Adapter,Delegate.. 它们是对this参数、对interface扩展不够灵活的变通

这个长文,我会用短 #kt demo 让大家看到 refactoring.guru 🐿收录的10种流行 Design Pattern 掩盖了哪些语言特性的缺失
以及科普"OVDEP" Observer Visitor(深先iterator) decorator(单参compose) EitherAB Proxy 等不逊色于箭头函数的,超越语言的优秀工具

## 创建性-Creational

这些模式是 new 构造器() 的变体,在Rust里被 fn new=Pair{A:1, B:2} 构造字面和 impl T for T1{} //mixin T1: T 混入取代

1. StructBuilder

有一个很长的SQL row需要new,可以使用默认值,插入前也有检查

class RwCol2<A,B> {
var A:A?; var B:B?
constructor(x:A,y:B){A=x;B=y}
constructor(){A=null;B=null} //默认值
}


我们把构造器中A=x;B=y; 拆成 newThis.A(x).B(y) 两个函数,就能实现初始值的解偶
填完数据可能要验证,如编译期验证不可变 fun build()=this as Col2

与它对立的是默认参数
RwCol2(0,0).apply {B=B+1}.B; buildList{} this参数上扩展 apply(T.()->*): T
K2 value class{init{}} 也实现了构造后验证,不过大部分人仍在使用专门的反序列化和data verify框架

2. (Abstract)Factory

常见误区是,Factory类似 Pair.of(1,2) 是为了重命名掉new,或者只把构造器集结起来: doc.createElement("div")
安卓 content.Context 与Button等View(ctx)的关系更像工厂的本意: 基于(操作系统)上文验证和保留数据

interface DataJVM {
fun <A,B>List(a:A,b:B): Pair<A,B>
fun <T>List(vararg x:T): List<T>
}
val kt=object: DataJVM {
override fun <A,B>List(a:A,b:B)=Pair(a,b)
override fun <T>List(vararg x:T)=mutableListOf(*x)
}
//val py=object:DataJVM{}


与它对立的是全局对象、元类trait。
全局fun弥补constructor钉死了 open fun 且难于校验的问题。当然!它也消灭了 object Singleton{} 和“双检锁”的样板
元类允许了 static (类名上)接口,而不是让可覆盖的函数代理一下构造器:
https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngineFactory.html

3. Prototype

Linux对pwd等环境变量的fork()是最著名的原型模式,这使得父子进程间有了T1继承T 的关系
JS里 {} 等价于 {__proto__: Object.prototype} 函数表,函数表也可以随时添加继承。有 new.target 的构造函数()只是设置原型+赋值到this的简写
一切皆对象,除了 Object(1).valueOf() 里装了又拆箱的1。无原型的,只有更慢的 Obj.create(null)

data class 会自动实现 fun copy(),但它不能继承,因为无法拷贝父类的变量。Java里很难把对象加构成更大的子类(除了 inner class)
sealed class Box<T>(val A:T) {
inner class Pair(val B:T): Box<T>(A)
}
val x=Box(1).Pair(2)


按道理是x.A=1,那么Box(1)单例就是这些Pair的原型
批注下 初识 部分求值 与 二村映射 https://zhuanlan.fxzhihu.com/p/731295566 @ https://tttttt.me/c/1441156260/47884 #plt
看了一眼题图…… 确实,你的 mix(f,x0) = f.bind(NO, x0) 还真表面化

至于拿这个写解释器 --本质上=支持arguments[$局部]的 enum DSL{N(0),Op('+' DSLx2),$(1)}
我在 https://tttttt.me/dsuse/19868 用=>取代override eval()或Visitor{tr(ee:X)..}写了个10行

应该说,类似把call序列化成data的技巧,不仅在Redux/Flutter/ https://elm-lang.org#:~:text=THE%20ELM%20ARCHITECTURE 里到处都是,
还能成为C文件或socket格式,比如ELF段和节,这就是一种JIT内存转储的模式,是解释和编译+VM间最直观的联系。用模式匹配特化 template<> 内嵌sizeof更是成了烂代码

以下内容就很乱了,像原文。
def search(ks vs于调用 k于引数): 所实现的 LinkedMap……这甚至连LexScope都没解析,比如哪些是new Func(捕获的绑定)哪些是global

参数可以无序…… 拿partial(f,k=v)换bind
第一类二村映射 T=L ,也就是reduce(T=>T.bind要有效, L) 呗,template<> 就是

src=defs+exec+lits
interp.bind(src).call(data) = compile(src).VM(data)
第二类 C2=binderVM.bind(interp) 哦,所以M=jvmbc mix(mix)是元循环VM?
第三类 算了,感觉就是拿 template<> 编译期递归,牵强附会 compiler_generator 这些术语。 我们知道“元编译器” yaCC 比 PEGgyjs.org 是更弱智的,所以高阶高阶有啥升级呢。

读两遍就看出个 VM=interp.bind->call 然后bind是jvm等格式能元循环,我有点看不懂,能把你的主旨放前面吗?

其实,程序=语意的组合,编程=自顶向下求优。
看你一篇花体字,感觉是能生成jvmInJVM,部分求值bind几个常量能加速10倍我看不出来,
如果 f.bind(expensiveX0()): (g) timeit: g() 能算优化的话,这是比g:RPC协议还多余的文字游戏
#plt #tool 果然有人把 XML CSS 推广到任意 tree 的 grep 替换了
ast-grep's core is an algorithm to search and replace code based on abstract syntax tree produced by tree-sitter
https://github.com/ast-grep/ast-grep/
Manjusaka 的碎碎念(以及摇曳露营 S4 制作确定!)
https://github.com/rui314/chibicc 安利个东西,这个库用核心 6k 行左右的 C 语言实现了一个完整可以自举的 C 编译器(编译 git/sqlite 也能过测试), Commit Message 写的非常牛逼,每个 commit 都是一个完整的 bug free 的功能叠加。有兴趣的可以看一下
https://www.fxzhihu.com/question/544124280/answer/2587927808

#plt #ce tcc 8cc c4 . 虽然 C 类型不是内存安全/心智模型合理的设计,但这个日本人很厉害!
Notepad++ 是一个台湾人写的,也可以说是工匠精神 #dalao

在粒子加速器领域,绕不开一个软件:TRACEWIN,这是美国人开发的。追踪粒子在电磁场下的轨迹。

是怎么开发这个软件的呢?他们没有立项。没有想突破封锁。 只是某天3,4个行业内都不出名的研究员看到了一个amazing的粒子路径追踪公式,

在维持原有工作的情况下!历时数年,根据同行们的贡献协助,
仅仅因为一时兴起,美国就多了一个能垄断一个小行业的软件。
把人当人,而不是资源!人会创造,资源不会!

我们对标的软件应该叫TripleWin 😎
嗯,“到各个985高校抽20个数学教授,20个物理学教授。再来几个程序员”
#ruby #plt Quine 编译接龙 https://www.fxzhihu.com/question/30262900/answer/47877068
https://www.ioccc.org/2012/tromp/hint.html #fp lambda 元循环 解释器(https://www.zhihu.com/question/30262900/answer/49589781
Quine(蒯恩)一般是指能打印出自身源码的程序 _='_=%r;print (_%%_) ';print (_%_)

IOCCC,全称The International Obfuscated C Code Contest (国际难懂C代码大赛),顾名思义,是一场比谁能写出最“让人无语”的C代码的比赛。

btw. 同问题下有个 Shadertoy.com 类的C++答案,太丑了,把 vec3 拆成了RGB三个函数,代码重复率爆炸

还有两个中国特有的:
curl --connect-timeout 1 https://google.com 2>&1 >/dev/null &&你在中国
body.contains("的")? "UTF-8":"GBK"。 \u{E79A84} 在GBK是鐨殑,很罕见
duangsuse::Echo
纯sdf, 顺手移植了一个给 numpy+tty 花了1小时吧: cv2.open(mode=HSL亮L).降采样为(stty size) mix(256色到" .*#"色) .追加\n列 .光标到(0,0)print 我用了比yes命令内存效能低的join'',但也不打紧 #performance fwrite() 就像CtrlV,要打'y'*500你是粘贴五百次还是多复制、缓冲? 把rows('<U1').buf分隔复制到 int8(w*h+1h),按帧yield给/dev/pts/0管道更省 若一开始就…
看最近几条逆天,我要聊哲学 #CS
操作系统不就是4片3口虚拟化么
时间内存存储程序,网口线口板口 #os #plt #embed #recommend
win,*nix,mac, aosp ios ;哪个不是只有这么点API和差异化 🦄?为了音视频和回应事件弄那么多框架外链新语法,不如3行 #web js。
bellard.org 那样的通才终究少数,搞出\0结尾无长度字串,连{}[]{type:}都没建模的libc算什么API啊?在位运算位flag上都被人打败 也配教人数据结构算法? 。 为这撒手掌柜的「千年虫哲学」服务的「编译器和OS」……

"It works"的「千年虫哲学」出现在4byte的13位时间戳、在'\0'结尾的CStr、在argc和snprintf等“最佳实践”、在将'❤️'算作2字符的JS和JVM(UCS-2的伪utf16)、在线程被窄化为while(1);join和各种设备信号的“同步IO”里 —evpoll为何不是默认呢,就因为C没“回调值”,轮询pull>推送onpush? 千年虫在几乎所有让你不分昼夜却不得要领的「术语」里……

时间片sched - 变通while(true)的死机, kotlin/go func 怎么不需要这些? numpy,GL 为啥不需要循环向量化?
内存片vm - 缝补struct{{}} Rc状态树, 缓解(编译期)检查缺位的骇客 enum { A(int) B(str) }, for(i:0~9)a[i], sql select${x}+1, scanf%s
存储片fs - 分簇存bytes&CoW复制断电不断写
程序设置依赖片elf,apt,regedt - 硬编码各种rc,ini和/lib/.so.版本 🤮,各发行版树格式不通,make系统ld.so优化一堆,却连 live compile/fatJar/minify 抖树都不懂……

网口tcp,ssh 双管道(socket), pipe闪存读写(等buffer就是等yield)
线口usb 注意方口圆口转接,通用的
主板口pciBus 安卓的dts
>__线程调度内存隔离、文件设备(fat32,ext4,IRQ)、 IP网络和并发工具(IPC,sem,mutex)__
>如果一个人写了线程池或malloc()或ELF文件链接器,声称自己写了操作系统 是可以的(GNU不就是)……

凑以上这些字数干嘛? 时间内存存储程序--片,网线板--口,就这么简单。 把双管道快取翻译成「套接字缓存」是啥逆天专家
OOP封装/多态实际上解决了 libc vm 化进程的问题,JVM,NET只需要查数组或union的越界,没有“syscall给驱动”,因此跨平台,何来segfault?顶多送个内存片swap和热更新热迁移(混合睡眠/分布式fork),做好函数间互相jump; yield(闪存或typed)的“IPC”。

IO? 直接说ip+fs 分片传输吧,检测点击长按、解码HDav到PCM也没见内核态自带啊,外设和性能也不必突破一切皆文件。
ip实际上靠http。纯socket没?args长度没返回MIME类型 ,URL就平替了 env key=v PATH/git/add-command?k1=v1#.mp4 .wav; 实现共享
ip和sh命令一样,带参数单文件而已。ip还附赠跨语言扁平读写(REST序列化)。 stdout本该可直接 print Blob(bytes,MIME);而stderr是loglevel变量,没意识到这让log4j竖子成名
用过 nc;curl 管道和GET,PUT都知道,http函数模型比sh优秀,实际上WebAPI/py调包远胜于UNIX。PJAX调用/PWA就是一种“上文切换”、IPC、/{etc,usr}软件格式

时间内存存储程序,网口线口板口,4片3口虚拟化 😊
逗号左半,pyjs javacs rust 包括C作者自己写的Go啊 Docker啊,哪个不比libc+Linux强, uv(vs ^CSIGINT或evpoll?) jemalloc(闪存0copy和0flush) psql redis/flatpak
逗号右半,Bun.js ip栈封装; WebUSB; Arduino; 各种图形界面设定,很简洁,一到hwinfo“元数据”就乱搞,像fastjson大师修注入似的。凑字数?给骇客留空间!
包括那个 ld.so 可绕过的chmod +x ,多用户真的比多app容器+人均root有用么? OS竟敢不按devs的喜好来部署。
《程序员的自我修养》大概比较了COFF对象的这几种分支,PE,ELF,甚似于apk。常量池.rodata、全称名mangle、字节码动态链接、菜单图标、自带资源树和签名,比之C++ 对象,不能复制修改,无虚表原型,无双指针框定类型,不线程局部而。

也就是缺个二进制 databind 写冷门硬件的“驱动”,不过那也无所谓,ASN1式的屎山只能像zig那样,自动C2zig
有人说用户态不够,memsafe 后还需要调度器呢。 谁要那个巨无霸4K起步的 struct task/PCB{} 啊,还有上文切换开销。画蛇添足? Lua, 2KGo, NTFS和安卓的FUSE, numpy 真多核……从API从源码开始做优化,删掉无意义的设计模式,四海皆效仿,才配叫编译器和OS!

我半年前1k阅读的稿,也是这样 libC sucks 的观点 https://tttttt.me/dsuse/19854
淫王也这么想 https://www.yinwang.org/blog-cn/2019/08/19/microkernel#:~:text=一个操作系统本应该
1🦄1
#plt #typing infer https://zhuanlan.fxzhihu.com/p/634217295
https://zhuanlan.zhihu.com/p/712419355

今年8月发的。其实猾为内部还是有支持一些不那么抽象的知识分子的。 我觉得讲得比某些知乎大佬简单明白,
这方面靠中国的社区文化,还是不如真专家讲,该推荐还是得推荐。
https://github.com/KaiserKatze/mathematical-notes/releases/download/20230921091555-64ca8d4/default.pdf

1.3k页我的天 大概是这画风 🤔 #math #plt
算了也懒得看

正反函数在SQL和{k:v}里用更多

这个人还写了个 javac 的反函数(笑
https://github.com/KaiserKatze/Cruiser/blob/dev/code.c#L1049-L1985
https://github.com/KaiserKatze/Cruiser/blob/dev/code.c#L1884

不过代码质量堪忧,只是把JVM字节码的语意都换成printf,并没有检测if while{} 基本块的部分,就花了2.5k行……
他在近2k行抱怨了一句, i'm driven insane! how should i work around multiple blocks? ,嘛,看这README也不像动笔之前自顶向下调研过

虽然只有十个文件,但每个都是代码查重率爆棚的…… 复制粘贴一般。 可见不重视知识整理,我不太喜欢。

https://blog.csdn.net/dnc8371/article/details/106704927 CFR作者讲得挺好的,他们是以 ifeq goto 这些切分,拿箭头链接出 CFG,这反而是数学拓扑的天地啊? 💭
q==0? A:B; C 和 if(q)A; else B; C 和 q&&A||B 编译为 q true (ifne B:) A (goto C:) B C: ,这也就是&&和& 的差异
while(q) A; C 编译为 q (ifnot C:) A (goto ifnot:) C: , 比较简单的做法是遇 goto(i), bc[i-1]==goto(j), bc[j:if_]=iWhileCond ; goto(i), bc[i:goto] 可能是if{}

总而言之,作为开发者,突破信息差的能力比数学重要
#PLT #statement https://zhuanlan.zhihu.com/p/643694771 Partial Evaluation: Staging

MD 怎么越来越水了,一个允许指针字面然后 run(e)= e.Lit or eval(e) 的普通 深先改树(CS:树的后序遍历/SDT之综合属性),故意混上点Mod意义运算写成非常冗余的实现,说成部分求值……那A=>inlined (B=>A+B)算不算呢?
想到之前的 https://tttttt.me/dsuse/17422 ,那个作者才配叫函数式

https://www.zhihu.com/question/394259343/answer/1225181671
>
每天一本正经说「XXX极为基础」「暴论」,结果自己? 写的那个老太太裹脚布一样的文章,夹杂着莫名其妙的 infinity inline terminologies 😅 ,毫无自己的理解、设计,拾人牙慧,鱼目混珠, 自己推荐的「大佬」还都是英文的知识碎片,没有点pratical+usable的美感,别说语意化,甚至连需求目的都是空中楼阁, not even wrong 。
演艺圈有不少「冻龄人」,成就永远锁在走红时,而这位ACGer大佬,将成为「冻领人」, 他不想让有血有肉又pratical的概念入侵PLT领域。这个是许多领域的常态,比如被“区区一位”Wolfram 重构的Math, 百年历史群星璀璨又如何? 后生可悲。
我不希望CS和这种Math并列。 他们身上都能嗅到死人味,但这是他们为吃老保有意为之。 我不希望国内CS领域少得可怜的新人,为缝补各种考古学“僵尸” 空耗宝贵的创造力,CS和IT从不是什么夕阳行业,更不是需要考验内卷的反人性的玩意儿。

- 😄:我敢说国内80%的FP乃至IT理论人追求的就是这种「不明觉厉感」,你真抽丝剥茧,他们便散了。 “纯”就像Rust那样给你画了个饼,一旦你搞懂后却没有能写真东西的灵感or需求来,又丢了当白象成就感,这种信息差的杠杆便崩塌了。更无语的是,这是阳谋。 我的工程师文化,并非套人套现自己润的庞氏泡沫学。 熬夜和烧脑就是负资产假本事,科举4ky 呦搞出四大发明的祖国人心里不清楚吗?

您安心从OI生、PLT设计人、元编程架构师、AI PHD 选一个当不就好了,说文解字时纯粹一点吧,非得在那里东拼西凑凹人设, 偏偏国内还都是这类「高知」在主编大家的「冷门」技术。 自己把水搅浑了,现在又说PLT用处多多,还看不起ReScript之父张宏波“不够纯函数”,这就和董宇晖当着网红批网红一样,装腔作势看人下菜碟的样子,很没品。

我突然觉得yinwang、张雪峰老师收点生活费办事,是非常仁慈和负责的,明码标价,不浪费您的时间和热爱,works的真实且真诚。 就像Rust的复杂度和cargo比之C++,居然是很大的进步,极大打击了template规则和cmake的黑魔法师。 谁问您们的大导师教什么了? 私货满满的东施们啊,你们几时虚心传播所谓原汁原味的「科学」了? 你们对真理没有信仰。 不工程,更不计科。
免费的,还真是最贵啊。

>我跟江浙那边的企业一聊起产学研结合,他们异口同声地说:我们被教授们骗怕了。

……
- 🤓:对了,😄你又不是nerd专家,没黑框眼镜,为啥抢在我前面当「语言律师」
- 😄:那我是freak,看我的头顶。 不用高知的口吻,就不会说话了? 知识就是知识,不要用别人的对错,搪塞自己的取舍和求知。 #码哲
- 🤓:原来,我们普通人和Lua的作者一样都是「天材」。学者生而平等,只是有自己的个性选择;这无关对错,而是旧知和新知。 我们不需要靠圈子的符号来包装自己,成为他们的复读和附庸。 失口为知,不失口,怎始口?
- 😄:往常,我是说往常,知识不能被1:1传达。这种变异若是“天”择,便成了八股和鄙视链。 这种变异若是人择,便不成功,也成人之美。 没礼貌者,正是对前者:我认真理,我不认真。 我不当[套子里的人](https://www.thepaper.cn/newsDetail_forward_15633677),不说套子接的字的句柄。它是双管道库启。
- 🤓:长衫可以脱,这熬夜攻读和刷题的烙印,咱简中人没法破茧而出。我那么刻苦,按Lua三作者的源码一词词摸索赏析,你随便一句「真理不认真」就把我的天才赶下神坛。 我和那三人资质一样,我却写不出Lua吗?我心理该如何平衡?
- 😄:对于无回报的努力,我们总说「天才」「运气」来给自己上价值。仿佛学鸟了,从吃灰的书堆里挑一本,便成了暴发户;却实在无休无止的“刻苦”中搞丢了自己的天材,赢了比赛,当了人牲。 Dijkstra说,他不懂为何简单与美的算法都如此高效? 或许我们该用[「经济」的直觉算法](https://tttttt.me/dsuse/19978)投资学习、分工、挑选、联合,在务实与务虚间找到坦荡与平衡。 别学晕了自己,也PUA捧杀了别人。
- 😓:其实…最正宗的工程师文化是「有头脑,更高兴」。


我想,作为预备的优秀程序员,我许下的心愿不是「知其变,守其恒」 这样空洞的天下大事
仅仅是「穷其变,知不穷」,让CS为我自己的美丑对错服务一次。
软件工艺,如果是本本主义,为人本精神服务的化简工具和范式,又何必存在?
我认真理,我不认真。——2024/11
👍2
😓 最近头疼死了,自己都跟不上自己设计的进步。 就拿序列化为例,之前我用 TrimLits+Imp[T](TParam..) 模式,它这样编解码 Pair(A:str,B:int)

.:
Pair-A-B ["" 0]

.: Pair static
As: (Pair "" 0) #空可变实例
Types: {} #非sealed
Tvars: ["A" "B"]
Tr-it-key: key :. #重载
"A": it.A=fmt -Tr(it.A)
"B": it.B=fmt -Tr(it.B)

fmt: 线程局部 # 通过这种方法耦合json,ini格式
Init:
(TrimLits as Imp)[Pair]={this} #注册字典读写器

dump (Pair "老铁" 666)
dump-it:
#省略""转义部分
w "{"
TrimLits.typeof(it):
Tvars:(k)
wstr(k); w":"
Tr(it, k)
w"," ifNot1st
w "}"

load 同理,对sealed会要求首key是""或"type",直接从Types查到Pair这样的TrimLits元表
DeepCopy 则需要用PairT.As()空拷贝整颗树,然后zip遍历,通过 swp.reset; Tr(A,"k",swp); Tr(B,"k",swp) 来中介。虽然较丑,因为0拷贝比纯函数更美。

Imp的好处是, it.A=fmt -Tr(it.A, "") 既可以利用反射Proxy实现,也可以编译期优化,它很规范地兼容了泛型、trait impl{}和懒初始化
TrimLits 为我们解决了Java反射和序列化API的根本毛病,简化额外功能(如 val:List/Map)的添加,它其实是个Good Visitor

……
但很快,这种树遍历扩展到了AST(甚至RPC)上,改变了之前计划的,通过JSON编码简单函数(= 只包括顺序赋值&引用) 的RPC被认为是过度设计,甚至AST都不依赖dataclass来保存和传输了

此前,典型的DSL/AST如 !1 to !2 go Int::plus ,很明确,Int不是 enum Calc_union{..} 的成员,我们被迫 new A(1)+A(2) 这种丑陋的Tag:


//请您建模算式1+2 ,实现求值和rustfmt
interface Goes<out T> { fun go(): T }

sealed class Calc: Goes<Int> {
/* A literal */
data class A(val n: Int): Calc() { override fun go() = n }
data class Op(val a: Calc, val b: Calc, val op: Int.(Int) -> Int): Calc() {
override fun toString() = "($a ? $b)"
override fun go() = op(a.go(), b.go())
}
companion object DSL {
operator fun Int.not()=A(this)
infix fun Pair<Calc,Calc>.go(f:((Int,Int)->Int))=Op(first,second,f)
}
}
val c = Calc.run { !1 to !2 go Int::plus }
c.go() //3


别忘了Java里一切本来就是Any?,Kt的enum Result{Ok(T),Err} 都显得非常多余。
但有了Tagless,一切自然多了:

interface Calc<out R> {
/* A literal */
fun A(n: Int): R
fun Op(a: R, b: R, op: Int.(Int) -> Int): R //toStr只将op查成"+-*/"
}


「学院派」Tagless 虽然直球好写,仍无法替代data class AST 在内存外存的复用性。 (某乎 #PLT 称其 Finally Tagless ,其实是误读,人机到 pointer tag 都不解释把自己绕晕了,呵)
(当然,R=()->Wtf 都是可以的,abstract nonsense。 https://iota.huohuo.moe/FreeMonad.html

很简单,用pickle那样的反序列化栈包一层,遍历时生成 1 A 2 A :+ Op 即可二次遍历,省去了OOP的极大麻烦。 别说懂GADT却连逆波兰都玩不转。
实现上只需 open class TagienumCalc(val ops=生成至..){ open fun A= } , parser("", Run); ops(Run) 用法相仿,便可同时解决AST序列化问题


TrimLits:Imp 对我来说是比反射方便可信的ABI, Tagienum 涉及的可能性却太大了:
既然可以记录函数调用树(而非简单的vararg&kwarg),为何不转义出bash函数的 $1 $2 .. 参数,约定 十一Xノ 这些operator,约定类似BEncoding的高效能格式,然后直接用于跨语言RPC? 序列化光搞状态管理太蠢了,复用是理所当然的。

这俩兄弟的原理都很简单,数组状广义AST的挑战和陷阱却非常多,我不希望听从「Talk cheap show me code」搞出不够本的设计后,再去拍脑门子改API 2.0 3.0!
尽管如此,这几个姓T的是我在研发编程范式里「数据类型」届的首席

>
关于JVM序列化器&验证:并不是所有XML都容易表达为JSON,例如没几个人认为html <div k=v>.. 该表达为 [{type:div, k=v, }, ...]
这倒是有个ABI设计,可以支持泛型和多态子类,而且不引入Encoder这些概念
form格式化的问题应该是 inline class 的本意,不知为啥Kt没有考虑验证语法这种问题
按道理来说,你可以Unsafe loaddump任意field类, Gson就是
py的pickle也有RCE问题但没这么业余 外面input()一个类名你就new它, what's wrong with u?

如果您有它俩满足不了的demo情景,欢迎私我讨论,尤其是Tagienum
>虽然有点不礼貌, 螺丝能不能接受我吐槽下。 你们对玩元编程的minimalist,为何敌意那么大。 #life #dev #statement

@yihong0618 在X上看见几个HR在写1hr 黑客松 json parser ,我去解释了下原理,说了这个: https://tttttt.me/dsuses/5352
我的语气是很普通的,自问没什么,日常技术交流而已,我甚至还编辑了comment里的错漏。
我最后说,难不难取决于多余的工作量,这是因为,在国内 #PLT(编程语言设计) 领域,大量demo都充斥着让你熬个通宵的无效算法,单就json.loads而言,确实不会超过100行。 我希望PLT(大学编译原理)潜在的新人不会重走我的老路,而是能更加自由发挥,不被任何技术栈吓住。

很快他把整个post都删了(幸好在drakeet事件后我已懂得资料备份), 过两分钟,拉黑了。 前者我是能接受的,或许贴太长了—尽管Yi转发 https://tttttt.me/dsuse/19854 时那才叫长

我大概能猜到,Yi对「玩元编程的」已经PTSD到,连我出于善意☺️ 指出一个demo,都觉得是在贬低别人的程度了??
我也知道,Yi并不在乎「我的领域」能创造多大的价值。他是否只是想用「小众的东西eg.BPF,PSQL」装点自己呢? 容我说句,这对真正在本领域用功的人,而非仅仅贴个链接念个术语的人,很不礼貌。

Talk cheap 的话我写代码了,Code tldr 的话我解析了, 难道一言不发,删除,就是您对别人的「修炼」的态度?
国内PLT领域不会比拉丁文、古生物学(◉▽◉) 的情况好很多,我不想说什么宏大叙事,什么虚伪的协作, 但我觉得不该因为自己热爱的编程,而孤立无援。 您要知道,开源协作未必只发生在「确定的Project」甚至「盈利的」「流行的」工具下。
如果这就是Vue的作者、王垠、cloudwindy 在国内遇到的事情:被所认为的同道,像Q群那样「管理」的话, 我觉得Vue尤大不给中文文档,很棒。 我们不配。
我没去拉任何人的投资、没骚扰任何人,只希望墙外的IT圈能给今天尚是「小圈子的研究」最底线的善意。 哪天国内和前沿技术隔离时,请别出声,也别拿不知根底的英文链接和术语造人设:你们根本不尊重他们的同行,这开源环境,已是比10年前更差。

发生这件事后,我看到了 https://github.com/yihong0618/gitblog/issues/193 ,我不明白,一个32+的人,情绪稳定上为何不如23的废青
我是个认真的人,我眼中你们也一样,只是我们的领域不一样。 我不明白,这似乎人设不符啊。
我对Pythoneer yihong 并不了解,可以分享下吗? 🙏
>>你好~ 我是yihong0618,生活工作在大连。 喜爱游戏,跑步,读书,编程和有趣的东西。 项目大多和这些相关。
另外,我刚又又设计了一种新的元编程方式: QuineQuoted (馈硬是一种 eval(s)==s 的测试,它和FP系的ast宏还有点区别: qq需要编译器支持, QQ自己就是编译器) #plt #kt
https://github.com/mame/quine-relay

我几年前用这类技术弄了Tk的DSL,forin展开 https://github.com/duangsuse-valid-projects/TkGUI ,但没有意识到值:名替换 是把运算符重载变成编译器的要点 : 首先 kstSel=Fn(2, ([A,B])=> KST? A:B ) 就可以用read自源码+值名替换 生成出 "(A,B)=>{" "A" "}"

想必是比XML魔法优雅不少吧……

这样Kt的循环展开可以这么写:

val [T Array].constFor = F.PASTE { op: (T)->pass/*[T pass F.n1]*/ ->
indices { i -> quote { op(`$`(this).get(i)) } }
//(this as KtScope).quote "op(x1.get(1))"
//(this as KtScope).quote "op(x1.get(2.. ))"
// str += " inlineOp(${arr}.get(${2})) " 是否和 quote { op($this[i]) } 雷同? Java STR|SQL. 提案的真正面貌来了。
//也可以来return repr(字面量均可序列化), inline("bin/file")... 宿主有多强,宏就有多强。不在五行之中,却不会生成非法结构
}


看起来相当简单,而且和Proxy({}, {get:genFn}), 和lang.invoke属于同款! 但是,因为能处理左值,创建函数、修改class{}字典也是可能的。 运行时反射,编译时留字面,运行即编译,但比起JIT所有不知名的「编译优化」,eval后留字面可不是魔法,只是元循环函数而已,就像numpy和taichi 的"C DSL"
Quine比之poet等EL就像SpringBoot比SpringXML一样, 不需要切出本语言的思维,就可以突破 o.key() o."key"() 的隔离, 避免了人们关于「静态类型」一直以来的一个很大的误会
但我就从来没见「最佳实践」们用过…… kt 在用仅能自动import而且个性贼大的poet。 lombok 甚至重造javac的轮子,就为了显得自己懂栈字节码了
和我那个拟态类型不谋而合,相信再强化下反射API,很快就能替代TS了!? 🤔
val $T_Array.constFor = F.PASTE(n=1) { op:any -> when(var T,){ this typ([T Array]) && op typ([T pass F.n1]) -> pass
else -> TypeError("某些人觉得很厉害的编译原理和OOP,唉,还是比eval和原型链棋差一着")
//把for/if 这些函数的语意,重载成只执行1遍/2侧都执行就够了, 这是Lisp说的道理:语言们没什么语法,只有传参法、求值序、回调或栈的区别罢了。 类型检查和webpack什么的,何必呢,直接在编译期黑盒测试:TDDtc调试运行即编译!
//Kt 不太能按inferDFS(T)分重载,你 val=::print 就一目了然,方程的形式就只有 {T:?0, R:?1} 这样的解构匹配而已,却卡的要死,真不懂是JVM拖了K2的后腿吗? 还是某些预制人比起为用户着想,更爱虚伪的代数呢?
//因此以上代码已经是JB级别的 type inference 了,Prolog数据库的helloworld而已。 F(n1,T,pass). v(this,T,array):-is(T,any?),F(n1,T,pass). >>> v(变量名,...模板参数)

//btw. Kt 没 match{case+} 也不是大问题,如果支持真正纯函数式的解构匹配,怕是val和var语法和那高开低走的@Compose都要退役了。 Svelte的rune、C的返回到指针都不会抄,还真是仅此一家别的不看了
}}


Lisp也有类似的能力,Haskell系的 quasi-quote 准引用 ,包括Rust!()也是这个意思,不过它们都是简单的eval(comptime eval 又怎样?不成熟),甚至搞一些因为反射API不稳定、母语语法空洞而贫瘠,而使用的模式匹配重新造parser,还有递归限制
C++ template<T> 扩充的#define呢,类型体操(比如printf的静态检查)呢,也是这个意思,但它们非常丑陋,它们总是让上下游在 💩味的代码和代码味的💩间二选一,明明试图用解构匹配重新实现调包和# define就能解决的任务,还自我感觉良好,仿佛一眼概况程序的能力已输给AI,但只要Tab补齐的类型写对了,就能强化自己的正确率似的。 丑陋的黑魔法只会诞生丑陋,没有例外。

Quine就不一样了。它揭示了函数的本质只是复用了几个变量的计算树,和JSON一样是跨平台的, 借此允许我们审视和消灭重复的类型签名,创造更好的SWIG、rustdoc、lint、minify等工具,甚至是[拟态评判lityping]这样更直观的检查与推理
这一切都不需要魔法,它和Proxy+getMethod一样是自举的,可以在任何编程语言-尤其是在缺乏this支持(并且傲慢地唯独不支持this隐写)的pyjs里发生。 这是最重要的点,我的跨语言RPC新JSON需要这种codegen框架。 解决一种问题,肯定要把所有上游复杂性全消灭掉,对不对?
duangsuse::Echo
https://zhuanlan.fxzhihu.com/p/12834699352 #os #cpp #rust #learn 协程 云风 >在知乎上看到两篇 吹嘘 云风的 coroutine 库的文章。 人啊就是这样的,出名了以后,就是垃圾也有人吹捧。 🤔 回头我可以科普下非阻塞(异步)、调度器、C++赝品Promise、 所有的协程都是使用的同一条栈(单一调度器) 有什么不对 https://www.zhihu.com/question/524369963/answer/21981903209…
https://zhuanlan.fxzhihu.com/p/158430253 #js #plt 闭包
我类个逆天啊, 别整这些八股政确了,好好搞你们的业务去把

也没见你支持json.load/dump匿名函数或者作为F12调试利器啊, 要我的话就支持 addJob=(id)=> write(on_usb.js, ()=>id.next) 了,不然你分析分析有啥用啊

https://zhuanlan.zhihu.com/p/158147380 #cpp 反射库 非 RTTI
dnaugsuz
我也讨厌。 组合优于继承,举个例子 .: Animal -发出B动静 "str" Duck-name-flySpeed fly: .. B动静: "Quack" Cat-name # 但是需求又加了 .: Traefik Airplane-flySpeed userStory-take: wait 1day #if isinstance, 可以听听B动静 take fly 这就是Adapter(impl for)为啥那么有用,但其实没意义。 会飞的…
#plt
现在我看到 lambda 科普的那个 Term Substitution for Abstraction 我就绷不住,直接说,是和 urlArg.loads("A-%20-B") 输出一样的转义遍历不就行了?深先遍历。但 lisp 又连Rc对象树(文档树)都没有定义

然后就连这个简单的 f=(A)=>A+1; f: arguments[0]+1 ,args即VM或运行时(也可能是RPC?) ABI都讲不清楚,最核心的 nonlocals(free vars) 还得靠Guido设计的F12工具来“闭包”,给本质勾兑非常多私货,教学顺序比数学书混乱,难怪蛇宗厌恶 lambda: 语法

Vue 都比「入演算」强, A=ref(); f=A.十(1); dllExport({"f": f}, A) 可是真的「定义式」函数诶,无所谓是 return-on-stack 还是return给回调链表,还是 fun<A> id(:A):A 泛型。哦,他们管链表栈叫协程CPS
Compose 语意本无关于编程语言, HLVM, LLVM 。如果语法单项连人脑都不能轻松描述,放电脑里就是和写XML一样,折磨人。

真不知道这群圆括号,是不是只会写parser抄paper,根本不探索syntax是在调用哪种编程范式和ABI?(wtf (JSON)) 就是3行js解决的玩意,这都高于libc内存模型太多,双指针(slice,objType,arg0_bindFn,) 心智模型都没,不用操心,不懂有啥难eval(replace..) 的。

是不是还有人觉得 type infer 是比Reactive+match解构 复杂的玩意?😅 都是抄Prolog的,然而老PL自己也有局限性,我就呵呵。浪费老子两年半,什么小学六年级代数, 语法设计的这样反人类,和指令集一样原始,却还跨不了APIset/SDK,我去Web3开发玩了,虽然EVM狭隘但是接盘补生态位的人和网站多啊,玩VM它不如玩真M啊

#statement
连从UIUX的用户叙事,给codebase做GC(aka tree-shaking) 都不会的话,这种框架的API我看都不会看, 解释不了「为何需要这一段代码」? 那谈何比用户训的AI厉害🙉

我现在只会 code by example ,PoC, demo, tools UI ,先试玩试完再谈理论和选型。 省得搞这些语文水平欠费的 #CS 形式主义。 程序员的傲慢,先学会玩 再学会run吧
duangsuse::Echo
「只需更新1个矩形」 这样的批评或许很空洞,但淘汰了Atom编辑器的 VSCode Monaco 编辑框呢? F12一下,你会发现别说 CSS.hilight 了,它甚至没用DOM Scroll,而是拿js更新style=transform !
🤣 码聋魅力时刻|面向运气编程
明明是开源软件,却添加私货、防裁员代码

哪个老师教的?总觉得自己比比最广泛的框架还聪明 #statement

看到这种 API set 就想吐,真是不如AI写

我可能该为此抱歉,因为这是 #plt 和《编译原理》的傲慢造成的过度工程风气

一个个比DOM和SVG滤镜低级的体系,却写的比 #py #ai 更冗长,甚至看不出来哪些功能点是低频的

Guido 的Python真是笨到了点子上
小红书一瞥
我承认Python水平不如战鹰🤡 #编程 #Python #围棋
#py #plt #bilibili
ps. write through proxy 就是 js.__proto setter 这样的东西,不是纯粹的dict键和POJO

战鹰怎么会需要这种东西,难道是数字生命体化了? 😂

locals() 和闭包本来就不是人写的东西, vars() 更加现代
duangsuse::Echo
🤔 我请HF最新的Qwen查了一下,他确实没有「一字为典」的数据 #english 形声字(占比80%):如"清(氵+青)","请(言+青)" 会意字:如"休(人靠树)"、"武(止戈)" 象形字:如"日""月""山"的甲骨文轮廓 指事字:如"本"(木下加点指根部) 而且它列出的一些拆字也不完善: - 汌/谚 为左的「青」 并不止是形声,「请」本身就有言初生的表意 - 「人木 休」「日月 明」「月半 🐱」 「拼夕夕.砍一刀」这种程度,都不叫拆字了,而且也没有解读为什么要这么拼字! - 以武(止戈)…
#statement #english

dnaugsuz:
(懒得喷)
监生觉蓝

- 看着草地长大的是蓝天

分皿显盆

- 用于分饭的器皿是盆子

我直觉上的《说文解字》是这种
COMP:
……你看看汉字字型演化史(

dnaugsuz:
我看过编程语言演化史

但是到了最后,你才知道最正确的解读是当代。

我觉得奇怪的,恰恰是为什么随着演化,象形的意义越来越明确、抽象(aka普适),而不是走向偏旁部首古今音,这样没有意义的「研究方法」和抽象

这么多传播者,汉字应该是像屎山一样,无法被解读才对😱

……我懒得玩,这甚至不是我最近的项目
我放了一年了, 而且我主要在做编程语言

如果你觉得所谓的研究, 是做那些对汉语学习,没有意义的「生物分类」工作,AI似乎能自动进行的机械性探索

那我反而觉得,民科一点是对的。
语言是活着的,与所有人和事连在一起的,并不是复杂的考古。
语言本身就有意识形态的力量,它对文化和商业至关重要,并不包含什么象牙塔厚重。 那是苦难崇拜。

复杂的解读,不等于对。
若从来如此,便能对吗?
吾爱吾师但更爱真理

至少在我的十年本行CS,我见过太多被刻意教学的繁复晦涩的东西了,只为了显得专业,拒绝被解构、打比方、举例子。 我尊重的不是这种知识「私货」。

COMP:
再提醒你一下,自然语言和程序语言不是一个东西(

dnaugsuz:
我知道,但组合、代换的能力是相通的
知识需要广度的,不是孤岛

:
自由解读倘若没有界限和历史支撑,也只是空做白日梦罢了

dnaugsuz:
我的价值正好颠倒哦😂
若没有市场和普通人的共识支持,搞那种学问,才是白日做梦呢

民科之所以民科,是他们不懂得科创源于经济,而是在「觉得自己分高,别人就该花钱进来镀金,顺便给大学发钱养自己。」的思潮里,走歪了

不是的。 这都是生意,没有永远的朋友。 你可以信仰,但要懂供需平衡,要可持续研究 就需要常识。

所以我有很多这样的草稿,我有点完美主义,所以没有契机也不会拿来讨论。

我不是觉得《说文》不好,只是 jpdb.io 这种APP,更有当代研究意义而已

就像emoji如果不存在,就没有研究者能用AI+表情文字设计一种「人造语言」。 我不会神化任何圈层或 #plt 大佬。

你没法对「没有过主创」的东西判断对错,乃至于学术、考试。 《西游记》《红楼梦》又算什么呢? 在百年前,它们只是和《三体》一样的流行文化和小说 ,不是名著,它们是某些家长看不起的下九流。

我的事业不是懂不懂,是已知和未知。生来平凡,没时间做无趣的事。

比如表情符号,是整个互联网的贡献,这能够是一种学问的基础。

我不是为了说服你,只是为了让你启发我写点字(
我早看出来我们价值出发点不同了


ref:https://tttttt.me/dsuses/5394
Forwarded from dnaugsuz
这么一看写 interpreter 鄙视写计算器/Q群命令 的人,真的挺Low的
parser 也只是 https://regex101.com/r/rA2aM6/1 这样的程度

compiler 我也不喜欢,觉得连SVG/ffmpeg filtergraph 的可视性都不如,复杂,不配当设计编程语言的。

如果你很聪明,就应该终身手写汇编,而不是制造过度设计。 像王垠说的道理一样
我觉得在 ShaderToy.com 画画的比玩操作系统、数据库、编译原理的牛逼多了, 一些C++民也一样,只是被Stroustrup和谭老登的「屎山最佳实践」拖累了
创作式编程没法加私货,因为一切都是可见的。 作者没法混淆「抽象」与「普适」来显得自己牛逼。 #plt #statement

https://tttttt.me/dsuse/21117
https://tttttt.me/dsuse/19868

当框架试图解决一个它不理解的问题时,复杂度就产成了。——Andy Boothe
业界总有两派程序设计方法,一派简洁真诚,明确不堆砌缺陷,一派繁复空洞,连缺陷设计都不明确——Hoare, 快速排序之父

说的道理这一块 😅
程序员对小众的东西,还是要去魅。 元编程TM 就是为了让tgbot、H5离线程序这些东西好写, 不能为了原而原 🤡
看过很多文章,写很多PoC,transplant,demo,最后还是学了个抽象。

其实学语言是学 API 、学组合学代换,如果编程语言已经是你的母语,那些「专业领域」的实践没有营养的。
我看到 Echo(x)=x, Counter(n=0,+1) 这些小学生都会玩的东西,才知道 http,dom/db 这些技术的价值,那并不是几本万字教程能包含的。
如果你学「计算机科学 #CS 」,但因此觉得自己比说出「人人皆可物理」的费曼更聪明,那你可能该扇自己一巴掌,因为你背叛了元「编程」对知识的组合与简化。 这是个经常「忘本」的领域。
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Forwarded from dnaugsuz
即使使用英文, #PLT 领域内就连最简单的术语都充满着歧义和晦涩。如果你对 PLT 里的各种术语仍未祛魅,去搞清楚 dependent sum type 和 sum type 的区别吧,这是每一个 PLer 学习过程中必吃的 💩


啊,这个 #dalao 说的道理太好了,我太喜欢了 https://github.com/anqur/TinyLean

hole 和 React useHook(var) 差不多,这种比喻都被一些人视为不优雅的。 就是要去魅,要抽象,要解构
比如那个栏目答(入x. x+1) ,就是不能用他们的语言转述, 就是不能用它们的(()圆括号)讲解,要用中文,要不然就被带到坑里去了。
dnaugsuz
即使使用英文, #PLT 领域内就连最简单的术语都充满着歧义和晦涩。如果你对 PLT 里的各种术语仍未祛魅,去搞清楚 dependent sum type 和 sum type 的区别吧,这是每一个 PLer 学习过程中必吃的 💩。 啊,这个 #dalao 说的道理太好了,我太喜欢了 https://github.com/anqur/TinyLean hole 和 React useHook(var) 差不多,这种比喻都被一些人视为不优雅的。 就是要去魅,要抽象,要解构 比如那个栏目答(入x. x+1)…
我第一个经过验证的命令式程序
原文:https://markushimmel.de/blog/my-first-verified-imperative-program/
阅读时间:13 分钟
分数:173

Hoare三元组的一般形式为{ P } S { Q },其中P和Q是断言(assertions),分别称为前置条件(precondition)和后置条件(postcondition),S是一个程序语句或程序段。
含义
{ P } S { Q }表示如果在执行语句S之前,程序的状态满足前置条件P,并且语句S正常终止,那么在语句S执行完毕后,程序的状态将满足后置条件Q。也就是说,前置条件描述了执行语句S之前程序应满足的状态,后置条件描述了执行语句S之后程序应达到的状态。

#PLT 笑传之重重彼
都是车轱辘话