8

マクロから始めて、リストから最大数を返す簡単なマクロを作成しました。

(defmacro macro-max [list] (apply max list))

同じことをする関数を作れば、そうなります。

(defn  macro-max [list] (apply max list))

Clojure を調べているだけなので、よくわかりません。

専門家にはまったくばかげているように聞こえるかもしれませんが、マクロの代わりに関数を定義できるようです。

4

4 に答える 4

1

マクロは関数です。違いは評価時間だけです (マクロはコンパイルのステップであるマクロ展開時に評価され、関数は実行時に評価されます)。また、マクロは S 式で動作します (したがって、マクロは、すべての単一の引数を引用符で囲む関数に少し似ています。つまり、任意のマクロ(mac a b)を簡単に関数に置き換えることができます(fun 'a 'b)

于 2013-04-15T12:16:19.813 に答える
1

関数でできる場合は、必ず関数を使用してください。Clojure ライブラリはこの規則に従っているため、おそらくそこで定義されているほとんどのマクロは実際には関数として表現できません。->>マクロを取ります:

(->> 
   "abcdefghij"
   (take 5)
   (drop 3)
   (apply str))

上記は「de」に評価されます。マクロの引数はそれ自体で評価されると意味をなさないため、関数はそれを行うことができません - 評価される(take 5)とエラーが発生します。

マクロが行うことは、(前の式をフォームの最後の引数として挿入することによって) 評価される前にフォームを変更することです。これは関数ではなく、マクロだけができることです。

于 2013-04-15T07:19:58.487 に答える