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 と誤認するため。これで関数型言語なんて詐欺だ。