99 бутылок: Lua
Пока ещё помню язык Луа, который я использовал для написания «Морского боя» в азбуке Морзе, надо бы продолжить им сериал о «99 бутылках пива на стене».
73. Lua — скриптовый язык, который чаще всего применяют для встраивания, например — нередко используют для описания сценариев в играх. Объектная модель прототипная, напоминает ДжаваСкрипт, но в Луа она мощнее.
Язык очень простой, учится элементарно, но при этом довольно мощный.
А вот стандартная библиотека подкачала, простой пример — в ней нет функции задержки, когда она мне понадобилась, пришлось её импортировать из Си. Или есть модуль, который хоть как-то позволяет работать с ЮТФ-8, но в нём даже нет простого способа получить символ по его номеру или поменять регистр строки.
function beer(b)
if b == 1 then
return '1 bottle'
else
return (b == 0 and 'no' or b) .. ' bottles'
end
end
b = beer(99)
for i = 99, 1, -1 do
print(b .. ' of beer on the wall, ' .. b .. ' of beer.')
b = beer(i - 1)
print('Take one down and pass it around, ' .. b .. ' of beer on the wall.\n')
end
print([[No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.]])
В JS кстати тоже нет функции задержки. ?
Её предоставляет окружение (браузер, nodejs, и т. п.)
Так я ж в этом предложении про стандартную библиотеку пишу )
А зачем встраиваемому языку вообще нужна «стандартная библиотека»? Он на то и встраиваемый, чтобы давать доступ только к объектной модели того приложения, куда встроен.
Очень даже логично, что набор фич такого языка минимален. Это задача автора приложения предоставить соответствующий объект, если он посчитает нужным давать скриптописателям какие-то дополнительные возможности, помимо дёрнуть за конкретные ручки.
Всё из вышестоящего языка не притащишь — это неудобно и с точки зрения производительности не очень.
В том-то и дело, что задачи «притащить всё» не стоит, это вообще анти-паттерн. Задача — дать возможность подёргать за строго определённые в ТЗ ручки.
(Это я со своей колокольни как энтерпрайзного разработчика рассуждаю. Обычно, если надо, мы даём конечным пользователям сильно урезанный JS с конкретным корневым объектом, или вообще пишем какой-то свой птичий язык для конфигурирования настроек при запуске инстанса.)
Голый язык-то не нужен, всё равно какие-то встроенные функции нужны. Иначе даже строку без учёта регистра не сравнить.
А зачем мне давать юзеру в стартовом скрипте возможность сравнивать строку? Какая в этом бизнес-необходимость? С чем он её будет сравнивать? Какая, вообще, задача будет решаться эффективнее перекладыванием подобной логики на сторону юзера?
Ответ: да никакая.
Тут не о чем спорить, тут надо понимать, что стоит дозволять менять в поведении приложения юзеру, а что нет. Язык не сам по себе голый, язык служит для экспорта этого поведения в юзерспейс без лишнего груза.
В каком стартовом скрипте? Не понял о чём речь. Причём тут юзеры?
Возможно я плохо объяснил чем обычно занимается Луа. Предположим, мы 15 лет назад пишем игру на быстром Си++, при этом у нас полным-полно логики, для которой скорость не важна, а важна возможность быстро её наляпать без компиляции. Во всяких пошаговых играх такого раньше было полно. Вот эту часть писали на Луа, встраивая его в движок игры.
Опять же я говорю только про юникодные строки, в обычных менять регистр можно:
> string.lower("ЭЮЯ")
���
> string.lower("RYU")
ryu
В модуле UTF-8 подходящих функций нет вовсе.
Игры — очень узкий и частный случай для встраиваемых языков. В бизнес-приложениях они юзаются в бОльших объёмах для всякой автоматизации. Для макросов, и как я уже сказал, стартовых скриптов.
А что касается конкретно Луа, её можно найти даже в прошивке для фотоаппаратов https://chdk.fandom.com/wiki/CHDK — и уж там точно сравнение строк в стандартной либе нафиг не сдалось, там каждый байт памяти на счету.
Сдалось оно там или нет, об этом я не говорю. Там уже есть функции приведения регистра (без которых, как я писал, не сравнить строку без учёта регистра, ну может неудачный пример их использования выбрал), просто для UTF-8 её нет, потому что библиотека — куцая. Вот о чём я.
То есть нужны эти функции или нет — обсуждать бессмысленно, они там есть. Просто недоделанные.
Шёл уже пятый комментарий, как PastorGL пытался объяснить Болку, почему библиотека во встройке куцая. Но Болк, всё ещё зацепившись за сам факт оной куцести, продолжал сокрушаться о нём, и не слушал никаких аргументов.
Ой, всё.
Для меня это выглядит ровно противоположным образом.
Кстати, откуда в вашей голове уверенность, что вы лучше меня понимаете какими должны быть встраиваемые языки — вообще не понятно.
Я поинтересовался историей развития стандартной библиотеки, пока на нём программировал. Ваши слова о том что языку надо и не надо в неё не укладываются.
Поэтому с вашей точкой зрения я не согласен и потому пытался развеять ваше заблуждение. Если не вышло, ну что ж, я изо всех сил пытался.