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.]])
Поделиться
Отправить
 334   2 мес   99   lua   программирование
6 комментариев
Алексей Тен 2 мес

В JS кстати тоже нет функции задержки. 😀
Её предоставляет окружение (браузер, nodejs, и т. п.)

Евгений Степанищев 2 мес

Так я ж в этом предложении про стандартную библиотеку пишу )

PastorGL 2 мес

А зачем встраиваемому языку вообще нужна «стандартная библиотека»? Он на то и встраиваемый, чтобы давать доступ только к объектной модели того приложения, куда встроен.

Очень даже логично, что набор фич такого языка минимален. Это задача автора приложения предоставить соответствующий объект, если он посчитает нужным давать скриптописателям какие-то дополнительные возможности, помимо дёрнуть за конкретные ручки.

Евгений Степанищев 2 мес

Всё из вышестоящего языка не притащишь — это неудобно и с точки зрения производительности не очень.

PastorGL 2 мес

Всё из вышестоящего языка не притащишь

В том-то и дело, что задачи «притащить всё» не стоит, это вообще анти-паттерн. Задача — дать возможность подёргать за строго определённые в ТЗ ручки.

(Это я со своей колокольни как энтерпрайзного разработчика рассуждаю. Обычно, если надо, мы даём конечным пользователям сильно урезанный JS с конкретным корневым объектом, или вообще пишем какой-то свой птичий язык для конфигурирования настроек при запуске инстанса.)

Евгений Степанищев 2 мес

Голый язык-то не нужен, всё равно какие-то встроенные функции нужны. Иначе даже строку без учёта регистра не сравнить.

PastorGL 2 мес

А зачем мне давать юзеру в стартовом скрипте возможность сравнивать строку? Какая в этом бизнес-необходимость? С чем он её будет сравнивать? Какая, вообще, задача будет решаться эффективнее перекладыванием подобной логики на сторону юзера?

Ответ: да никакая.

Тут не о чем спорить, тут надо понимать, что стоит дозволять менять в поведении приложения юзеру, а что нет. Язык не сам по себе голый, язык служит для экспорта этого поведения в юзерспейс без лишнего груза.

Евгений Степанищев 2 мес

В каком стартовом скрипте? Не понял о чём речь. Причём тут юзеры?

Возможно я плохо объяснил чем обычно занимается Луа. Предположим, мы 15 лет назад пишем игру на быстром Си++, при этом у нас полным-полно логики, для которой скорость не важна, а важна возможность быстро её наляпать без компиляции. Во всяких пошаговых играх такого раньше было полно. Вот эту часть писали на Луа, встраивая его в движок игры.

Опять же я говорю только про юникодные строки, в обычных менять регистр можно:

> string.lower("ЭЮЯ")
���
> string.lower("RYU")
ryu

В модуле UTF-8 подходящих функций нет вовсе.

PastorGL 2 мес

Игры — очень узкий и частный случай для встраиваемых языков. В бизнес-приложениях они юзаются в бОльших объёмах для всякой автоматизации. Для макросов, и как я уже сказал, стартовых скриптов.

А что касается конкретно Луа, её можно найти даже в прошивке для фотоаппаратов https://chdk.fandom.com/wiki/CHDK — и уж там точно сравнение строк в стандартной либе нафиг не сдалось, там каждый байт памяти на счету.

Евгений Степанищев 2 мес

и уж там точно сравнение строк в стандартной либе нафиг не сдалось, там каждый байт памяти на счету

Сдалось оно там или нет, об этом я не говорю. Там уже есть функции приведения регистра (без которых, как я писал, не сравнить строку без учёта регистра, ну может неудачный пример их использования выбрал), просто для UTF-8 её нет, потому что библиотека — куцая. Вот о чём я.

То есть нужны эти функции или нет — обсуждать бессмысленно, они там есть. Просто недоделанные.

PastorGL 2 мес

Шёл уже пятый комментарий, как PastorGL пытался объяснить Болку, почему библиотека во встройке куцая. Но Болк, всё ещё зацепившись за сам факт оной куцести, продолжал сокрушаться о нём, и не слушал никаких аргументов.

Ой, всё.

Евгений Степанищев 2 мес

Для меня это выглядит ровно противоположным образом.

Кстати, откуда в вашей голове уверенность, что вы лучше меня понимаете какими должны быть встраиваемые языки — вообще не понятно.

Я поинтересовался историей развития стандартной библиотеки, пока на нём программировал. Ваши слова о том что языку надо и не надо в неё не укладываются.

Поэтому с вашей точкой зрения я не согласен и потому пытался развеять ваше заблуждение. Если не вышло, ну что ж, я изо всех сил пытался.

Популярное