目次
- たった1行からYコンビネータにたどり着いた話
- まず結論:
consoleはどこから来たのか? - 正体:
consoleは「ホスト環境からの贈り物」 - 見方を変える:これは「自己言及コード」だ
- 自己を渡す:より“深いコード”たち
- 技術を超えて:本質に迫る3つの問い
- 教える立場なら:このコードで何が教えられるか
- まとめ:1行で思考を深掘るということ
- 明日からできる“深掘りチェックリスト”
- さらに学びたい人へ:自己言及・Yコンビネータの沼
たった1行からYコンビネータにたどり着いた話
JavaScriptの"ふとした1行"に、深すぎる哲学と仕掛けが詰まっていた。
console.log(console);
「なんだこれ、ネタでしょ?」
そう思ったあなたへ、問いかけます。
「この1行、なぜ動くのか?」と真面目に考えたことがありますか?
- なぜ定義してないのに使える?
- 中身は何?どこから来た?
- そもそも、これは"自己参照"じゃないのか?
この記事は、たった1行のコードから、環境・仕様・再帰・思考法・自己言及と、あなたの思考を深い階層へ誘います。
まず結論:consoleはどこから来たのか?
console.log(console);
このコードは「console オブジェクト」を、console.log で出力しています。
結果(Chrome):
Console {log: ƒ, error: ƒ, warn: ƒ, ...}
でもここで終わってはいけません。
これは JavaScript の言語仕様では 定義されていないオブジェクトです。
では、なぜ動くのか?
正体:consoleは「ホスト環境からの贈り物」
-
consoleはブラウザや Node.js が提供する、グローバルオブジェクト - JavaScript (ECMAScript) の仕様には、console は存在しません
実行環境が「開発者向け標準出力」として用意したものです。
確認コード:
typeof console // "object"
window.console === console // true (ブラウザ)
global.console === console // true (Node.js)
つまりこれは、環境に依存する"影の存在"。
見方を変える:これは「自己言及コード」だ
console.log(console);
──これは、「自分自身を、自分で出力している」コード。
このような自己参照・自己評価的な構造を持つコードは、再帰や関数型プログラミングの核心的な概念にもつながります。
自己を渡す:より“深いコード”たち
1. 関数に関数自身を渡すと?
function self(f) { return f(f); }
console.log(self(self));
- これは 自己適用関数(Self-Application)
-
self(self)→self(self)→ …で、無限再帰 - 結果は:
RangeError: Maximum call stack size exceeded
この構造は、Yコンビネータ(固定点コンビネータ)にも近いもの。
関数に「自分自身」を渡すことで、名前を持たない関数に再帰的性質を与えるという、非常に高度な関数構造です。
2. 自分自身を文字列化したら?
const json = JSON.stringify(JSON);
console.log(json);
-
JSONはグローバルオブジェクト -
JSON.stringify()はオブジェクト → JSON文字列への変換
出力は:
{"parse":{},"stringify":{}}
なぜ中身が空?
関数はJSON化できないからです。
ここでも「自己を扱う難しさ」が顔を出します。
技術を超えて:本質に迫る3つの問い
1. 「これはどこから来たのか?」
→ グローバルにあるから当たり前? 本当に? 誰が定義した?
2. 「なぜこうなるのか?」
→ なぜこの出力? なぜこれは評価され、これはされないのか?
3. 「他でも応用できるか?」
→ この構造、別の言語でも使える? 再帰・自己参照のパターンは?
教える立場なら:このコードで何が教えられるか
新人や学生に見せてほしい。
console.log(console);
この1行を見せて、問いかけてみてください。
- これって誰が定義したの?
- なぜ使えるの?
- 他にも「定義してないのに使える」ものってある?
「答えを教える」のではなく、「問いを投げる」。
それが、本質的な理解への導線になります。
まとめ:1行で思考を深掘るということ
console.log(console);
このコードを笑い飛ばすだけの人と、
そこから再帰・環境・自己言及の構造まで掘る人とでは、
学び方に圧倒的な差が生まれます。
明日からできる“深掘りチェックリスト”
- これは「なぜ」動くのか?
- どこで定義されてる? 誰が用意した?
- 環境を変えたら動く? 動かない?
- 他の言語だとどうなる?
- この構造、別の場面で応用できる?
さらに学びたい人へ:自己言及・Yコンビネータの沼
- 関数型プログラミングの基礎(クロージャ・評価戦略)
- Yコンビネータで学ぶ無名関数の再帰
- 自己反映するオブジェクトとオントロジー設計
あなたの「なんとなく使っていたコード」は、思考の鏡になるかもしれません。