Quine Advent Calendar 2014 Day 100: （ほぼ）一人Advent Calendarを100日続けて学んだこと

(function f() {/*

はじめに
===

去る2014の12月1日から今日まで100日間、ほぼ毎日（25日目だけ@mametterさんに書いていただきましたが）[Quine Advent Calendar 2014]を更新し続けていました。

その結果として学ぶことがいくつかあったような気がする（なかったような気もするのですが）、この節目に何かちゃんとした記録を残しておきたいので、こうして記事にさせていただきます。

- [GitHub](https://github.com/MakeNowJust/quine_advent_calendar_2014)
- [Adventar](http://www.adventar.org/calendars/645)


世界の限界を見にいきませんか？（ポエム）
===

<div align="center">
  <img alt="wittgenstein.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/68263/b5bb27a1-2204-d0d1-89d4-12a4240661b6.jpeg">

  <blockquote>
    <p>
      5.6 <strong>私の言語の限界</strong>が、私の世界の限界を意味する。
    </p>
    <p>
      <em>5.6 Die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt.</em>
    </p>
    <p>
      ——<em>ルートヴィヒ・ウィトゲンシュタイン『論理哲学論考』より</em>
    </p>
  </blockquote>
</div>

上の引用は、かのルートヴィヒ・ウィトゲンシュタインの『論理哲学論考』——論考の一命題です。
『論理的哲学論考』は前期ウィトゲンシュタインの代表的著作であり、いくつもの命題が並べられる、という当時から現代に至るまでに類を見ない形式のこの文章は、今もなお多くの人々を魅了し、深い思案へ誘い続けています。

ボクが[Quine Advent Calendar 2014]の100日目たるこの記事の冒頭にこの言葉を持ってこようと思ったのは、他でもありません、[Quine Advent Calendar 2014]と並行し、時に直交しながら更新し続けてきた[Quineリポジトリ]の存在があるからです。

[Quineリポジトリ]は、ボクが書いた様々なプログラミングでのQuineを置いおいているリポジトリです。

また、[Quine Advent Calendar 2014]はQuineを書いてその簡単な説明と共に公開する、というのが主な内容です。しかし、何しろ更新する人がボクしかほぼいなかったので、時間的な都合もあって複雑なQuineを作っている余裕もなく、結果的に今までに書いたことのないプログラミング言語でQuineを書いて公開する、というのが大半を占めることになりました。

その結果、ボクは12月の半ば辺りから毎日のように、まだ見ぬプログラミング言語の処理系をインストールして、そしてQuineを書く、という作業を毎日のように繰り返しています。はじめの頃は素の環境にインストールしていたのですが、段々とDockerを使いはじめて環境を分離したり、Windows環境が必要だからと言ってインストールしたり、OS X環境が必要だからと言ってインストールしたり、と様々な知見を得ることができました。

加えて、毎日のように新しい言語でQuineを書いていくのだから、[Quineリポジトリ]も毎日のように更新されていきます。そして、今日現在では[Quineリポジトリ]には__132言語__ものQuineが置かれています。JavaScript、Ruby、Python、Icon、jq、Demi、Crystal、Hyなどなど‥‥。よく知られた言語から超が付くほどマイナーな言語、難解言語まで数多くの言語でQuineを書いてきました。

ここで、話を冒頭の引用まで戻します。

> __私の言語の限界__が、私の世界の限界を意味する。

この言葉は[Web+DBのRuby特集号](http://www.amazon.co.jp/dp/4774165344)でRubyの開発者であるまつもとゆきひろ氏（@yukihiro_matz）の言葉と隣に並べられて引用されていました。だから何ということはないのですが、プログラミングに関する書籍でこの言葉を見ることになるとは思わなかったので、かなり驚いて、興味深く思った記憶があります。[^1]

さて、もしこの言葉を素直に受け取って、私の言語——つまりボクが知っている言語がボクの世界の限界を意味していたとしたら、132もの言語でQuineを書いたボクの世界の限界は一体どのようになっているのでしょう？　また、この記事を読んでいるみなさんはどうでしょうか？

[Quine Advent Calendar 2014]を通して、少なくともボクは、ボクの世界の限界は広がった（あるいは広げられた）のではないかと考えています。というのも、プログラミング言語はそれが生まれる際には、面白いほど確実に何らかの思想を持っています。そして、その思想というのもまた別の言語の影響を受けており、またその言語も‥‥といったように、連鎖的な影響の渦の中にプログラミング言語というものがあります。それは例えば、Smalltalkのシステム。Smalltalkというのはもちろんプログラミング言語ですが、それ以上に開発環境ないし一連のシステムといった側面が強いです。ボクがそのような思想を受け継ぐ言語のうちで最初に出会ったのはSelfというプログラミング言語でした。SelfにはSnapshotという概念があり、それを用いないとメソッドなどがほとんど利用できないのですが、それを知らなかったために大変苦労したように覚えています[^2]。そのためボクのSmalltalk系言語への印象は非常に悪いのですが（Selfのドキュメントが読みにくすぎるのもありますが‥‥）、いくつかのSmalltalk系の言語でQuineを書いていくうちに、そういった言語の魅力もそれなりに分かるようにはなってきました。他にも、Lisp系の言語（Scheme、Common Lisp、Clojure、GOO、newLisp、PicoLisp、Hy等々‥‥）は、どれも丸括弧を多用する、という点では共通ですが、それ以外の部分はまるで違っていて、それぞれが解決しようとする問題のドメインを持っています。また、一口にオブジェクト指向と言ってもいくつもの考え方があることや、関数型言語と言ってもいくつもの考え方があることを、単なる理屈の上の話ではなく、現実問題として実感できました。

こうした言語が持つ世界の一端を覗くことができたことは、[Quine Advent Calendar 2014]の大きな収穫の一つだと考えています。

とは言っても、ボクが覗くことのできたそれはやはり一端でしかなくて、まだまだずっと広く続いているものなのではないかとも思います。というのも、ボクがQuineを書いていないプログラミング言語なんて、それこそ世の中にごまんとあるわけで、それはボクがぱっと思い付くだけでも数えきれないほどです。[^3]

これからはそれらでQuineを書きつつ、[Quineリポジトリ]で150言語、200言語を目指し、[Quine Advent Calendar 2014]を150日目、200日目まで継続させるのがボクの目標です。（小並感）


ポエムおわりっ
===

上で一生懸命気取った文章書きましたがもう疲れました。慣れないことはするもんじゃないですね。

本当は何かを100日間継続して続ける、ということについて意識高い感じで書いたりとか色々と考えてはいたのですが、もう何かと面倒なので終わりにします。こんな記事にアウトラインなんか書きたくなかったので終始グダグダの行き当たりばったり文章でした。
そもそも、ボクは何千日も学校に通っているし、何万日も生きてる時点でたかが100日の継続くらい大したことないよなー、とか。

最後に、こんなよく分からない記事でも興味を持って最後まで読んでくださった方に最大限の感謝をっ。

そして、あわよくば[Quine Advent Calendar 2014]に参加してくださる方が現れることを期待しています。[Quine Advent Calendar 2014]はいつでもあなたの参加を待っています。もし本当に参加するつもりなら[@make_now_just](htpps://twitter.com/make_now_just)に一度連絡をくださるととてもありがたいです。

おまけですが、この記事は[24日目](https://github.com/MakeNowJust/quine_advent_calendar_2014/tree/master/day_024)同様、JavaScriptのソースコードになっていて、多分Quineです。[^4]

```console
$ diff quine.js <(node quine.js)
```


- - -

[Quine Advent Calendar 2014]: https://github.com/MakeNowJust/quine_advent_calendar_2014
[Quineリポジトリ]: https://github.com/MakeNowJust/quine

[^1]: TaPL辺りが引用してそうだな、と思ったので今さっき確認しましたがありませんでした。

[^2]: 本当に苦労しました。ビルドにはやたら時間かかるし、コマンド名が大文字から始まる（`Self`といった具合に）、ドキュメントはどこを読んでも`Hello, World!`が出てこないし、最初はよく分かっていない部分が環境のせいだと思って、そういやここからボクはDockerを使い始めたのです。

[^3]: 具体的にはAda、Fancy、Logtalkとか‥‥。

[^4]: Node.jsならQuineだと思う。*/console.log('('+f+')()');})()