メタプログラミングのソースを表示
←
メタプログラミング
移動先:
案内
、
検索
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
要求した操作を行うことは許可されていません。
このページのソースの閲覧やコピーができます。
'''メタプログラミング''' (metaprogramming) とは[[プログラミング (コンピュータ)|プログラミング]]技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれた[[マクロ言語]]によって行われる。 代表的なメタプログラミングの例は[[LISP]]のマクロである。LISPではデータ、コードが全て[[S式]]で表現されるが、マクロによりS式が言語処理系に解釈される前に別なS式へと変換することができる。これにより例えば、 (defstruct point (x 0) (y 0)) という記述から * 構造体定義 point型 * コンストラクタ make-point (省略時の初期値は0, 0) * アクセサ point-x point-y * 複製 copy-point * 述語 point-p が自動的に生成される。 これがメタプログラミングと呼ばれるのは、「自動生成が言語組み込みの機能ではなくLISPのマクロによって記述されており、必要なら同様の機構をプログラマが定義できる」ためである。これは事実上言語文法の拡張に等しく、非常に強力なプログラム能力を得ることになる。反面、マクロは本来の文法を逸脱した字句の置き換えであるため、コードが「記述どおりでない」動作を行うことを意味している。そのため一般に必要でないメタプログラミングは避けられるべきとされる。 たとえば、文字列を整形して出力するformat関数 (format t "hello,world") を用いた例<ref>Peter Siebel: Practical Common Lisp 第三章の8から引用</ref>を紹介する。LispのS式がLispフォームになるためには、「S式の最初の要素は(関数、マクロ、特殊フォーム)のいずれかではならない。」しかし、 (defmacro backwards (expr) (reverse expr)) を定義すると、以下のように書ける: (backwards ("hello,world" t format)) このことは、Lispのマクロが、<b>上のかぎ括弧「」で括った言語仕様を変更し、独自の文法を作り上げた</b>とも考えられる。しかし、この文法は、通常のLispにおいて期待されるような構成をしていない「記述どおりでない動作を行うプログラム」の一例であり、コードの可読性を損なう恐れのある不必要なメタプログラミングである。 メタプログラミングの他の例としては[[C++]]における「[[テンプレートメタプログラミング]]」などが挙げられる。 == 脚注 == <references/> == 関連項目 == * [[Common Lisp]] * [[Scheme]] * [[LISP]] * [[REBOL]] * [[クワイン (プログラミング)]] * [[部分評価]] * [[ドメイン固有言語]] - メタプログラミングにより構築することもできる。 [[Category:プログラミング|めたふろくらみんく]] [[Category:プログラミングパラダイム|めたふろくらみんく]]
メタプログラミング
に戻る。
案内メニュー
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
その他
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
新しいページ
最近の更新
おまかせ表示
sandbox
commonsupload
ヘルプ
ヘルプ
井戸端
notice
bugreportspage
sitesupport
ウィキペディアに関するお問い合わせ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報