メタ-にんち【メタ認知】(meta-cognition)自分で自分の心の動きを監視し、制御すること。広辞苑第六販ううーむ。見ないほうがよかったかも。Wikipediaの方がまとまっているかもしれない。言いたいのはこういうことではない。プログラマが出会うメタプログラミングをやっていると、メタという概念には日常的に出くわす。文字列には、普通ではない文字、「メタ文字」というものが登場する。World\n";バックスラッシュ「\」がメタ文字と呼ばれる。メタ文字は、文字とは違ってそのまま印字されない。直後に出てくる文字との組み合わせによって特別な意味を持つようになっている。「\n」は改行を表す、と決まっている。バックスラッシュ自身を表示したいと思ったら「\\」と記さなければならない。メタ文字のメタな意味を打ち消さないといけないのだ。正規表現にもメタ文字はたくさん登場する。「.」は任意の1文字という意味。「*」は直前の文字の0回以上の繰り返しという意味。「[xyz]」はx、y、zのいずれか1文字という意味だ。文字を示さないメタ文字もある。「^」は行の先頭を意味するし、「$」は行末を意味する。これは相当に抽象度の高いメタ文字だ。これらを使いこなすことは、かなり抽象的な思考能力を必要とする。慣れれば、一見意味不明なREも瞬時に理解できるようになる。適当に書いただけで意味はないけど自分がいつのまにやら抽象的な概念に慣れ、メタ認知に慣れてしまっているのは、どうやらこの辺の事柄をプログラミングを通じて身に付けたのが理由のように思える。関数の定義と呼び出しの関係もそうだ。プログラミングにおいて関数は、処理を抽象化したものだ。初歩のプログラミングでは、命令を順番に書き連ねるだけかもしれない。命令というのも結構抽象度が高いものだが...。これに加えて、再帰呼び出しや相互に呼びあう関数を使いこなすようになると、さらに抽象度が高くなっていく。高校生の頃に学んで好きになった再帰の定義はこんなものだった。1;}脱線だが、最初にこのコードを実装したときはForthで書いた。ForthをBasicで実装して、その上でWordを定義したのだ。okちょっと調べてみたら、gForthとは互換性がなかった。議論をメタに捉える課題や問題について議論をしていると、課題や問題の記述(あるいは口述)において、その課題や問題をメタに定義しないと対象を捉えきれないと感じることがある。議論の相手とそういう認知が共有できていないと、なかなか同じレイヤ、あるいはメタなレイヤで議論できない。プログラマ同士だと割にすんなり受け入れられるのだが、そうでないとそうでないことが多いように思うのだ。これは、前述の抽象的な思考の経験の有無から来るのかもしれない、と最近思うようになった。自分がこの思考法を確立するまでの経験を振り返ってみると、これを他人に押し付けるのは相当に無理があるなと言わざるを得ない。これを簡単に説明し納得してもらう方法もなさそうだ。いうわけでメタに捉えた上で、簡素に伝える説明を考えたほうが早そうだ、ということになる。抽象を具象に落とすそこで抽象度の高い話を具体的な例に落としてみるのだが、ここで問題が発生することがある。不適切な例を挙げると誤解が生じてしまうのだ。そもそも対象を観察しているときに、特定の側面・性質を抽出しているわけだから、対象そのものを見ていればいいのだが、別の例を挙げて共通点を引いてこようとするときに間違ったものを引いてきたり、間違って例示してしまったりすると誤解が生まれてしまう。いうことがない様に、注意深く具体化していかないと、せっかく抽象化していこうとしているのにうまくいかない、ということになってしまう。最終的には抽象化して、一般化していくというのがゴールなのだから、具体的なままで置いておくこともできない。結局は抽象的な概念を分かりやすくまとめていかなければならないが、ここは必要に応じて相手に理解してもらわなければならないということにもなるかもしれない。そのときには、きちんと「抽象とは」という話を事前に片付けて、メタな話を終わらせておかなければならいのではないか、と思う。