kstep 24.02.2011 20:37
Coding — Введение в Lua для начинающих программистов
Для чего: рассказать про Lua начинающим программистам, способствовать популяризации этого замечательного языка =)Кому: людям, для которых слова «цикл», «условный оператор», «переменная», «тип» и «функция» имеют некоторое значение, хотя бы на уровне школьного паскаля.
Картинка для привлечения внимания взятая из гуглопоиска по картинкам:

Введение
Введение первое, академическое
Если говорить академическим языком, Lua — это интерпретируемый язык со слабой динамической типизацией данных, поддерживающий программирование в императивном, функциональном и объектно-ориентированном (с прототипным наследованием) стилях. В нём есть замыкания, сопрограммы, а функции, соответственно, объекты первого класса.
Фух, лимит ссылок на википедию я исчерпал. Кому интересны все эти термины, считайте эту часть поводом с ними ознакомиться поближе, остальные могут проснуться и читать дальше.
Да, эта часть написана чтобы потешить самолюбие автора и утвердить его ЧСВ.
Введение второе, практическое
Про историю языка я писать не буду, кому интересно прочитает в вики. Здесь я расскажу только для чего, собственно, этот язык был создан.
Этот язык создан быть встраиваемым, его дао — расширение функциональности программ на C/C++, описание скриптов и конфигураций, и в этой области он великолепен. Впрочем, он может быть использован как самостоятельный скриптовый язык, но в таком виде он встречается достаточно редко. В связи с этим у языка имеется очень хорошо описанная «оборотная сторона»: достаточно удобный C-интерфейс, позволяющий свободно передавать данные между C и Lua частями программы, делать вызовы C-функций из Lua и наоборот и множество других интересных штук, при этом C-часть придерживается си-стиля, а луа часть — луа-стиля, отлично друг друга дополняют и не кажутся чужеродными в своей языковой среде.
Где можно встретить Луа? Большинство современных игр содержат скрипты на нём, начиная с WoW и кончая Цивилизацией. Кроме того он используется в нежно любимом мною WM Awesome, а также в браузере Luakit, в котором я пишу эти статью (на самом деле я пишу её в виме, но на мылинукс пощу именно из луакита).
Да, сразу оговорюсь, что речь пойдёт о Lua версии 5.1, как наиболее актуальной.
Повествование я разделю на следующие части:
Здесь же ниже, про базовые понятия, операторы и особенности языка,про типы и структуры данных,расширенные сведения о всяких вкусностях,введение в объектные возможности языка,введение в функциональные возможности языка,краткое описание стандартных модулей со ссылками и реверансами,для особо интересующихся — «теневая сторона языка» с точки зрения C.
Часть первая, скучнаяили Галопом по европам
По традиции начнём с классической программы:
hworld.lua
1 |
|
Запускаем:
1 |
|
Всё просто, да? Теперь завернём в функцию.
1 |
|
Ещё у нас есть циклы for, while и repeat/until, знакомые по старичку Паскалю:
Здесь же знакомимся с операцией конкатенации объединения строк («..»).
Условия у нас тоже имеются:
А вот операции switch не наблюдается, её можно эмулировать как обычно кучей if/elseif/.../else/end или... другим способом (о котором, наверное, догадаются питонщики, но про это позже, когда про структуры данных буду рассказывать).
Теперь разбор полётов.
Здесь в первый раз мы видим использование модуля: io — это стандартный модуль для работы с вводом-выводом.
Кроме того здесь же видно несколько особенностей Lua. А именно:
операция «не равно» записывается как «~=»,ноль в булевом логическом контексте считается истинойЕсли первая особенность чисто синтаксическая, то вторая имеет для нас достаточно серьёзные последствия, особенно если раньше вы привыкли, что ноль и пустая строка — это ложь. Для Lua ложны только два значения: nil и false, всё остальное истинно (включая классическое true). nil — это пустой указатель, пустое значение, аналог питоновскому None, сишному NULL и паскалевскому Nil. Здесь io.read('*number') просит прочитать из стандартного ввода число, и если юзер ввёл нечто, в число непреобразуемое, то результатом этого вызова будет nil. Это верно для многих случаев: очень часто в стандартных модулях nil используется как флаг ошибки, так что можно было бы написать так:
1 |
|
И этот код будет прекрасно работать, даже если юзер введёт просто «0». (Здесь io.write(), как вы наверное уже догадались, отличается от print() тем, что не выводит в конце строки символ перевода этой самой строки.)
Кроме того обращаю внимание на общую канву построения блоков в Lua: почти все операторы группируются в блоки вида do ... end (кроме repeat/until, но это единичное исключение). end — это универсальный «закрыватель» блока операторов. Кроме того операторы отделяются друг от друга простым пробелом. Можно их для читаемости разделять символом перевода строки или точкой с запятой, но никто специально вас так делать не заставляет, вполне можно было бы написать так:
Всё это корректный код на Lua. Впрочем, это не означает, что так надо писать =) Думайте о читабельности. (Хотя признаюсь, иногда пишу такие однострочники, в основном для описания лямбда-функций, которые передаю в качестве колбеков.)
Итог:
Мы познакомились с основными операторами: объявления функции (function name(args) ... end), циклов (for counter = from, to<, step> do ... end, while cond do ... end, repeat ... until cond) и условий (if/elseif/else/end). Кроме того узнали операции конкатенации (..) и неравенства (~=), отличающиеся от аналогичных в большинстве других языков (остальные все такие же, как в C), познакомились с парой функций из стандартного модуля io (io.read(what) и io.write(data)), константами true, false и nil и одной особенностью булевых операций языка (любое определённое значение является истиной, даже ноль и пустая строка). Кроме того мы увидели как пишутся однострочные комментарии (начинаясь на «--»).
В следующей части расскажу про структуры и типы данных.

