- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
https://www.evilfingers.com/publications/research_RU/oldnewlang.pdf языки, которые мы потеряли
...
Кстати, тот, кто считает, метапрограммирование достижением последних десятилетий, — жестоко
ошибается. Да, в языке Си++ оно появилось совсем недавно и в полном объеме (описанном в
последних редакциях Стандарта) не реализовано ни в одном реально существующем компиляторе, a
Nemerle и R# (языки программирования для платформы .Net со встроенной поддержкой
метапрограммирования) — вообще младенцы, но на самом деле концепция метапрограммирования
возникла еще во времена палеолита. Lisp, появившийся в далеком 1958 г., — хороший пример
языка, естественным образом поддерживающий метапрограммирование, одной из задач которого
является создание программы, выводящей точную копию своего собственного исходного текста — так
называемый куин (англ, quine). На Lisp'e он записывается так:
(funcall (lambda (x)
(append x (list (list 'quote x))))
'(funcall (lambda (x)
(append x (list (list 'quote x))))))
Листинг 1 программа на Lisp'е, распечатывающая сама себя
На Си так:
#include<stdio.h>
char*i="\\#include<stdio.h>",n='\n',q='"',*p=
"%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c",*m=
"int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}"
;int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}
А теперь попробуйте реализовать тоже самое на Си++ с использованием шаблонов и посмотрите, насколько
сильно они вам «помогут».