简而言之,在发明cabal的那群人眼里,整个构建过程大概是个纯函数,然而事实上它显然不是。这导致以下事情,cabal一件都做不好:
复用已安装的包,为了规避潜在的dll hell,而且重复构建包后,之前构建的同一个包并不会被抛弃,因为cabal分不出来之前的包是不是可以被抛弃。
手动升级/降级某个依赖项,原因同上,cabal想要实现自动化,但是它只管构建,无法追踪目前已经被构建的那些依赖项究竟被谁依赖。而跟ghc绑定的ghc-pkg这东西只管注册,包的事情一点不管。用nix当haskell包管理器甚至更舒服。
在固定ghc版本的前提下满足依赖项,因为包的兼容性跟ghc版本挂钩。所以,你往往得下多个版本的ghc。如果你采取只依赖系统包的方案,那么请准备多个容器/快照。在cabal v1有个功能叫做sandbox,类似pyvenv的容器环境,v2又给淘汰了,原因同上。
清理构建缓存,cabal只有install,没有uninstall。唯一简便的清理方法是开发结束后删掉整个.cabal/store目录。而且,cabal install --lib还会产生更恶心的副作用。
总而言之就是,c++开发你手动搭建项目要担心的诸多事情,你用cabal,甚至搭上stack,ghcup这一整条工具链,还是一点也不省心。但是你如果选择了cabal,那么你可以自由操作的范围,很抱歉,被这条工具链约束死了。(实际上,cabal允许你越界,但这样的后果是,cabal有时候连原地构建一个包都做不好)
我到现在都想不明白为什么Haskell会选择一条这样的构建工具链,但凡它能让人省点心,恐怕现在Haskell操作系统早都写出来了。如果有Haskell操作系统,哪怕它对dll hell跟c++一样束手无策,也不会比c++更烂了。
4 个赞
0af
2025 年1 月 20 日 14:38
62
不是很了解 Haskell,但听说 Haskell 还有一个叫 Stack 的工具,话说这个怎么样?
Hell joke :: cabel hell → stack hell
2 个赞
回忆起当初看到 cabal 的 install / v1-install / v2-install / new-install 时的那个抓耳挠腮的自己了😂
1 个赞
LdBeth
2025 年1 月 20 日 23:29
66
网络烂梗打字通,试打字手速。结论:Model M 太硬打不动,得上 Beamspring。有简中全拼/双拼,英文,日文罗马音三种词库,我已经不太会用拼音了玩的英文的。
为了冲高分,专门研究了 QMK 的用法,编译了个专用固件
GitHub - LdBeth/QMKBEAMS: QMK keymap for Model F Labs Beamspring R1
1 个赞
n3r0
2025 年1 月 23 日 08:53
68
一直在写客户端和前端,放假打算尝试下新的后端框架,换个视角感受一下开发的工作流。
顺便多看看好的产品,培养一下自己的品味
SPQR
2025 年1 月 24 日 07:12
69
提个小建议,可以把debounce method换成 asym_eager_defer_pk
,能再减小几毫秒按键延迟
1 个赞
LdBeth
2025 年1 月 24 日 07:20
70
我觉得可能内存不太够用,ATMega32u2 只有 1kb,读取电容按键用的自定方法又比较吃内存,我把 dynamic macro 设成 60 都能把它搞砖。
SPQR
2025 年1 月 24 日 08:31
71
好吧,我还以为是普通的机械键盘,不过如果你手上有ISP这种工具,可以尝试把bootloader改成占用体积更小的,能再挤出几百kb Select Vial GUI features (for size) - Vial
LdBeth
2025 年1 月 24 日 10:15
73
SRAM 和 flash memory 是两回事,bootloader,程序机器码和静态数据比如 string literal,声明了 PROGMEM
的 const array 只占 flash memory,但 C stack 和要能动态修改的全局变量就要用 SRAM 了。实际上 flash memory 我只用到 50%,但为了读按键 matrix 常驻 SRAM 的数据就要 300 byte 左右,还不包括 QMK 本身功能用到的全局变量。
SPQR:
不过如果你手上有ISP这种工具
But as has already been established, there is no ISP header on the Xwhatsit board design. And in the case of this board, trying to add ISP connections means soldering to 6 pins on a tiny surface-mount QFN package.
dynamic macro 用的 buffer 也是需要常驻 SRAM 的全局变量,只开最基本的功能每记录一个 key code 也要 6 byte,只用 40 个按键的 buffer 就要 240 byte,加起来就把 1024byte 的 SRAM 用差不多了。
后面要是換成用上了 RP2040 的控制器(已经有人做出来了),264KB SRAM 就可以隨便霍霍了。
yep,我认为构建系统,特别是大型项目的构建系统,本身就是一个复杂的交互程序,而非依赖推导器。make不具备系统编程能力,而且完全不感知副作用。shell可以提供部分的系统编程能力,但是不具备复杂数据结构的表达能力。与其再去外挂cmake,ninja之类的一大堆构建脚本生成器,或者基于json/python配置的项目框架,还不如统统扔掉,直接把项目的构建系统作为一个需要去编程设计的部分。虽然c默认不是lazy evaluation,这不代表hack in compile time不能做。
我年后发scheme-langserver的新版本,里面的hover能显示类型推断的结果。
SPQR
2025 年1 月 24 日 11:25
76
学习了,不过确实,现在国产RP2040克隆便宜性能强而且刷固件方便,很多还在用atmega32u的开源键盘项目都该升级下了。
彩色的缩进?啊……我自己控制的。不过后面scheme-langserver会提供这个功能的,因为这个需要一些semantic信息
搭车问:其他语言也可以弄这种彩色缩进么?用什么插件?