+ 1 -
Теперь это официально Lua-тян.
А в чём плюшечки языка? Что на нём делают?
Если я начну писать на нем, мне повысят зарплату? Женщины будут меня любить?
Если я начну писать на нем, мне повысят зарплату? Женщины будут меня любить?
Скрипты же.
Например, пишешь игру:
Движок на С, а все сценарии на lua. Очень гибко и удобно.
Например, пишешь игру:
Движок на С, а все сценарии на lua. Очень гибко и удобно.
Где-то читал что + Lua в том, что он хорошо интергрируется с Си
Этот язык создан быть встраиваемым, его дао — расширение функциональности программ на C/C++
«Статью не читай @ сразу отвечай»? Как и почти ко всей ветке вообще, да и почти к каждому комменту в частности.
Для игры World of Warcraft все аддоны (которых оооочень много) пишутся на Lua. Если кто играет, то может сам написать аддон или модифицировать имеющийся под свои нужды.
Сори :) Не читал... Только в букмарки добавил, чтобы позже почитать...
Годно! ещё полезный линк в копилку ilovelua.narod.ru - в обучении поможет
Продолжай, начинание полезно, да и написано хорошо...
Продолжай, начинание полезно, да и написано хорошо...
За ссылку спасибо. Сразу скажу, специально никакие туториалы не искал, языки принципиально учу по спецификациям и исходным кодам + эксперименты. Этот цикл статей задумывался как введение в Луа, написанное мною с нуля, с го и тян (фото тян прилагается), так что читать ничего такого не буду, пока всё не напишу =)
какой ты эгоцентричный =) ссылка скорее для любопытствующих по lua нежели для тех кто уже его знает. тебе только спасибки за годное начинание
Есть немного =) Просто давно думал, про что бы такое написать, чтоб самому интересно было, а после недавнего знакомства с луакитом, решил — почему не луа? А чтение других мануалов желание писать ещё один свой умирает, т.к. понимаешь, что всё уже до тебя написано и городить ещё один велосипед смысла нет.
это да, хотя если бы не такое велосипедирование не было бы сейчас ни linux ни welinux =)
так что велосипедостроение иногда полезно - в случае твоих введений в луа очень даже, ибо на русском годных доков крайне мало...
так что велосипедостроение иногда полезно - в случае твоих введений в луа очень даже, ибо на русском годных доков крайне мало...
Спецификации это что? А исходные коды, надеюсь, не реализации интерпретатора языка, т к получается противоречие курица-яйцо =)
Зы: расшифруйте работу циклов в 3-м примере. Я позорно застрял на нем, т к паскаль первый и последний раз видел в школе и тогда же невероятным усилием воли осилил МЫШЬ в досе (или че там было?). Тока начал разбираться в баше и циклы еще не осилил ))
Зы: расшифруйте работу циклов в 3-м примере. Я позорно застрял на нем, т к паскаль первый и последний раз видел в школе и тогда же невероятным усилием воли осилил МЫШЬ в досе (или че там было?). Тока начал разбираться в баше и циклы еще не осилил ))
Да, но когда все скрипты запустил и изменил стало еще понятнее ))
Странно, то
elseif user_number = 0 then
без ~ является некорректным выражением. луа ругается на него.
Странно, то
elseif user_number = 0 then
без ~ является некорректным выражением. луа ругается на него.
Операция «=» — это присваивание, сравнение это «==». Подробее про операции сравнения см. следующую статью.
Еще мне кажется, что не планировалось чтобы этот скрипт без конца печатал "Введите-ка число: ", но у меня работает именно так
repeat
io.write('Введите-ка число: ')
num = io.read('*number')
until num
repeat
io.write('Введите-ка число: ')
num = io.read('*number')
until num
user_number = io.read('*number')
if not user_number then
print('Какое же это число? Это фигня какая-то =(')
elseif i < 0 then
print('Вау, отрицательно число!')
elseif i ~= 0 then
print('Это число явно не нуль, значит натурально, да?')
else
print('Прозреваю ошибку деления на это число.')
end
эм... какбы вводится user_number, а проверяется i, что-то мне подсказывает, что код немножко не рабочий ;)
if not user_number then
print('Какое же это число? Это фигня какая-то =(')
elseif i < 0 then
print('Вау, отрицательно число!')
elseif i ~= 0 then
print('Это число явно не нуль, значит натурально, да?')
else
print('Прозреваю ошибку деления на это число.')
end
эм... какбы вводится user_number, а проверяется i, что-то мне подсказывает, что код немножко не рабочий ;)
Спасибо за статью, тоже хотел со временем изучить Lua, теперь буду следить за циклом Ваших статей :)
Кстати, заметил много схожего с Ruby: тот же 0 и пустая строка в качестве логической истины, например.
Кстати, заметил много схожего с Ruby: тот же 0 и пустая строка в качестве логической истины, например.
write() не выводит в конце строки символ перевода этой самой строки
Нет, это уже другая строка. В первом случае — последовательность символов (string), во втором — место на экране или бумаге для размещения этих самых символов (line).