如何在clojure中避免重复的函数参数?

Jas*_*ese 3 clojure

我有一系列功能,它们都做不同的事情但传递相同的数据.假设我有以下作为参数向量.

[{: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的错误.

  • 有没有办法让矢量成员作为符号?
  • 有没有比我建议的方法更实用的方法来完成函数参数代码膨胀减少?

Ale*_*ler 5

引用一个向量会使它的符号没有被评估,但是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)