Nieoczekiwana zmiana składni

2008-09-25 8:54

Jedną ze szczególnych cech jest C++ jest obecność różnych “nadmiarowych” właściwości, które pojawiły się w języku właściwie przypadkiem. Bardziej znanym przykładem jest chociażby metaprogramowanie za pomocą szablonów, czego pierwszym przykładem jest słynny kod generujący liczby pierwsze na wyjściu kompilatora. Z początku było to nic innego, jak niezamierzony skutek uboczny procesu rozwijania szablonów, acz teraz zostało to oczywiście świadomie rozwinięte.
Podobnie jest na przykład z preprocesorem, jako że C i C++ są jednymi z niewielu języków, które taki mechanizm posiadają. Na początku służył głównie do deklarowania “stałych”, potem także makr naśladujących funkcje… A przecież można go też użyć do niemal całkowitej zmiany składni języka – tak, by zaczął on udawać inny. Przykładowo, za pomocą kilku poniższych #define‘ów:
#include
#include
#define IF if(
#define THEN )
#define BEGIN {
#define END }
#define WRITELN std::cout<< #define READLN(x) std::getline(std::cin,x)[/cpp] możemy sprawić, że w C++ będzie pisało się prawie jak w Pascalu: [cpp]WRITELN (“Podaj hasło:”); READLN (pass); IF pass == “strasznietajnehaslo” THEN BEGIN WRITELN (“OK”); END;[/cpp] Nie wszystkie niuanse składni innego języka da się oczywiście zasymulować przy pomocy makr, ale w praktyce udaje się bardzo wiele. Mimo to polecam jednak programowanie w C++ przy pomocy C++, a nie Pascala czy Basica ;)

Tags: , ,
Author: Xion, posted under Programming »


9 comments for post “Nieoczekiwana zmiana składni”.
  1. lmmilewski:
    September 25th, 2008 o 9:46

    Ta sztuczka jest od bardzo dawna wykorzystywana przez programistów na TopCoder, aby przyspieszyć pisanie prostych algorytmów.

    W perełkach jest pokazane zastosowanie makr do napisania maszyny stanowej.

    Są zatem już dwa sensowne zastosowania tego mechanizmu. Trzeba też pamiętać, że makra można rozwinąć np. poleceniem cpp.

    Język C++ jest znacznie potężniejszy pod tym względem. Pozwala na bardziej skomplikowane modyfikacje, niż proste podstawienia. Przykładem niech będzie biblioteka boost::lambda, która dopuszcza pewne wyrażenia w kontekstach, w których normalnie kod byłby niepoprawny lub miał zupełnie inne znaczenie. Można więc zmienić semantykę języka, a nie tylko składnię konkretną.

    Kolejnym przykładem wykorzystującym możliwości zmian w C++ jest biblioteka boost::mpl.

    Piszę to, bo odbieram twoją notatkę jako “wycelowaną” w C++ (programowanie w C++ przy pomocy C++), podczas gdy moim zdaniem możliwości jakie oferuje są na + dla tego języka.

    Podobnie jest z językiem OCaml, w którym można całkowicie zmienić składnię konkretną przez podmianę preprocesora.

  2. noisy:
    September 25th, 2008 o 9:54

    @lmmilewski
    Co masz na myśli pisząc: ” Trzeba też pamiętać, że makra można rozwinąć np. poleceniem cpp”.

    Czyżbym nie znał jakiejś sztuczki? Googlowanie po “cpp”, marne daje wyniki..wiadomo czemu…

  3. dmichael:
    September 25th, 2008 o 16:52

    @noisy
    CPP: C PreProcessor – więcej informacji: ‘man cpp’ :]

  4. Ciunkos:
    September 25th, 2008 o 20:28

    Mi się ostatnio zdarzyło z nudów tak, iż “spolszczyłem” większą część składni. Kod wyglądał mniej więcej tak:

    funkcja zwracająca nieujemną liczbę całkowitą abs(liczba całkowita a) {
    jeśli (a jest mniejsze od 0)
    zwróć -a;
    w przeciwnym wypadku
    zwróć a;
    }
    itp…

    Wszystko zwykłymi #define z czego większość to #define xxx (nic). Wygląda naprawdę strasznie ;]

  5. lmmilewski:
    September 25th, 2008 o 23:03

    @Ciunkos: Ciekawy eksperyment ;-)
    @noisy: Dokładnie to, co napisał dmichael. Jeżeli korzystasz z GNU/Emacs to możesz nawet wywołać to polecenie wewnątrz edytora (o ile jest zainstalowane)

  6. Pi:
    September 26th, 2008 o 15:42

    Pisać w C++ używając składni pascala to jakby silnik sportowego wozu włożyc do malucha, blee ;p

  7. valmico:
    September 26th, 2008 o 21:25

    “Pisać w C++ używając składni pascala to jakby silnik sportowego wozu włożyc do malucha, blee ;p”
    hmm… to ciekawe dlaczego C++ korzysta z klas API pierwotnie napisanych dla Pascala i jakoś nikomu nie chciało się przerobić tego na C++? Pascal i C++ to potęga. Być może Pascal jest nieco wolniejszy, ale są to niewielkie różnice. Za to wiele łatwiejszy, choć dla mnie C++ jest lepszy ze względu na oszczędność składni.

  8. Suvroc:
    September 27th, 2008 o 20:05

    valmico: Pascal jest po prostu ładny składniowo, za to c – użyteczny
    A ogólnie to nieraz naprawdę preprocesor jest niedoceniany gdy używa się go tylko do definiowania “stałych”

  9. moriturius:
    September 28th, 2008 o 7:18

    @Suvorc: musisz uważać z głoszeniem swojego zdania bo może to wywołać flame’a ;)
    Ja uważam, że Pascal jest brzydki i wolny ale wygodny, a C++ piękne, szybkie i wygodne jak się napisze kilka swoich klas :P

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.