Coding — Введение в Lua для начинающих программистов
Для чего: рассказать про Lua начинающим программистам, способствовать популяризации этого замечательного языка =)
Кому: людям, для которых слова «цикл», «условный оператор», «переменная», «тип» и «функция» имеют некоторое значение, хотя бы на уровне школьного паскаля.
Картинка для привлечения внимания взятая из гуглопоиска по картинкам:
Если говорить академическим языком, Lua — это интерпретируемый язык со слабой динамической типизацией данных, поддерживающий программирование в императивном, функциональном и объектно-ориентированном (с прототипным наследованием) стилях. В нём есть замыкания, сопрограммы, а функции, соответственно, объекты первого класса.
Фух, лимит ссылок на википедию я исчерпал. Кому интересны все эти термины, считайте эту часть поводом с ними ознакомиться поближе, остальные могут проснуться и читать дальше.
Про историю языка я писать не буду, кому интересно прочитает в вики. Здесь я расскажу только для чего, собственно, этот язык был создан.
Этот язык создан быть встраиваемым, его дао — расширение функциональности программ на C/C++, описание скриптов и конфигураций, и в этой области он великолепен. Впрочем, он может быть использован как самостоятельный скриптовый язык, но в таком виде он встречается достаточно редко. В связи с этим у языка имеется очень хорошо описанная «оборотная сторона»: достаточно удобный C-интерфейс, позволяющий свободно передавать данные между C и Lua частями программы, делать вызовы C-функций из Lua и наоборот и множество других интересных штук, при этом C-часть придерживается си-стиля, а луа часть — луа-стиля, отлично друг друга дополняют и не кажутся чужеродными в своей языковой среде.
Где можно встретить Луа? Большинство современных игр содержат скрипты на нём, начиная с WoW и кончая Цивилизацией. Кроме того он используется в нежно любимом мною WM Awesome, а также в браузере Luakit, в котором я пишу эти статью (на самом деле я пишу её в виме, но на мылинукс пощу именно из луакита).
Да, сразу оговорюсь, что речь пойдёт о Lua версии 5.1, как наиболее актуальной.
Повествование я разделю на следующие части:
По традиции начнём с классической программы:
hworld.lua
Запускаем:
Всё просто, да? Теперь завернём в функцию.
Ещё у нас есть циклы for, while и repeat/until, знакомые по старичку Паскалю:
Здесь же знакомимся с операцией конкатенации объединения строк («..»).
Условия у нас тоже имеются:
А вот операции switch не наблюдается, её можно эмулировать как обычно кучей if/elseif/.../else/end или... другим способом (о котором, наверное, догадаются питонщики, но про это позже, когда про структуры данных буду рассказывать).
Теперь разбор полётов.
Здесь в первый раз мы видим использование модуля: io — это стандартный модуль для работы с вводом-выводом.
Кроме того здесь же видно несколько особенностей Lua. А именно:
И этот код будет прекрасно работать, даже если юзер введёт просто «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 и одной особенностью булевых операций языка (любое определённое значение является истиной, даже ноль и пустая строка). Кроме того мы увидели как пишутся однострочные комментарии (начинаясь на «--»).
В следующей части расскажу про структуры и типы данных.
Кому: людям, для которых слова «цикл», «условный оператор», «переменная», «тип» и «функция» имеют некоторое значение, хотя бы на уровне школьного паскаля.
Картинка для привлечения внимания взятая из гуглопоиска по картинкам:
Введение
Введение первое, академическое
Если говорить академическим языком, Lua — это интерпретируемый язык со слабой динамической типизацией данных, поддерживающий программирование в императивном, функциональном и объектно-ориентированном (с прототипным наследованием) стилях. В нём есть замыкания, сопрограммы, а функции, соответственно, объекты первого класса.
Фух, лимит ссылок на википедию я исчерпал. Кому интересны все эти термины, считайте эту часть поводом с ними ознакомиться поближе, остальные могут проснуться и читать дальше.
Да, эта часть написана чтобы потешить самолюбие автора и утвердить его ЧСВ.
Введение второе, практическое
Про историю языка я писать не буду, кому интересно прочитает в вики. Здесь я расскажу только для чего, собственно, этот язык был создан.
Этот язык создан быть встраиваемым, его дао — расширение функциональности программ на C/C++, описание скриптов и конфигураций, и в этой области он великолепен. Впрочем, он может быть использован как самостоятельный скриптовый язык, но в таком виде он встречается достаточно редко. В связи с этим у языка имеется очень хорошо описанная «оборотная сторона»: достаточно удобный C-интерфейс, позволяющий свободно передавать данные между C и Lua частями программы, делать вызовы C-функций из Lua и наоборот и множество других интересных штук, при этом C-часть придерживается си-стиля, а луа часть — луа-стиля, отлично друг друга дополняют и не кажутся чужеродными в своей языковой среде.
Где можно встретить Луа? Большинство современных игр содержат скрипты на нём, начиная с WoW и кончая Цивилизацией. Кроме того он используется в нежно любимом мною WM Awesome, а также в браузере Luakit, в котором я пишу эти статью (на самом деле я пишу её в виме, но на мылинукс пощу именно из луакита).
Да, сразу оговорюсь, что речь пойдёт о Lua версии 5.1, как наиболее актуальной.
Повествование я разделю на следующие части:
- Здесь же ниже, про базовые понятия, операторы и особенности языка,
- про типы и структуры данных,
- расширенные сведения о всяких вкусностях,
- введение в объектные возможности языка,
- введение в функциональные возможности языка,
- краткое описание стандартных модулей со ссылками и реверансами,
- для особо интересующихся — «теневая сторона языка» с точки зрения C.
Часть первая, скучная
или Галопом по европамПо традиции начнём с классической программы:
hworld.lua
1 2 3 |
|
Запускаем:
1 2 3 4 |
|
Всё просто, да? Теперь завернём в функцию.
1 2 3 4 5 6 7 |
|
Ещё у нас есть циклы for, while и repeat/until, знакомые по старичку Паскалю:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
Здесь же знакомимся с операцией конкатенации объединения строк («..»).
Условия у нас тоже имеются:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
А вот операции switch не наблюдается, её можно эмулировать как обычно кучей if/elseif/.../else/end или... другим способом (о котором, наверное, догадаются питонщики, но про это позже, когда про структуры данных буду рассказывать).
Теперь разбор полётов.
Здесь в первый раз мы видим использование модуля: io — это стандартный модуль для работы с вводом-выводом.
Кроме того здесь же видно несколько особенностей Lua. А именно:
- операция «не равно» записывается как «~=»,
- ноль в булевом логическом контексте считается истиной
1 2 3 4 5 6 |
|
И этот код будет прекрасно работать, даже если юзер введёт просто «0». (Здесь io.write(), как вы наверное уже догадались, отличается от print() тем, что не выводит в конце строки символ перевода этой самой строки.)
Кроме того обращаю внимание на общую канву построения блоков в Lua: почти все операторы группируются в блоки вида do ... end (кроме repeat/until, но это единичное исключение). end — это универсальный «закрыватель» блока операторов. Кроме того операторы отделяются друг от друга простым пробелом. Можно их для читаемости разделять символом перевода строки или точкой с запятой, но никто специально вас так делать не заставляет, вполне можно было бы написать так:
1 2 3 4 5 6 7 |
|
Всё это корректный код на 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 и одной особенностью булевых операций языка (любое определённое значение является истиной, даже ноль и пустая строка). Кроме того мы увидели как пишутся однострочные комментарии (начинаясь на «--»).
В следующей части расскажу про структуры и типы данных.