Видео смотреть бесплатно

Смотреть армянское видео

Официальный сайт mkad14 24/7/365

Смотреть видео бесплатно

kstep 24.02.2011 20:37

CodingВведение в Lua для начинающих программистов

Для чего: рассказать про Lua начинающим программистам, способствовать популяризации этого замечательного языка =)

Кому: людям, для которых слова «цикл», «условный оператор», «переменная», «тип» и «функция» имеют некоторое значение, хотя бы на уровне школьного паскаля.

Картинка для привлечения внимания взятая из гуглопоиска по картинкам:
Mo_lua_bigger.gif

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

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

Да, эта часть написана чтобы потешить самолюбие автора и утвердить его ЧСВ.


Введение второе, практическое
Про историю языка я писать не буду, кому интересно прочитает в вики. Здесь я расскажу только для чего, собственно, этот язык был создан.

Этот язык создан быть встраиваемым, его дао — расширение функциональности программ на C/C++, описание скриптов и конфигураций, и в этой области он великолепен. Впрочем, он может быть использован как самостоятельный скриптовый язык, но в таком виде он встречается достаточно редко. В связи с этим у языка имеется очень хорошо описанная «оборотная сторона»: достаточно удобный C-интерфейс, позволяющий свободно передавать данные между C и Lua частями программы, делать вызовы C-функций из Lua и наоборот и множество других интересных штук, при этом C-часть придерживается си-стиля, а луа часть — луа-стиля, отлично друг друга дополняют и не кажутся чужеродными в своей языковой среде.

Где можно встретить Луа? Большинство современных игр содержат скрипты на нём, начиная с WoW и кончая Цивилизацией. Кроме того он используется в нежно любимом мною WM Awesome, а также в браузере Luakit, в котором я пишу эти статью (на самом деле я пишу её в виме, но на мылинукс пощу именно из луакита).

Да, сразу оговорюсь, что речь пойдёт о Lua версии 5.1, как наиболее актуальной.

Повествование я разделю на следующие части:
Здесь же ниже, про базовые понятия, операторы и особенности языка,про типы и структуры данных,расширенные сведения о всяких вкусностях,введение в объектные возможности языка,введение в функциональные возможности языка,краткое описание стандартных модулей со ссылками и реверансами,для особо интересующихся — «теневая сторона языка» с точки зрения C.
Часть первая, скучнаяили Галопом по европам

По традиции начнём с классической программы:

hworld.lua
1
print('Hello, world!')



Запускаем:

1
2
$ lua ./hworld.lua
Hello, world!



Всё просто, да? Теперь завернём в функцию.

1
2
3
4
5
function hworld()
print('Hello, world!')
end

hworld()



Ещё у нас есть циклы 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
function bottles(i)
print('В ящике осталось ' .. i .. ' бутылок пива.')
end

-- цикл со счётчиком i «для i от 10 до 1 с шагом -1»
for i = 10, 1, -1 do
bottles(i)
end

-- аналогично, но в обратную строну с шагом по-умолчанию 1
for i = 1, 10 do
bottles(i)
end

-- цикл с предусловием, выполнять пока условие истинно,
-- если условие ложно до начала цикла, то цикл не выполнится ни разу
i = 10
while i >= 1 do
bottles(i)
i = i - 1
end

-- цикл с постусловием, выполнять пока условие ложно,
-- выполняется всегда хотя бы 1 раз вне зависимости от условия
i = 10
repeat
bottles(i)
i = i - 1
until i < 1



Здесь же знакомимся с операцией конкатенации объединения строк («..»).

Условия у нас тоже имеются:

 1
2
3
4
5
6
7
8
9
10
user_number = io.read('*number')
if not user_number then
print('Какое же это число? Это фигня какая-то =(')
elseif user_number < 0 then
print('Вау, отрицательно число!')
elseif user_number ~= 0 then
print('Это число явно не нуль, значит натурально, да?')
else
print('Прозреваю ошибку деления на это число.')
end



А вот операции switch не наблюдается, её можно эмулировать как обычно кучей if/elseif/.../else/end или... другим способом (о котором, наверное, догадаются питонщики, но про это позже, когда про структуры данных буду рассказывать).

