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

Смотреть узбекский видео

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

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

24.02.11 20:37 kstep

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

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

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

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

Введение


Введение первое, академическое


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

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

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


Введение второе, практическое


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

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

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

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

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

Часть первая, скучная

или Галопом по европам

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

hworld.lua
1
2
3

print('Hello, world!')
 


Запускаем:

1
2
3
4

$ lua ./hworld.lua
Hello, world!
 


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

1
2
3
4
5
6
7

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
30
31

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
11
12

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

1
2
3
4
5
6

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


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

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

1
2
3
4
5
6
7

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 и одной особенностью булевых операций языка (любое определённое значение является истиной, даже ноль и пустая строка). Кроме того мы увидели как пишутся однострочные комментарии (начинаясь на «--»).

В следующей части расскажу про структуры и типы данных.



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

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

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

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

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

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

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 164)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 3393 из 238 городов)
            Топ пользователей Топ блогов
            welinux.ru

            В хорошем качестве hd видео

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


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

            Online video HD

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

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

            Full HD video online

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

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

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