Jak powszechnie wiadomo, obchodzimy dzisiaj tak zwany Prima Aprilis. Dosłownie mówiąc, świętujemy więc fakt, że dzisiejsza data to 1 kwietnia. To oczywiście nie jedyny dziwny akcent tego dnia – na przykład dlatego, iż nie omieszkam przy tej okazji zająć się pewną interesującą oraz dziwną (to słowo zdecydowanie kluczowe) ciekawostką. Chodzi o quines.
Quine to program napisany w dowolnym języku (i nie tylko), którego jedynym zadaniem wyprodukowanie pewnego specyficznego rezultatu. Wypisuje on bowiem na wyjściu… swój własny kod źródłowy. Na pierwszy rzut oka można pomyśleć, że takie programy nie istnieją – albo że wręcz nie mogą istnieć! Bo przecież jeśli kod ma coś wypisywać, to “coś” musi być w tym kodzie zawarte. Czyli każda instrukcja typu print "a"
implikuje konieczność wypisania na wejściu tekstu "print \"a\""
. Ale instrukcja, która ten tekst pokazuje, sama też musi być wyświetlona… Mamy więc print "a"
, print "print \"a\""
, print "print \"print \\\"a\\\"\""
, i tak dalej. Błędne koło!
Lecz quines istnieją. Każdy program tego typu składa się zasadniczo z dwóch części:
#include
, using
, import
, nagłówki funkcji main
i inne podobne konstrukcjeprintf
Krótkim, bo niezawierającym dużej ilości zbędnych śmieci pierwszego typu przykładem jest poniższy quine napisany w Pythonie:
Jak widać, cała treść programu jest zapisana w pojedynczej zmiennej. W miejscu, gdzie w tym “wewnętrznym” kodzie powinna wystąpić wartość owej zmiennej, unikamy sprzężenia zwrotnego poprzez wstawienie znacznika formatującego (czyli %s
). Zostanie on potem zastąpiony dopiero w instrukcji drukującej print a%`a`
(w Pythonie print a%b
to odpowiednik printf(a, b)
z C).
Potrzebny jest jeszcze jeden trik, który pozwoli wypisać cudzysłowy (albo apostrofy) bez konieczności ich espace‘owania (które prowadziłoby do nieskończonego ciągu: "
, \"
, \\\"
, \\\\\\\"
…). Tutaj użyto operatora `
(backtick) specyficznego dla Pythona; inną możliwością jest wydrukowanie cudzysłowu przy pomocy jego kodu ANSI (34).
Widać więc, że quines wcale nie przeczą związkom przyczynowo-skutkowym, następstwu zdarzeń, nie powodują paradoksu dziadka ani zniszczenia Wszechświata :] Oczywiście nie mieszczą się też w nawet najszerzej pojętej kategorii rzeczy przydatnych – ale na dzisiejszą okazję są jak znalazł :)
Heheheh, Xion Ty to masz programistycznego świra. ;D