99 бутылок: Small C, dbPager
15. Язык dbPager. Предназначен для динамической генерации страничек под MS IIS. Инструкцию по настройке прекомпилятора под IIS5 я не нашел, так что тестировал под версией для командной строки. Язык несколько, на мой взгляд, необычен своей концепцией блочников и некоторыми конструкциями, но, в целом, очень хорошо читается и воспринимается.
Скрипт, выводящий песню о пиве (beer.dbp).
// Beer song. Written by Stepanischev E.V. (dbPager)
var "beer=99"
var "LoopLimit=99" :: while 1
var ""
@beer:printbeer
%Space%on the wall,
var ""
@beer:printbeer
.%CrLf%
Take one and pass it around,%CrLf%
set "beer=[%beer%-1]"
var ""
@beer:printbeer
%Space%on the wall.%CrLf%%CrLf%
No more bottles of beer...%CrLf%
Go to the store and buy some more...%CrLf%
99 bottles of beer.
:printbeer
switch %beer%
#0 :: No
#else :: %beer%
%Space%bottle
switch %beer%
#1 ::
#else :: s
%Space%of beer
14. Small C. Написав в предыдущей серии программу, выводящую песню о пиве, на Си—, я заинтересовался классом малоизвестных си-подобных языков. Благо Интернет и поисковые машины под рукой.
Первое, что мне попалось — это Small C. Впервые сведения о этом языке появились в октябре 1999 года в Dr. Dobb’s Journal. Язык простой и удобный, настолько отличен от Си, что перечислять эти отличия тут я не буду. Подробности можно найти в документации, доступной там же, на сайте.
Интересно, что исполнение программ происходит, как и в Java, в два этапа. На первом программа прекомпилируется в байт-коды, на втором — байт-коды интерпретируются или, если используется JIT, компилируются в машинный код и исполняются.
Несколько матерных слов в адрес компилятора. Отвратительная диагностика, странная реакция на символы табуляции, лишние переводы строки и символы «^», неработоспособность конструкции «a?b:c» и так далее. Компиляция моего небольшого примера заняла на Pentium-II 333 примерно 10 секунд. А теперь сам листинг.
Программа, выводящая песню о пиве (Small C).
/* 99 beer song. Written by Stepanischev E.V. Small C */
#include <console>
printbeer (b)
{
if (b) printf ("%d",b); else printf ("No")
printf (" bottle")
if (b!=1) printf ("s")
printf (" of beer")
}
main ()
{
for (new i = 99; i > 0;)
{
printbeer (i)
printf (" on the wall, ")
printbeer (i)
printf (".^nTake one and pass it around,^n")
i--
printbeer (i)
printf (" on the wall.^n^n")
}
printf ("No more bottles of beer...^n");
printf ("Go to the store and buy some more...^n");
printf ("99 bottles of beer.");
}