Теперь разбор полётов.

Здесь в первый раз мы видим использование модуля: io — это стандартный модуль для работы с вводом-выводом.
Кроме того здесь же видно несколько особенностей Lua. А именно:
операция «не равно» записывается как «~=»,ноль в булевом логическом контексте считается истинойЕсли первая особенность чисто синтаксическая, то вторая имеет для нас достаточно серьёзные последствия, особенно если раньше вы привыкли, что ноль и пустая строка — это ложь. Для Lua ложны только два значения: nil и false, всё остальное истинно (включая классическое true). nil — это пустой указатель, пустое значение, аналог питоновскому None, сишному NULL и паскалевскому Nil. Здесь io.read('*number') просит прочитать из стандартного ввода число, и если юзер ввёл нечто, в число непреобразуемое, то результатом этого вызова будет nil. Это верно для многих случаев: очень часто в стандартных модулях nil используется как флаг ошибки, так что можно было бы написать так:

1
2
3
4
repeat
io.write('Введите-ка число: ')
num = io.read('*number')
until num



И этот код будет прекрасно работать, даже если юзер введёт просто «0». (Здесь io.write(), как вы наверное уже догадались, отличается от print() тем, что не выводит в конце строки символ перевода этой самой строки.)

Кроме того обращаю внимание на общую канву построения блоков в Lua: почти все операторы группируются в блоки вида do ... end (кроме repeat/until, но это единичное исключение). end — это универсальный «закрыватель» блока операторов. Кроме того операторы отделяются друг от друга простым пробелом. Можно их для читаемости разделять символом перевода строки или точкой с запятой, но никто специально вас так делать не заставляет, вполне можно было бы написать так:

1
2
3
4
5
function hworld() print('Hello world!') end

function many_bottles(n) for i = 1, n do print('Осталось ' .. i .. ' бутылок пива.') end end

function many_bottles1(n) for i = 1, n do print('Осталось ' .. i .. ' бутылок пива.'); end; 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 luaintro программирование
+ 29 -
Похожие Поделиться

K900 24.02.2011 20:50 #
+ 1 -
Теперь это официально Lua-тян.
K900 24.02.2011 20:55 #
+ 0 -
Да, очень понравилось. Пишите еще, очень жду.
uscr 24.02.2011 21:06 #
+ 2 -
А в чём плюшечки языка? Что на нём делают?
Если я начну писать на нем, мне повысят зарплату? Женщины будут меня любить?
Shtsh 24.02.2011 21:29 #
+ 1 -
Скрипты же.
Например, пишешь игру:
Движок на С, а все сценарии на lua. Очень гибко и удобно.
uscr 25.02.2011 13:50 #
+ 0 -
Lua компилируемый?
Shtsh 25.02.2011 14:45 #
+ 0 -
нет, lua скриптовый
kstep 25.02.2011 15:19 #
+ 1 -
Однако есть JIT-компиляторы.
kstep 25.02.2011 15:39 #
+ 0 -
http://luajit.org/
kstep 25.02.2011 15:20 #
+ 0 -
Lua — это интерпретируемый язык
predator 25.02.2011 17:09 #
+ -1 -
Где-то читал что + Lua в том, что он хорошо интергрируется с Си
kstep 25.02.2011 18:47 #
+ 1 -
Этот язык создан быть встраиваемым, его дао — расширение функциональности программ на C/C++
philosoft 26.02.2011 00:24 #
+ 3 -
«Статью не читай @ сразу отвечай»? Как и почти ко всей ветке вообще, да и почти к каждому комменту в частности.
Shtsh 24.02.2011 21:28 #
+ 2 -
Хочется продолжения. Давно было пора про lua написать.
DEViANCE 24.02.2011 22:43 #
+ 1 -
Для игры World of Warcraft все аддоны (которых оооочень много) пишутся на Lua. Если кто играет, то может сам написать аддон или модифицировать имеющийся под свои нужды.
kstep 24.02.2011 23:13 #
+ 0 -
Про что я и написал во введении.
DEViANCE 25.02.2011 00:43 #
+ 0 -
Сори :) Не читал... Только в букмарки добавил, чтобы позже почитать...
muhas 24.02.2011 22:46 #
+ 1 -
Годно! ещё полезный линк в копилку ilovelua.narod.ru - в обучении поможет

