Clojure-macros

提供:Dev Guides
移動先:案内検索

Clojure-マクロ

どの言語でも、 Macro はインラインコードの生成に使用されます。 Clojureも例外ではなく、開発者にシンプルなマクロ機能を提供します。 マクロは、コード生成ルーチンを記述するために使用されます。これにより、開発者は開発者のニーズに合わせて言語を調整する強力な方法を提供できます。

以下は、マクロで使用できるメソッドです。

デフマクロ

この関数は、マクロを定義するために使用されます。 マクロには、マクロ名、パラメーターリスト、およびマクロの本文が含まれます。

構文

構文は次のとおりです。

(defmacro name [params*] body)

パラメータ-「名前」はマクロの名前です。 「params」は、マクロに割り当てられたパラメーターです。 「body」はマクロの本体です。

戻り値-なし。

これがどのように使用されるかの例は、次のプログラムに示されています。

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (defmacro Simple []
      (println "Hello"))
   (macroexpand '(Simple)))
(Example)

出力

上記のプログラムは、次の出力を生成します。

Hello

上記のプログラムから、マクロ「Simple」がインラインで「println」「Hello」に展開されていることがわかります。 マクロは関数に似ていますが、マクロの場合にフォームへの引数が評価されるという唯一の違いがあります。

マクロ展開

これは、マクロを展開し、プログラム内にコードをインラインで配置するために使用されます。

構文

構文は次のとおりです。

(macroexpand macroname)

パラメータ-「マクロ名」は、展開する必要があるマクロの名前です。

戻り値-展開されたマクロ。

これがどのように使用されるかの例は、次のプログラムに示されています。

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (defmacro Simple []
      (println "Hello"))
   (macroexpand '(Simple)))
(Example)

出力

上記のプログラムは、次の出力を生成します。

Hello

引数付きマクロ

マクロを使用して引数を受け取ることもできます。 マクロは任意の数の引数を取ることができます。 次の例は、引数の使用方法を示しています。

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (defmacro Simple [arg]
      (list 2 arg))
   (println (macroexpand '(Simple 2))))
(Example)

上記の例では、Simpleマクロに引数を配置し、その引数を使用して引数値をリストに追加します。

出力

上記のプログラムは、次の出力を生成します。

(2 2)