把嵌套函数改用 Threading Macro

上面刚刚写的,感觉可能用处不大,Clojure、Elixir 社区可能觉得 ->|> 很好使,但我觉得不适合 Emacs Lisp,事实上我从来就没有用 ->,因为:

  1. 对参数位置有要求,-> 必须是第一个参数,这就要求 API 把重要参数放到第一个位置,而 Emacs Lisp 没这个习惯,对比同一个 API:

    ;; Emacs Lisp
    (string-prefix-p PREFIX STRING &optional IGNORE-CASE)
    
    ;; Clojure
    (clojure.string/starts-with? s substr)
    
    # Elixir
    starts_with?(string, prefix)
    
  2. Emacs Lisp 的 Eldoc 目前不支持 Threading Macro,参数提示会出错:

    (Eldoc 错误地把 TRIM-LEFT 当作 STRING

这个东西dash就有吧. 漏看了抱歉

->默认把左端输出拼接到第一个参数位置, ->> 默认放最后, → 允许你用it作为标识来指定位置.

不过这三个macro的本质都是组装列表, 和FP感觉扯不上太大关系


用pipeline主要还是可读性比较好, 而且有-->参数位置也不算什么大事

嗯,我的看法是 -> 等 Threading Macro 不会在 Emacs Lisp 社区普及,达到 Clojure、Elixir 那种地步,因为缺少普及的土壤[1],而不是因为 Threading Macro 本身。


[1] 所谓「土壤」,这有个 Elixir 的例子,Elixir 似乎只有 |>,相当于只有 ->,甚至:

Elixir recommends the “subject” argument to be the first one,

Pipe operator and multiple parameters · Issue #1156 · elixir-lang/elixir · GitHub

毕竟elisp按真正fp写法写出来的东西就会慢…

用过ruby之后,觉得这种写法是很顺理成章的事情