99 бутылок: 𝄢 Cello
55. 𝄢 Cello. Попробовал попрограммировать с использованием библиотеки «libCello» — это набор макросов к Си, вводящих в язык кучу комплексных типов, простую работу с выделением и освобождением памяти под них, лямбда-функции, классы и так далее.
В документации выглядело неплохо, но по факту оказалось, что библиотека недописана, а документация неполная и содержит ошибки. Шаг в сторону и программа вылетает. Например, она падает, если попытаться использовать возвращаемое лямбдой значение.
Пример ошибки в документации — функции в «стиле Си» не могут быть заданы внутри функции main, хотя на сайте указан пример, в котором утверждается обратное (и он не компилируется).
По идее, библиотека должна упрощать программирование, но в моём случае (я понимаю, «песня про пиво» не совсем та программа, в которой раскрывается эта библиотека) всё было ровно наоборот — на чистом Си я справился бы значительно быстрее.
Если бы её дописать и достойно задокументировать, вышло бы что-то интересное, пока же я пас — надо знать в деталях каждый макрос (а их там очень много) чтобы понять из-за чего скомпилированное в очередной раз упало.
#include "Cello.h"
int main() {
lambda(bottles, args) {
var beer = cast(at(args, 0), Int);
if_eq(beer, $(Int, 0)) {
print("no bottles");
} else {
if_gt(beer, $(Int, 1)) {
print("%d bottles", beer);
} else {
print("1 bottle");
};
}
return None;
};
for (var beer = $(Int, 99); gt(beer, $(Int, 0));) {
call(bottles, beer);
print(" on the wall, ");
call(bottles, beer);
println(".");
print("Take one down and pass it around, ");
sub(beer, $(Int, 1));
call(bottles, beer);
println(" of beer on the wall.\n");
}
println("No more bottles of beer on the wall, no more bottles of beer.");
println("Go to the store and buy some more, 99 bottles of beer on the wall.");
}
Судя по репозиторию, автор интерес к своему детищу не потерял, будем надеяться, что когда-нибудь из этого получится что-то вроде гугловского «Гоу».
Классная блогозапись, уважаю!
Я сладкий картофель.