(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

関数リストを適用する方法

stackoverflow.com

以下のように関数のリストを作って map で適用しようとすると 5 のリストが返ってきてしまう。

(def ops '(+ - * /))
(map #(% 2 5) ops) ;=> (5 5 5 5)

なんで関数呼び出ししてるはずなのに 5 のリストが返ってくるのか理解できないんだけど、という話。

回答者 Lee 曰く、それは関数リストではなくてシンボルのリストになってしまっているし、シンボルは AFn を実装しているから第 1 引数の中にシンボルがあるか見に行くけど、もしないなら第 2 引数を返すんだよと返しています。

回答者 bsvingen 曰く

This works: (map #(% 2 5) [+ - * /])

This does not: (map #(% 2 5) '[+ - * /])

Nor does this: (map #(% 2 5) '(+ - * /))

これはちょっと興味深いというか、リストマジック感ある。この辺の挙動も全部理解しないとダメですね。
で、更に本当にどうしてもリストを使いたいならこういう書き方もできる、としてます。

(map #(% 2 5) (list + - * /))

回答者 sveri 曰く juxt という関数使えばいいんじゃね、とのことで。

(def funcs (juxt + - * /))
(funcs 2 5)

勉強になりました。