Продолжай, начинание полезно, да и написано хорошо...
kstep 24.02.2011 23:19 #
+ 0 -
За ссылку спасибо. Сразу скажу, специально никакие туториалы не искал, языки принципиально учу по спецификациям и исходным кодам + эксперименты. Этот цикл статей задумывался как введение в Луа, написанное мною с нуля, с го и тян (фото тян прилагается), так что читать ничего такого не буду, пока всё не напишу =)
muhas 25.02.2011 09:36 #
+ 1 -
какой ты эгоцентричный =) ссылка скорее для любопытствующих по lua нежели для тех кто уже его знает. тебе только спасибки за годное начинание
kstep 25.02.2011 11:30 #
+ 1 -
Есть немного =) Просто давно думал, про что бы такое написать, чтоб самому интересно было, а после недавнего знакомства с луакитом, решил — почему не луа? А чтение других мануалов желание писать ещё один свой умирает, т.к. понимаешь, что всё уже до тебя написано и городить ещё один велосипед смысла нет.
muhas 25.02.2011 11:54 #
+ 1 -
это да, хотя если бы не такое велосипедирование не было бы сейчас ни linux ни welinux =)
так что велосипедостроение иногда полезно - в случае твоих введений в луа очень даже, ибо на русском годных доков крайне мало...
Nikisch 25.02.2011 22:14 #
+ 0 -
Спецификации это что? А исходные коды, надеюсь, не реализации интерпретатора языка, т к получается противоречие курица-яйцо =)

Зы: расшифруйте работу циклов в 3-м примере. Я позорно застрял на нем, т к паскаль первый и последний раз видел в школе и тогда же невероятным усилием воли осилил МЫШЬ в досе (или че там было?). Тока начал разбираться в баше и циклы еще не осилил ))
kstep 26.02.2011 02:57 #
+ 0 -
Дополнил пример комментариями. Так понятнее?
Nikisch 26.02.2011 17:43 #
+ 0 -
Да, но когда все скрипты запустил и изменил стало еще понятнее ))
Странно, то
elseif user_number = 0 then
без ~ является некорректным выражением. луа ругается на него.
kstep 26.02.2011 20:49 #
+ 0 -
Операция «=» — это присваивание, сравнение это «==». Подробее про операции сравнения см. следующую статью.
Nikisch 26.02.2011 19:54 #
+ 0 -
Еще мне кажется, что не планировалось чтобы этот скрипт без конца печатал "Введите-ка число: ", но у меня работает именно так

repeat
io.write('Введите-ка число: ')
num = io.read('*number')
until num
kstep 26.02.2011 20:50 #
+ 0 -
Версия луа какая? Я специально проверил у себя — точно работает.
Lol 24.02.2011 23:08 #
+ 0 -
Есть и книжечка по луа, для балующихся английским :
книженция
Lol 24.02.2011 23:10 #
+ 1 -
Книга
bjaka_max 25.02.2011 06:53 #
+ 1 -
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, что-то мне подсказывает, что код немножко не рабочий ;)
kstep 25.02.2011 10:54 #
+ 0 -
Да, спасибо за указание на ошибку, и правда, не заметил =)
inst 25.02.2011 08:54 #
+ 0 -
Спасибо за статью, тоже хотел со временем изучить Lua, теперь буду следить за циклом Ваших статей :)

Кстати, заметил много схожего с Ruby: тот же 0 и пустая строка в качестве логической истины, например.
kstep 25.02.2011 10:55 #
+ 0 -
Да, в луа много реверансов в разные стороны =)
cblp 25.02.2011 22:10 #
+ 0 -
write() не выводит в конце строки символ перевода этой самой строки

Нет, это уже другая строка. В первом случае — последовательность символов (string), во втором — место на экране или бумаге для размещения этих самых символов (line).
kstep 26.02.2011 02:56 #
+ 0 -
Ну ты же понимаешь, что это каламбур.

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн