completing-read

引数の TABLE (document によっては COLLECTION) は補完をする関数でもいいらしい。三つめの引数が t か nil かで返す型を変えないといけない。C-h f completing-read を見ると、TABLE の semantics は try-completion と all-completion を参照しやがれと書いてあるんだけど、それを辿ると try-completion には第三引数は nil、all-completions は t で呼ぶと書かれてる。いやしかしこれはわかりにくいだろ。二つの semantics をあわせて一つだと気づくまで一時間以上嵌まってしまった。
そして関数引数を lambda で生成して渡せない。やる気あんのかお前。

(completing-read
     "args: "
     (lambda (str a b)
      (if b
          '("test1" "test2")
        "test")))
-->
Debugger entered--Lisp error: (wrong-type-argument listp lambda)
  minibuffer-complete()

理由は lambda が tagged list として実装されてるから alist の list と誤認するため。これで関数型言語なんて詐欺だ。