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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): a19a0b
Download Telegram
#design 编程四定律 📚

1. 数据的构造和消耗决定了数据结构。如果不从出现和调用的【概率】入手,读死书的人就不能【创造】出它众所周知的结构。


2. 优雅的程序结构直观对称于它流入流出的数据类型:同像性。这是H5和js接口成功的主要原因,甚至,也是N卡垄断AI算力、Apple用“一指禅”干掉诺基亚的技巧。

表格行有结构,一字字的序列有结构,一段段的块有结构, '(树状(组)) 的结构高于这两个词,没有什么结构更缺乏生产力。

[1 2 3] 就是结构,序列中另有元数据和小结构。序列外的“工人”被命名为【代码】,但它只是【解释器】所需的,另一类生命周期的元数据。

3. 解释器实现权限,【数据流】决定定义。123在键鼠触屏上是数,是坐标,或是 (con-cat "n=" "123) 如何预判?

4. 123是自身的字面,但其【取值】是从哪来?往那去? 代码的精髓是后者(IO/APIs/for.if),不是前者(A=B, Math)。编程的根源是函数和【多点候数】,是实参和形参,是超链接的【路径】。源码从不在“地址栏”或光标上。

你用键盘写的代码,但你的思维却在你眼前,用左侧词和滑条(Tab补齐+git diff)思考:你不是在脑子里思考,你不是在C++/Java里思考。

这种识别构造出了“函数的形状”,不可被统计跳过。函数是“功能”的方言。僵化的功能。

代码和效用,不会以 A=B 的严格相等来成长。把【1条路径】if进某个命名,产生自乘式的易用性和通用性。代码偏差 i+1 就是完全报错或可用的边界条件,但路径、心智模型本身,有可能突破这一种边界。



当我们聊编程史时,我们聊的是未来的【思想和路径】,很可能突破什么,从而顺其自然。

所以想学软件工艺,任何既有的开源基建都是【道与禅】的本体,哪怕是通俗的Python

pep20.org
#ai锐评 https://chat.librechat.ai/share/hlqzDpIQfhaK99JAA6V65
duangsuse::Echo
有些无脑的 innerHTML=.map().join() ... 其实不需要那么多过度设计,之所以说是过度,因为它们对“推理逻辑”没有贡献。
#design HTML是反人类的,但它唯一的优点就是【所见即所得】,让你学习设计,而不是语言。 它像bash那样是种胶水语言,而且起步成本为0: 不需要刻意去命名你想做什么。

打过游戏吗?现代的《马里奥》里直接隐去了BOSS和小怪的命名,你用自制emoji 🐢在文本中指代怪物。 软件也是这样,有些技术本不需要名字,emoji 这种DSL来编码它就够用了。 “低幼”和“自动翻译”正是H5与朋友们的神性。

象形、直觉与直接指涉(Direct Manipulation),让那些看起来牛逼的设计模式、C++框架样板,最终只用一个简单的{[K]:V}或动态调用/Proxy/JSON就能实现它们,这正是H5的特点

它容错、甚至“不求甚解”,就像 class  🐢 {},一看就明白 它是绿色的;踩它一下会缩壳;踢一脚会滑行,再按F5确认一下,访问项目页就能看到截图。 而没有 trait、protocol、interface{} 、concept…… 🐢有地心引力,而这不需要起名字才能实现。

我见到不少自称【可测试】的接口,不能像 “按下PrtSc键,然后点 🔴 按钮…… 把操作视频拖到代码里,再选择几行CSS来验证操作结果” 那样设计 test case。 不对,不是【写】CSS,而是用Ctrl+Shift+C自己选中 “要检查下这部分” “那部分必须禁用”。 每几行代码,都有能点开的抓手。

有什么 “代码自动测试”,是能脱离油猴脚本(Mock)、快捷键这些生产力工具来编程的? 真是奇怪啊…… 就连面向最终用户的测试,也只是装模作样 🥱

这是对人类直觉的最高尊重:你是在游玩界面和交互本身,而不是在给编译器写汇报材料。捏一把、按 F5、屏幕亮了、角色动了。就像MC里如何【做设计】那样——或许需要自动造墙的MOD,但【创造模式--范式】已经提供了REPL般快速的活力。
duangsuse::Echo
#js #code Kitty 协议的NVim仿VSCode网页预览 Electron+Custom Toolbar 通过BrowserWindow.webContents.onpaint, NativeImage(SHM), sendInputEvent 实现的嵌入 还代理了 UA, SIGWINCH, Ctrl+W, getSelection xywh, kitty_colorsToTailwind(Toolbar支持终端配色) TermEvent>KeyEvent, ShmGraphicBuffer…
#post #design 换购思维:面对编辑框的你,不需要证明自己会做

awrit 项目是一个有趣(而且对Vim用户有用)的w3m浏览器升级版。

放到以前我会Star,甚至fork(然后啥都不干)

可现在我只会记住:它平替了什么,它依赖什么API(键鼠屏幕的flow),数据流有哪些typing,哦是electron而非CEF。我甚至只看截图而懒得运行。

——你看, This repository was archived by the owner on Apr 25, 2026. It is now read-only.

它出现不是因为它有代码、它Rust,而是找到了一个【框】来安放自己,又展示某种内容或工作流。 这个思路,是无代码的。

它涉及的无缝scroll和resize,这个vec2的模型,是无代码的。本来可以无代码的。

有一个API,就会被多一种“私货”束缚。发现代码甚至【软件行为】的重复,却不过度设计的能力,非常稀奇。

🤔💭 只有你能不从“项目模板”和上游依赖开始写,而是:真正【面向REPL/AOP】的开发者——就好像自己能够扮演wlroots时,才会真切的体会到这些【隐形知识】。


2025.5实现的 tty onresize,24.6的点子,到现在已经占用开发者一年时间 30k+ 代码量了。

我不是个看Star数说话的人,但这个功能,可能用 XReparentWindow 来实现任意窗口的嵌入,然后对中键scroll补丁一下更简单。

没错,在wl下这会很hack,你甚至要diff截屏(cv2)或用a11y(atspi2)拿到一个int,来实现嵌入随内容scroll,需要针对K/G/wlroots做适配,

但它的复用性,会比你耗一整年3万行,还js/libc双生态好的多的多。 这就是技术选型时重要的【换购思维】:省下3万行,你还能加购什么?


因为这样的话,chrome-in-term 就只需要 reinvent Toolbar 和实现 window.open() 的AOP化扩展,这也是个不错的学习量。 DOM APIs 其实就是这样攒出来的。

——不对,甚至连Toolbar都不需要自制,因为你能直接把【任何浏览器去掉窗口边框】放在【任何支持鼠标滚轮】的窗口的某几个xywh上,只需要1行就够了,kitty icat 显得多余。 html-in-canvas 就是这样来的。

虽然模仿窗口油猴AHK会很hack,但比起 This repository was archived by the owner on Apr 25, 2026. It is now read-only. 还是更有生命力的。

(下面顺带吐槽下各种编辑器的refactor支持普遍太弱)

那为什么我不去做、不去踩坑呢? 因为VSCode的aside热重载已经足够好了,NVim+Kitty 虽然在{}当前缩进层 的动效上,以及treesitter语法集支持很惊艳,用户体验还不如Kate+CMake/LSP

However,这些符号表实现都只能Ctrl点击=jump2def,不能查def和type的xref,自动导入/跨文件重命名,甚至只是查arg的所有实参(当然我在扯淡,哪个IDE能静态查这玩意呢,哈哈)

不过说句实话,hljs+jump2def+命令和跳转面板,还是太普通了,甚至不如GH的符号搜索。list_argvals 虽然扯淡,但如果你习惯F12的事件断点调试器,就会明白它们能省掉多少次点击,而且更加接近程序运行时的状态。

哈哈,当然我在扯淡,临时加print才是最顶用的。你甚至不能写 f(dd=x), dd(f)(x) 来单独打印一个或一组参数。 还不如直接用Jupyter试错呢,优秀的程序员怎么会需要高频率的按F5呢?

📝 👌

为什么要这么锐评呢? 习惯的不同。
DOM/html真的是编程世界的Arch洗发水,太方便了。 你甚至可以把普通桌面/触屏App套用到网页那套术语,什么header/MenuBar,footer/Status, aside/Panel..

基本上什么需求都可以用WebAPIs的理解对上去,而且很快会发现它们简直比Python还简洁。只是下限低一些。

如果没有所谓的【前端世界】,我肯定会被一些垃圾设计带偏。其实不同的场景有不同的好做法(ImGui和Tk就不需要Signal变量,而Qt的Signal更多是一种函数值/自动free),但是浏览器总最正常、最不偏门。

平时说的元编程,和Web协议栈对上那就不算什么。CSS/URL/JSON/SearchParams 这些本质上都是隐藏的宏魔法,只是太高明(而且容易做出tw.css/stylus那样的创新),很少有人意识到浏览器组件比编译器更有【编排能力】。

如果一个编程语言不能在某种程度上和 WebAPI toys 接轨,它就是失败的。因为世界上并不缺少 “更js一点的java或更python的lua”,如果感觉上如此,那是因为之前的都凉透了。
#PLT #design 还有VIM的吐槽(现在好些了)

默认非local、非public不会觉得自己很蠢吗?该不会还觉得做了什么了不起的虚拟机优化。

约定优于配置。声明式到底有多难?!

是什么让90%编程语言的作者像java的public那样到处拉屎。到处Local写的真的烦死了,ES6的箭头函数好点但也脑残

最后kt还是默认pub,Bun还是提供write, 所谓的防呆全都是自欺欺人。像bash那样 echo>file cat>>conf 到底有多难?! 非要 mkdir, create, 甚至encode.. 有这点功夫不如实现json lodump

以至于python可以只因为不给人添麻烦而成功,和性能或设备移植性一点关系没有

几乎没有tui编辑器支持选区和复制粘贴吧?vim不支持Shift选区?

NVim按ctrlc 仍然无法工作

在vim因为cli而区分V-mod时,正常编辑器已经有minimap了

这等于要重新学一遍盲打。 有什么好处?真不懂visual和默认模式有什么用。

表面上Vim们是结构化,实际上minimap和悬停、Ctrl点击早就决定胜负。如果多标签和工作区都不自带,怎么编程。它有双空格yazi预览,但VSCode也只是有预览没做平铺,IDEA更是比vim好太多

真是匪夷所思,所有编辑框都支持的nvim反而不支持,还拿来做什么窗口分配调宽度。hjkl甚至在物理上都与意义不对称,别说好不好记,每次你都要翻译一下再跳词 😅

从vi开始就是设计弊病,不知所谓的单字符快捷键,就好比编程里的 code.golf ,直到现在Kate都支持文件夹和工作区了,nvim还是只有配色改了
有configUI,但只能预览,太蠢了。bash的set可以把状态变成字符串。如果做不到,把eval记录到文件都行。

r2用完全相同的交互,你看不到这样大的学习曲线

r2 完全可以在效率和易用上做到平衡,用REPL语言来做scriping和r2pipe,因为它的作者自己有能力包许多插件和h5界面,而Vimscript是 dirty hack,和TeX一样是外行碰运气

而且r2支持qt,h5。r2 的 s, 0x, / 跳转绝对让人立刻理解CLI编辑器的优势,而不是nvim这样,在VISUAL,NORMAL和莫名其妙的V-mode矩形选区里蹦跶


这个智能混搜没有命令搜索功能,也不能在 @或> 前缀时切换搜索,让人觉得莫名其妙

Snack自己完全没有这种omnibox吗? 非要手写。Lazy本身也有一个which-key,却没有这种路由处理,简直就是加了一点 i 的蠢货命令行而已

看到gelguy/wilder.nvim的README里只有一张gif,下面每段代码都是折叠VimScript+Lua,我就明白乔布斯的Bozo是什么意思了。 简直和Linux没有Docker理念时一模一样,到处是没有性功能的样板

现在的 Neovim 生态给人一种“现代化”的错觉,完全是因为folke换上了 Lua、iconfonts、Catppuccin 主题、无边框浮窗和平滑滚动,精力还是在没有flow的地方。


r2、Blender 的按键/hint UI 很明确的告诉“高效编程者”什么是真正省键位—— 把能用的 action list 和快捷键写出来,统一可编程API,而不是拿键位和古怪的DSL糊弄人

这才是Hacker的【用户中心】,不是教人作事的Bozo。

Vim就需要只读和读写两个模态,默认读写。拿那些修饰键临时切换。 Normal模态下的键位真应该<5个, Lazy默认的<C-o>SPC不就只有一个,还带UI。

Vim和Kate的矩形选区也是反人类的功能点。 除了写文档注释 asciiflow.com (意味着不该由编辑器支持),我不明白矩形选区有什么意义,它既不酷也不hack,还不如加多光标和视口内重构。

这让我想到各种 cmd|awk {print $2},一整个沙盒只为一个Tab split。AWK到今天还不如jq和ruby ARGF有用了。 😅


👍 folke(也是 LazyVim 的作者)将整个发行版设计为极度模块化、高性能且“开箱即用”的现代 IDE。snacks和which-key非常友好,而且像MT管理器那样强大

让我想到那个典中典的微内核与Linus之争了, 还“如果Linux是作业我给你零分”,我可去你的,对语义和场景无知到什么程度,

还真是和Gates说的那样, 真以为自己做了API和算法就有人用了,谁理你,这心智模型是什么碎片垃圾
#design #web https://hex.tech/

这个产品页demo好,可交互。 你几乎看不到这样的
【程序设计】应该重视【截图和可视化, Q&A, Before&After, Awesome Lists, Build in Public 】五个要素,这样才能称为 Learnable Programming


我发现我掌握的技术,有30%都是类似“把CLI封装回API”,却不能像 import fire, plumbum 那样理解自己在干什么。

所以我自称为【软件工艺师】啊。【知道】高深的技巧和细节,不能让你设计出 fire, plumbum 这样的【理解】。 如果你在看书时觉得无聊,那肯定是作者糊涂,而不是你真的不如GPT6聪明。
https://t.me/hyi0618/14866?comment=168873
#design #book

大量的文字用来解释一个简单的概念,信噪比极低。一张好的架构图,甚至只是关注点的截图、简单对比(Before&After, Awesome Lists),信息密度远超几千字的描述。 书籍是需要语义索引的,而且索引心得可能并不需要你开repo来分享,不需要你切到CLI去push新博文才能分享

【同理心驱动开发】,而不是面向薛定谔编程,或面向F5编程

实际上,我很奇怪为什么【程序设计】不重视【截图和可视化, Q&A, Before&After, Awesome Lists, Build in Public 】。 掌握着原理和实现,为什么一定要vibe编程和create-xxx-app显得那么“先进”。 Marc 卖课赚$3000k 不正说明开源世界,作为一个整体,不明白自己在干什么吗?

这不是 Learnable Programming,倒像是每个编程者在重复劳动,所以使得能够替真人输命令的dsh和bash显得如此强大。它们不需要把CLI封装回API并且制造不兼容性,也不需求服务端开个 /api/v1 才能帮主人拉点【内容】下来。

我发现我掌握的技术,有30%都是类似“把CLI封装回API”,却不能像 import fire, plumbum 那样理解自己在干什么。

所以我自称为【软件工艺师】啊。【知道】高深的技巧和细节,不能让你设计出 fire, plumbum 这样的【理解】。 如果你在看书时觉得无聊,那肯定是作者糊涂,而不是你真的不如GPT6聪明。
duangsuse::Echo
去他的,做就对了 #life 原文:https://www.joelotter.com/posts/2026/09/make-it-anyway/ 阅读时间:4 分钟 🤣 吐槽完数学, 下一个是自我批判了( #cs #dev 如果是学习元编程,肯定会接触到编译器前端、tree walker 实现。 如果做到了,应该很开心(自满?)才对 ,应该变成王垠口中的 Distinguished Engineer 或者 A-Player 之类的东西,总之和那些拿bash写安装脚本,拿Sublime敲代码的 Bozo…
#design #vibe
John Carmack:不要成为那种脱离现实、自称传承数代绝学,却被业余综合格斗(MMA)选手暴打的传统功夫

一本古书中的引言记录了剑术及各类武术从战场上的实用刚需,逐步演变成体育运动、历史遗迹和个人爱好的全过程。

例如在二战后的日本占领时期,武术曾被禁止,当时柔道被解释为等同于西方摔跤,剑道后来也被解释为等同于西方击剑。


• 编程技能正在走上相同道路:卡马克指出许多编程技能正经历类似的演变。过去有人手动将操作码转换为十六进制,至今脑海中还记着一些神奇数字;但即便是今天仍在使用汇编语言的少数群体(例如 FFmpeg 开发团队),也早已不再以那种原始的方式工作。
• 有用户引用埃隆·马斯克的预测,认为传统编程即将在未来几年消亡。AI 将直接生成底层机器代码或通过脑机接口实现“意念即软件”,编程语言的转换和编译摩擦将不复存在。

不要成为脱离现实的功夫大师
原文:https://twitter.com/ID_AA_Carmack/status/2098443262214230095
阅读时间:5 分钟


🤨 【AI 将直接生成底层机器代码或通过脑机接口】 这条就算了。 先把语音输入给普及了吧,亲。 编程不是罚抄,瓶颈不在敲键盘,而在选题和对齐。

🥴 乱敲键盘≠语音≠打字≠写作。 等价—并非等同,你每天都在证明。

或许魔法不存在? 或许,【问题领域】不能被降维成一行行的GOTO流。理论需要知行如一,不创造,不真懂。—— 如Feynman所说

你不可以用语音输入的GOTO,跳过打字的“性能瓶颈”。这是魔法墨水的、一目十行的问题,不是【输入问题】。就像P2P不是下载问题,是文件分享。编程语法不是PEG问题,是创造力问题。


🙉 Codex们可以替你组合堆砌,但不能【正交分解】,后者决定你有多大的“突触链接”和【创造力】。 除非你是朝生夕死的蜉蝣,或没有个体体验的巨婴,否则永远没有“同声翻译员”能替你捋清记忆,因为你和LLM不是一种 “生命体” 而它默认烂大街——这点不会改变,因为是经济规律。

如果形式一致,就是内容一致,Musk 的云计算也别搞了。 不都是字节流/换行流/音画串流么? 谁去算,有什么分别呢?
他们甚至在不截图的情况下写了十几个test,就像安卓项目模板或left-pad那样莫名其妙。 #design

我不明白这有什么意思。好像一个厨子拿【PH试纸】在做糖醋里脊一样,我可不敢提醒他们长了舌头,不然会被鄙夷 “舌头是用来说话的”?! ……
duangsuse::Echo
如果你问AI会不会取代我,我是不操心的,因为我的日常就是灵感和 TODO stack 被挤爆,别人烧token我烧灵感也没问题
#design
举几个近1月的例子: PyJSLua函数行数Treemap、Qt/GTK 快速重启.nvim、pianoroll截图转音高队列(配合S键实现音游打轴)、Limine 中文支持和热重载预览、KWin动态工作区.js和平铺TileArea WebUI

每天频道更新几千字PL/全栈纯干货(事后筛查话题重了10%),还有70%的精力花在新语言设计稿上

(当然拆出来最先执行的肯定不是无聊的 wtf ./mod.wtf 和REPL了,其实我认为这个模式甚至不如IPy现代化。看到这个 wtf...wtf 我的第一个点子,就是把$0统一成bzbox那样优雅,好吧。)
(所以说一个设计师也不会很轻松,他们一直在【受伤】,而且得出的代码不能是 “结痂”。 这肯定不如全权Codex容易)

你能想象吗 ——如果所有人都在用的REPL,那种体验是【错的】,“解释器”也不是终点。

如果你能把C语法当json.loads那样解析就会这样想,可是很多人连解析器都觉得复杂。

有人很聪明,所以,他们就被“手搓英雄”的泥沼锁住了。没有 “然后呢?” 这个问题。

#ai
总有一款坑适合你。 所以我说,我不为了代码而编程。 如果我没有【屏幕之外的标准库】,就会被这世界带节奏。Lisp的反射终究只会咏唱自己,我的反射弧包含它们触碰不到的白魔法。

code 是思考和选题的介质、是严谨的人机界面、是思维的自行车,我说什么方言,不改变我是什么领域、什么流派的作者。

答案是:我既不后悔没有浙大北邮or各种外国语大学的经验,也不后悔在技术栈上【离群】。

对于 #PLT 而言,吾行之,明也。 以前我认为王垠在上海收太贵,现在想起来,他分享的远比索取的要多。

【屏幕外的那些代码】,比如,如何让一个playground在【新人】能够接受的10分钟内跑起来,不报错不像toy;穿回过去,如何拯救夜不能寐的某一次DX,这些,是许多人【从未学到】的。

我很好奇是什么让他们过的这样顺——就像,全面屏和剪贴板诞生之前,人们是怎么工作的? 弊病终于已经显示出来了:把nav放在aside的屏幕左侧,安装apk拉起全屏弹框,很奇怪的吧……?

☕️ 听起来这很容易,但这才是Zen。谈论设计对实现有什么作用(talk is cheap?),就像在问内燃机对马匹有什么用。

我的标准库不是函数式,是生活的 “进行时”;我的编程不是懂不懂,是已知与未知。

【算法】分为两部分,一段安在脑子里,一段安在硬盘里,Codex能解决的只有第二部分。 它不会头痛或感觉别扭,而这是最大的问题

它们的IO太廉价而记忆太昂贵了,在【继续设计】领域这作不了数

设计真正做的事不是让实现更好,而是决定哪些代码堆砌不需要存在。
duangsuse::Echo
https://github.com/manaflow-ai/cmux #haha 这个Claude #vibe 出的玩意…… 支持了muti-Agent,多标签的active高亮,以及WebView bash自动化 12万行 1.4k 个swift文件,2.7k 个 AI PR,你要说可移植性,那就是没有 😨 看到这一堆 BrowserDesignModeController, BrowserHTTPBasicAuthPrompt.swift 时我的震惊已经无以复加,就连英文编写的内容也有一种进了…
#code #design 现在会写代码、能跑,真的已经没有任何稀奇了

什么AVL和NFA都可以写800行最宽200列 ,一个函数签名200列

一个 .lean 文件 20k 行,以后随便一个安装包GH上都是《海底两万里》

屠龙勇士? 它们也是恶龙。 无法理解源码,就以为能理解proptest,结果是断言也要交给AI,那个代数又有几个人能看懂。

随便一个文件夹上百.swift ,里边函数列表比我写的代码的行号,还多两倍。

遇到复刻MC的xyzb体素引擎,那个.ts文件都能2MB(大约是 5万到10万行trigger fun),没有Codex读写都做不到,手工改更不现实

真别说日用的编译器复杂,谁能想到2M……

我认为,工具链和框架已经不再需要为AI的表现优化了,they 的理解能力,完全不需要按人类和组织的标准去衡量…… 人家天天手搓Linux和Blink呢 ,别问output,就看token是不是这个体量?!

专心为人如何维护高层数据流优化吧。
它们才是长了轮子的,不需要护膝。
duangsuse::Echo
#PLT 做了一个可爱的小动物logo,Gemini上居然用了10分钟呢 不过幸好有AI,不会被卡住。svg也配套了. Shiba inu 还是很可爱的
#PLT #design

纯粹设计中。前天搞了一个比较难崩的小插曲

row Wtf() set ItCloses :{- i new 0}
fun{}

req `ItPoint` set ItInStr
fun {
go(){ for(pts>>$p)...}
safe()> if{(1==1)? ON} Or NO
}

或
以 物件() 悟 It可闭 :{一 i 移 0}
是 { }

依 `It点` 悟 It可阅
是 {
走() { 全(pts >> $p) ... }
为完整()> 取 { (1==1)? ON; (并非 pts)? NO; (n(pts) 并非 1)? NO } Or NO
}


这个属于autofix转译的附带功能,我直接连CJK俄语俄德语都插进去了……

事实证明,它对设计师的意义大于实际使用意义,给了我很大声明式一致性方面的启发(和调整),而且让我意识到HOLP的范式在跨文化上可以保留语感到如此地步,C-like 绝对做不到。

emoji 这个比较出片,也有 emojicode.org 的先例在(我认为放在文档速览里是绝配)

#ai探讨 https://chat.librechat.ai/share/oHKZ5TldP-WsO14M1vRB3

https://www.hedy.org/ 这个新手101很有趣,但不如jupyter
duangsuse::Echo
关键不是在于好写,而是全兼容、精炼与可读(PEG层没有换皮能力会卡编程语言的上限)。
现在真觉得【骨相】太重要了, if, else, elif 这些皮换什么语言都有一种恶感 #design

- AB  if { (u.hp < 0)? A ; (health < 0)? B } Or "else panic"
[1 2 3]?.{ if { (u==1)? OK^1 }; w@ '{u}..' } # 2.. 3..

- two As { for([1 2 3] >> $x) if { (x==2)? OK(x) } }
- f_ (i) { Loop(i+1) Or i==3 OK; sleep_(1) }; f_(0)

- one ("1").if { "1" 1; "one" 1; =TAG= 2; =TWO= 2 } Or NaN


😁 这些关键词都不需要 for, while, do, break, continue, if, else, elif, switch, case, default

if和throw六个词只剩两个,while系只有Loop OK OK^ngoto,switch只需要会if,for和$变量解构共用一个for字


真的是脑子坏掉了才去写什么 public, self. , this.a=a, Ruby 也输给了end ,还有那些该死的、不运行的分号和int术语,不要给人类阵营的语感天分抹黑了好不好…… 你如果不把它翻译为中文(甚至八国语言),根本意识不到程序员活在一个楚门的世界里,

编程语言是驯兽师,不是助手。 它们觉得自己理解了冷门知识就有资格来教育创作者了(其实都是copycat)

如果你把一般的kt,java,py类、接口、函数流控像cyy这样的翻译,就会发现没那么简单,或者就弄成《易语言》那样半通不通(极有可能语法带坏API翻译,语感雪崩)。

从这个角度,HOLP列表处理也可以说超过了【慢写换快读】的牺牲逻辑,大人全都要

首先破功的就是【踩屎感】的 fun/val/void/int 这些毫无语意的提示词,if elif else 这一个赋值控制结构,就把cyy for if Loop-Or-OK 三个的学习成本占了 ,还不用说构造器赋值、构造器vs接口,和priv var :{-i 0 -j 1 -s "Hi"} 这些需要一项一项去堆的感觉。这边是按更Python+TOML的Lisp打底的, Int Str的位置可以直接写 0,"",[""] 的 row req implied,public void 不用写

就是方言照抄Clike,再高级的范式(eDSL,serde/RPC)也没有。一个 Named("Don").Duck(age=3) 的原型或elm的Visitor多态有吗?以至于一个Rust和Go(赎罪之作也依然有nil问题)都牛逼成那样,Clojure和CoffeeScript都比有编译器VM的语言牛逼。你又没有Lua那样干净谁管你抄大学老师的底层技术, 大学生态70%都过时的好不好

(自设新语法真进ECMA262了,让JS成了当代更新最不寒掺的运行时)

回顾赶工的js parseInt('08') === 0,为了一个不存在的八进制功能,闹出和yaml的no一样的问题

肯定会有【语言律师】有这样那样的借口,比如py是渐近有类型 self. 只是首参约定,没法和全局slot区分,我QNMD,Ruby也有同样的问题,人家就是一个大小写解决了,没有它就没有GitHub。

py自己也是一个下划线和缩进就解决了java的【踩屎感】public+分号。 实在解决不了,就用 @row def Pair(A,B): 闭包模仿dict原型都行啊。 真的就没天理了,所以,可读性自然是被真正的人造人吊打, #PLT 都是人机怎么玩


许多CS学生喜欢从C出发,却忽略了Dataflow。他们其实是可以从 import ast 开始(做个模板匹配器),而不是以性能或原理性为理由选择以libc为运行时。 编程是一个snippet与handover的组装、即时检查问题,而不是编译。70%的人终生不碰libc供应链的成果比碰的多许多, 身为PLT人连正交分解和元编程都不会,不是很反身份么?

如果你写转译器,自举还能够测试往返编译的完备性,而如果你输出IR,说明你可能连r2、ImHex、cffi.{lua,py}都没用过,与C交互是填pattern,不是填指针加法,而且自制语言抢不了C的饭碗,还去凑热闹。

cffi比编译器作者更理解全貌。怎么就想不明白这回事呢?

如果你在乎原理,就应该实验手动把C的调用链转为(void*)deref,给forif写成goto,再asm("")处理下指针和寄存数算术,或者去 godblot.org 熟悉 call rax 的秘密,或者用pyjs写这些应用,而不是抢前人的饭碗然后白瞎了自己的时间。

编译器有一大堆是在js里写个 (...lit)=>env=>{subst/ccode.push} 能打5折的,还有2折是代码和语言特性本身对优化器的心智模型不友好的垃圾,有效的学习不到精力的30%,要知道C本身=>闭包和async都没有,感染者早被偶然复杂性宠坏了。libc打包本身就是废物,自带一个手搓版make不会让编译器多活一个月。

如果你连【语法结构】有几个都没摸清楚就开始照猫画虎的决定AST的repr(),那就没精力去想CST和rustfmt那样的工具链了,而且语言本身也会只剩下“平台垄断/集成度”的价值。集成度确实很好,但这不是学习者该追求的。 一个优秀的编程语言会先考虑写什么【方便】,然后是语法表现力,哪怕是AHK这样的野路子缝合怪也总是先考虑语意的集合


与其学什么编译原理,还不如学二开、源码调试定位、PoC和pyjs移植进目标、元编程,可惜这是工程能力和MVP策略问题,没法算分。

能自举的语法+库设计有几个?但是它们也是垃圾。 Tk的作者是有真本事,后面的人多是在完成作业,但它们的失败性是很难预见的(就是“写时复制”,暴力impl,rework,没redefine)

图灵完全会把bf和qemu归成一种东西,而且会给ML99.h不及格,【自举】就不一样。它一下就确保了实现本身简洁,与标准库能跑js级小应用。

元编程就是这样的,两个字就把泾渭分清楚了,这才叫PLT的能力。
duangsuse::Echo
#plt 最有趣的设计思考是: 我现在很希望通过献祭code的【写瓶颈】来“免费”提升可读性/整体把握的加分,但没找到方案。 代码是像人读时 (Markdown inline)、桌面运行时(F12) 那样编辑的,所以问题不在如何学BASIC/COBOL那样膨胀关键字的长度。 多语种利用的是autofix REPL,不是手写。 唯一的思路是从pyjs转译并展开 e.on(), a.filt() 这些常见接口到cyy的生态库,但扩展性和类型安全真很考验宏系统(forif里的.on也要展开)。把类型检…
#kt #design

用中文读代码,是一个【语法+视觉边界感】的设计问题,同时是一个【写比读难优化】的踩坑问题,而不只是词法和语序的替换。

这方面典型的负面案例,就是OOP和FP的始祖——Smalltalk、Lisp,可以拿 emojicode.org 的 say(🔤Hi!🔤) 来形容——对,读起来就是这种感觉。甚至你没有输入法。 许多 #PLT 人只知道词法语法,为了写个亲爱的parser用尽全身力气(写“虚拟机壳”),却不明白人眼人脑的【感知】。



语感差异在编程里,不是特别重要,尤其是不值得为了套皮而打乱语序。

比如 for x in 图表xs: 或 对xs里的x: ,我的选择是让所有套皮都基于数据流/管道感,for降级为函数,而不是制造分裂

类似的事情,其实决策并不是很容易。 😨

比如 OOP this 的写法(u参数),我近几年改了五版 (可能是黑历史了,但确实在全语言全文化killer诞生之前,都在纠结)

- 像Kotlin那样,给 class T{fun op} 和 extfun T.op; T.()->Res 分开的
- 去掉箭头类型,用 hex: [Int Str F.n1] 或 toHex: [Int Str F.u1] 区分函数vs方法的 (从typer的实现反向优化的语法设计)
- 在js里用 (1).[_ => toStr(16)] 希望在库层面实现改绑定到首参数_的,还希望把div(p())的DSL也绑上
- 认为3参可以用ABC指代,所以 F.u1 是 An 而 F.n1 是A的,那时还叫 F.n1 vs N1, F.An1 vs F.n1 ,还和vec2的N2(x,y)撞车……
- A,An反过来指代的。因为咱发现, f.map(x=>) 一旦x是对象就会多写"x." 索性it默认this。 这里有Groovy的一个坑

直到:咱发现 u=you, ur 的网络语言,以及,把list,map从各种玄学优化(addr,表,行..)改到统称为 are,am,isMounter(diff赋值) ,这段历史,才彻底结束。

现在的OOP就是纯粹的封装。任何叫u的参数都免前缀(BELT作用域-而非LEGB),全局用 imp.alert() 调,成了和Ruby一样的约定优于配置。

可以直接加 fun op(u: T) 当extfun,F.u1只是FFI提示,让 .let .run 的差异彻底成为历史,[1 2 3]?.(u=>u+1) 和are(*对象)没差别


——就只是this变成u,simple but lethal。 为了这一碟醋,就可以百搭一堆配套。就像现代安卓把安装页变成安装框那样,够脑残,但直接消灭一堆额外需求。let/run/apply/also/with,直接合并吞掉。

全局进 imp.,裸名不可能是全局;u 是有名字的参数,被内层遮蔽报错了,外层随时能改叫 x =>,或者干脆写 u.field——永远有逃生口; —— 但你不需要明白这些深奥逻辑,就能知道you,这是合理设计。BELT这个想法比UFCS还好

这个经历让我深刻的理解了《人月神话》的程序员与普通的A player,有什么思想的不同,并且让我专心为【人类可解释】探索边界。 🤗
duangsuse::Echo
(1+1=2),就像一个【扫码器和打印机】,人手两次塞进“1”的二维码,嗡一声,弹出一片 “2” 的码。
#js #design

[{"role": "user", "content": "你好"}]


这个设计对多态的理解还挺欠缺的,可以说,害人不浅

[{"user":"你好"} ]
{ user: [{ text: "这是什么" }, { image: "..." }] }
{ assistant: [{ text: "..." }, { tool_call: {...} }] }
{ tool: { id: "...", result: "..." } }


所以我就说是误解啊,{"user":"你好"}又不只是str值可用,tool和图文并排,都可以做

这种类似于 wtf_checkbox=1 的数据建模…… 但凡value长的像一个下拉菜单,都要考虑key是否有必要存在吧

msgs.filter(m => m.role === 'user') 不如 msgs.filter(m => m.user?.let(u=>true) ) 可定制


{ type: "click", x, y } 这种可以有 name、timestamp、id 的确实该判定 ."type" ,其他时候,还是直觉更重要
这也是“平铺统一记录”和“公共信封 + 变体载荷”的权衡: { id, timestamp, event: { click: { x, y } } }

serde 里那场老争论:外部标签 vs 内部标签,还有如何利用json的动态类型? Anthropic 的格式其实也没逃掉,只是把多态下放到了 content[].type 里,上层还是 role 的谁在说话,以及内容块是什么。

🙉 或许有人认为,LLM event api 的核心又不是【数据类型】,而更像编排和Skill这些特性UIUX

但其实,连最基础的语言(好比 .py, .md 的层面)都没有审美,上层应用更是会让人费解,心累。

{ append: { text: "你好" } }
{ replace: { range: [0, 2], text: "您好" } }
{ cancel: { id: "task-1" } }
{ cancelled: { id: "g1" } }

vs 正统的垃圾
{
method: "update",
params: {
mode: "append",
target_type: "message",
content_type: "text",
value: "你好"
}
}


把我当成【方法参数】都不知道的傻逼。 真新手,也看不懂method何意味吧?

机器可以算而不必理解,人应该理解而不必实现。

接口究竟只是让机器接上,还是也要让人看懂、预测,并掌握它? 人上手不了的功能,放在那干嘛。

直到今天,在json动态类型的理解上,人们还不如bash的 flag vs option 清醒。 数据,键名,在我看来就是行为的名词化,但主流JSer只是为了RPC而序列化。

pyjs已经非常优秀了,可是dev还是设计不好状态和指令的接口。换成 java Go 只会更跌一个档次。 #PLT

材料优秀,并不会自动产生好的协议语言。不要为了让生成器少写几行代码,让每个使用者多做一遍语义编译。 😅

LLM们有再大的【隐藏层智能】,面对连发送队列、草稿防丢都不支持的【智能前端】,也会让人头疼。

优雅的心智模型(数据流)是一切的基础,

目前各家ChatUI和API都较难互通,一个文件访问也能锁死web版和Agent的护城河,也真是让人无语……

现在都在讲,“少抽卡” ,而基石是【选区】的确立,ChatUI要知道哪错了,具体改几项


但是,e2e的退化,比如从单页到可选择的对话环境,重新引入元素、位置、事件、样式表.. ,就不再是token一把梭了,对前端是很大的考验。 至于怎么分解【选区】,怎么为项目适配,更需要经验和洞察力。

所以别总想着AIGC质量对标天花板,学习成本只要有手就行
duangsuse
这样的软件工程,真的早点毁灭吧。 端到端的优化AI也完全可以生成啊
哀悼细节的消逝
原文:https://purplesyringa.moe/blog/grieving-the-loss-of-details/
阅读时间:4 分钟
分数:481 🔥

#design
作者把机器看作身体的延伸

我却厌恶机械化的代码,【人体不是机箱外边的挂件】,觉得Emacs是个UX很差的操作系统。 我是101% declarative ,完全自顶向下的思路

编程界的参差大抵如此