4

私は同じ長い署名の多くの機能を持っています(簡単にするためにここでは短縮されています):

(defn f 
      [x & {:keys [a b c d e f g h]
            :or [a false b false c false d false e false f false g false h false]}]
      a)

私は、マクロ、関数、またはdefを使用して、この共通の署名を事前に保存することを望んでいました。

(def args `[a b c d e f g h])

(defn args [] `[a b c d e f g h])

(defmacro args [] `[a b c d e f g h])

しかし、私が接続したとき、それらのすべて

(defn f 
      [x & {:keys (args)
            :or [a false b false c false d false e false f false g false h false]}]
      a) 

次のようなエラーが発生しました

CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(NO_SOURCE_PATH:1) 

だから私の2つの質問は次のとおりです。

  1. そのような一般的なものを定義して使用する方法はありますargsか?

  2. そのようなanを定義できる場合は、 paramsargsを取得するためにそれを減らしたいと思います。これはどのように行われますか?(の作業定義が奇妙で、これがもはや単純ではない場合に備えて、私は尋ねています。):or[a false b false c false d false e false f false g false h false]args

4

1 に答える 1

6

問題は、aの引数ベクトル内のものdefnが評価されないことです。defnただし、次のように、の独自のバージョンを定義できます。

user=> (defmacro mydefn [name & body] `(defn ~name ~'[a b c] ~@body))
#'user/mydefn
user=> (mydefn f (+ a b))
#'user/f
user=> (f 1 2 4)
3

~'引数の必要性に注意してください。それ以外の場合、syntax-quote(`)はシンボルをuser.aetcに修飾します。

于 2012-10-17T16:14:29.223 に答える