99 бутылок: Cmm, интернет-археология
61. Cmm. Язык «Cmm» был разработан в 1992 году компанией «Nombas». Основной идеей языка было упрощение языка «Си», отсюда и название — C minus minus. Официальное руководство говорит, что это «Си, минус объявление типов, минус указатели». Позже язык был переименован в ScriptEase, так как упоминание «Си» отпугивало людей. Язык существовал для ДОСа, Виндоуз, ОС/2 и операционной системы компании «Новелл».
В конце 1995 года компания создала версию скриптового языка
Язык действительно простой — типы выводятся из использования, массивы без указания размера, нет явного выделения и освобождения памяти, указателей не видно.
Массивы и строки, хоть и являются указателями (есть даже арифметика с ними), но этого не замечаешь — выглядят, как обычные переменные. Все lvalue передаются по указателю, для передачи по значению есть специальный синтаксис. Забавно, кстати, что точка с запятой не обязательна, прямо как в ДжаваСкрипте.
Остальные отличия от «Си» не столь заметны. Языки почти что близнецы, есть даже ограниченный предпроцессор, да и встроенные функции, в основном, сишные. Язык, видимо, претендовал сразу на несколько ниш, на нишу коммандных оболочек в том числе — в составе предпроцессора есть команда, позволяющая импортировать куски программ, указывая с какой по какую строку производить импорт. Насколько я смог заметить, это широко используется, чтобы внедрять «СиЭмЭм» внутрь
// Written by Evgeny Stepanischev, 2017
BottlesPlural(Beer)
{
switch ( Beer )
{
case 0:
return `no bottles`
case 1:
return `1 bottle`
default:
sprintf(Bottles, `%d bottles`, Beer)
return Bottles
}
}
i = 99
Bottles = BottlesPlural(i)
while ( i > 0 ) {
printf("%s of beer on the wall, %s of beer.\n", Bottles, Bottles)
Bottles = BottlesPlural(--i)
printf("Take one down and pass it around, %s of beer on the wall.\n\n", Bottles)
}
printf("No more bottles of beer on the wall, no more bottles of beer.\n")
printf("Go to the store and buy some more, 99 bottles of beer on the wall.\n")Если
Комментарии 2