很久之前配过,但 tramp 会卡住,现在不清楚。直接 jdb/gdb 调试我也觉得挺好的。
没有cmake的地方可以用bear
另外交叉编译的项目下面可以建立个.clangd文件屏蔽架构相关选项:
CompileFlags:
Add: -Wno-unknown-warning-option
Remove: [-m*, -f*]
和 C 一样,把函数当方法。和早期 lisp 一样,用 list 和其他类似数据结构数据。erlang 有 list、tuple、HashMap,还有 @record
预处理器,能为 tuple 的 idx 命名。@record
类似 emacs lisp 的 make-record 创建 tag 不同的 vector,区别在于 erlang 那个 tag 都相同。不过在我看来使用 @record
略弱,纯函数的 erlang 改变 field 时尤其效率低,要除了更改项整个复制一份,所以只有 record 够小改变够少才有使用的价值。
1 个赞
Emacs+auctex写LaTeX,非常丝滑!
1 个赞
楼上 @StarSugar 说了 Erlang,我来补充一些,以及 Elixir 的情况。
Erlang 平台虽然没有 OOP 但是有比 OOP 更好用的模型,那就是 OTP,其中典型代表是 gen server.
简单来说
- 无状态的逻辑用 模块(namespace)+函数 来组织
- 有状态的用 gen server (轻量级进程) 来保存
- 数据模型用 list (链表), tuple (数组) 和 map 来表达。你想要自定义一些数据类型的话可以用 record (基于 tuple) 或者 elixir struct (基于 map)。
- 使用函数参数模式匹配来做简单的多态(elixir 还额外引入了 protocol 多态)
- 一些通用的模型可以抽象为 behaviour(interface)
稍微展开说下 gen server,它是一个 Erlang 进程(类比为对象)(下面括号中的内容用是类比 OOP 中的概念)
- 它有自己的状态(对象的实例变量)
- 有 init 函数(构造方法)
- 有 terminate 函数(析构方法)
- 有 call (同步阻塞调用对象方法) 和 cast (异步调用对象方法,返回值为空)
它(OTP)比 OOP 多的东西(下面括号里面的东西是比喻)
- 监督者 supervisor(包工头)。它的作用是负责当某个进程由于某种原因挂掉了之后,重新创建一个新的进程,并恢复到挂掉之前正常的状态。(重启一下)(工人不干了之后再招一个新的)。而且监督者还能有上级监督者,监督者挂掉之后由上级负责重启,一层一层的构成一个监督树 supervision trees(像是一个企业的组织结构)。
- 无共享变量。进程之间仅可以通过 call / cast 之类的方式通信,极大的方便了多线程、分布式编程,降低代码理解难度。
Elixir 沿用了 Erlang 中所有的概念,又额外的扩展了一些
- struct,基于 map 的结构体,用来替代 erlang record
- protocol,基于 struct 的多态
5 个赞