Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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.]])
6 комментариев
Алексей Тен 2020

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

Евгений Степанищев 2020

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

PastorGL 2020

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

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

Евгений Степанищев 2020

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

PastorGL 2020

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

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

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

Евгений Степанищев 2020

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

PastorGL 2020

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

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

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

Евгений Степанищев 2020

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

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

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

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

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

PastorGL 2020

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

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

Евгений Степанищев 2020

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

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

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

PastorGL 2020

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

Ой, всё.

Евгений Степанищев 2020

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

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

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

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