めたぷろぐらみんぐ
これがめたぷろぐらみんぐに該当するかどうか2日ぐらい考えてます。
typedef char x<:100:>; typedef char y<:200:>; typedef struct <% x x; y y; %> z; #include<stdio.h> int main() <% printf("%d + %d = %d\n", sizeof(x), sizeof(y), sizeof(z)); return 0; %>
用途は、「定数の畳み込みをサポートしていないコンパイラでも使えるコンパイル時足し算」です。
……こらそこ笑うところです石を投げない。
真面目に考えると、足し算、掛け算(配列)、最大値(union)ができて、引き算(offsetof)は恐らく「定数の畳み込みをサポートしていないコンパイラ」では思うように動いてくれない予感です。割り算はもうどうしてよいのかわかりません。それからサンプルの値が4の倍数であることは偶然ですので追求してはいけません。
もっと真面目に考えると、コンパイル時プログラミングではあっても高位ロジックでは無いような(ry
ううむ、メタプログラミングとは難しいものです。
例えば適当に検索したら出てきたRubyの例。
class Person attr_accessor :name, :age end
思いっきりメタプログラミングと書かれていますが、動的言語で実行時にコード弄ったりするのはメタプログラミングと呼んでよいのでしょうか。
これがメタプログラミングなら、Objective-Cで実行時にクラス情報を書き換えたりするのも、機械語レベルでパッチを当てるのもメタプログラミングですよねー。
次のページにはリフレクションとか書かれてたりして、リフレクションがメタプログラミングならその辺の.dll読み込んだだけでメタプログラミングですよねー。
その先にはDSLとか書かれてたりして、DSLが(ry
あんまり参照したくないのですがWikipedia。
メタプログラミング (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
この定義に従うと、次の暗黙の了解がありそうです。
- メタプログラミングを使わないでだらだら書くこともできる。
実行時にコード弄ったりリフレクション使ったりは、それを使わずに同じ事をする代替手段が無い場合もありそうですので、メタプログラミングっぽくない。
DSLは(私の直感に反して)メタプログラミングっぽい。
それから、evalは、evalを使うことでラクしているならメタプログラミング。一方CGIからJavaScriptを生成するようなのは、JavaScriptを生成せずに同じことをする手段が無いのでメタプログラミングっぽくない。evalでも、Perlで構造化例外処理の代わりにevalを使うのはメタプログラミングっぽくない。
個人的には「コンパイル時に展開される」「追加のプリプロセッサは使わない」「静的型言語」とか色々条件を付けたいのですが、世間的には専用のプリプロセッサでDSLを展開したりするのも、動的型言語でもメタプログラミングと言うのでしょうか。うーむ。
追記
あろはさんにコメントいただきました。
「プログラム」 をデータとして扱うプログラムを書くことが 「メタプログラミング」 です.一般に 「対象 「 対象 X を記述したもの 」を記述したもの」 を 「メタ X 」 と言う気がします (無限に続けられる入れ子構造になる).
http://twitter.com/alohakun/status/1348065546
LoadLibraryはメタプログラミングですね……!!
なんだ、めたぷろぐらみんぐなんてかんたんだったんだなあ。