我有一系列功能,它们都做不同的事情但传递相同的数据.假设我有以下作为参数向量.
[{:keys [x y vx vy x-min x-max y-min y-max] :or {x-min 0 x-max c-width y-min 0 y-max c-height}}]
Run Code Online (Sandbox Code Playgroud)
基本上你不想重复多次的事情.我有一个想法是做一些像.
(def func-args [x y z])
(defn func func-args (+ x y z))
Run Code Online (Sandbox Code Playgroud)
然后,如果我有类似的功能,我可以重新使用func-args.但是,前一个示例的第一行引发了无法解析符号x的错误.
引用一个向量会使它的符号没有被评估,但是defn在定义中需要一个文字向量,所以这不会像你建议的那样工作.
最简单的方法是创建一个宏.宏可以让您创建自己的语法.在Clojure中不鼓励使用这种(照应式)宏,因为很容易遇到为您创建符号的宏的问题.
就像是:
(def cheight 100)
(def cwidth 100)
(defmacro defx [name & body]
`(defn ~name [{:keys [~'x ~'y ~'vx ~'vy ~'x-min ~'x-max ~'y-min ~'y-max]
:or {~'x-min 0 ~'x-max ~'c-width ~'y-min 0 ~'y-max ~'c-height}}]
~@body))
(defx func (+ x y))
(func {:x 1 :y 2}) ;; 3
Run Code Online (Sandbox Code Playgroud)