99 бутылок: Zephir
69. Zephir — язык программирования, созданный для написания модулей расширения PHP и являющийся его сателлитом. Текущая версия (0.12.2) содержит несколько багов, с которыми пришлось столкнуться при написании программы. К счастью, перед компиляцией «Зефир» транслируется в Си, поэтому разобраться в происходящем труда не стоило.
Язык со сборкой мусора, использует как статическую, так и динамическую типизацию. Последняя необходима, например, для сохранения результата вызова пользовательских методов, похоже транслятор пока не умеет опираться на подсказку возвращаемого типа, поэтому требует в таких местах динамическую типизацию.
По синтаксису «Зефир» явный наследник ПХП, но выглядит почище — без «долларов» в именах переменных (которые многих раздражают) и скобок в управляющих конструкциях (из-за чего напоминает мне Гоу). Процедурное прошлое здесь почти не видно — многие функции на типами имеют объектные эквиваленты.
К сожалению, реализация языка пока сыровата — на первые баги я наткнулся в первые десять минут программирования, а сообщения об ошибке синтаксиса предельно лаконичны — показывается только строка, в чём ошибка заключается приходится разбираться самостоятельно.
«Песня о пиве» на «Зефире» выглядит следующим образом:
// Beer song by Evgeny Stepanischev
// song.zep
namespace Beer;
class Song
{
private static function format(int bottles) -> string
{
string result = "";
switch bottles {
case 0:
let result = "No bottles";
break;
case 1:
let result = "1 bottle";
break;
default:
let result = "%d bottles"->format(bottles);
}
return result . " of beer";
}
public static function sing() -> void
{
int bottles = 99;
var botStr = self::format(bottles);
while bottles > 1 {
echo "%s of beer on the wall, %1$s of beer.\n"->format(botStr);
let bottles--;
let botStr = self::format(bottles);
echo "Take one down and pass it around, %s on the wall.\n\n"->format(botStr);
}
echo "No more bottles of beer on the wall, no more bottles of beer.\n",
"Go to the store and buy some more, 99 bottles of beer on the wall.\n";
}
}
Поскольку язык используется для написания расширений, а не самостоятельных программ, написанному выше надо помочь запуститься:
zephir build
php -d extension=beer.so -r 'Beer\Song::sing();'