大家都是用EMACS做哪些语言的开发?

很久之前配过,但 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 个赞