你可以为你定义的任何函数做这样的事情
(defn f
;; The "real" f
([x y z] (whatever-f-does x y z))
;; Overloads to "automagically" construct partial applications
([x] (partial f x))
([x y] (partial f x y)))
当然,这可以用宏来抽象,但这就是模式。
我不知道这是否是个好主意。这可能不是大多数 Lispers 对大多数功能的期望,但我认为它在某些情况下可能非常有用。
这种方法也有一些限制。以下是我想到的几个:
- 它仅对您编写的函数有用,或者碰巧由也使用该模式的其他人编写。
- 当涉及多个参数时,它会引入歧义(即,如果 f 是 2 个或 3 个参数的函数,(fxy)是 f 的完整应用还是部分应用?)
- 它也不能真正处理可变参数(你会遇到同样的歧义问题)。
也许更好的方法是引入不同的函数来执行部分应用程序。例如:
(defn partial-f [& args] (apply partial f args))
当然,您会想要选择一个比“partial-f”更好的名称。例如对于地图,您可以使用映射器。对于地图索引,也许索引映射器是有意义的。