3. function generatefib (n)
return coroutine.wrap(function ()
local a, b = 1, 1
while a <= n do
coroutine.yield(a)
a, b = b, a + b
end
end)
end
for i in generatefib(1000) do
print(i)
end
4. Где можно встретить Lua?
• Adobe Photoshop Lightroom
• World of Warcraft и другие игры
• Wireshark, Nmap...
• Фотоаппараты, клавиатуры, принтеры,
тв-приставки
И много, много где ещё...
5. Личный опыт
• Пишу на Lua с 2005-го года
• Несколько серьёзных проектов, до 160 KLOC Lua
• Много мелочи, библиотеки, модули, утилиты...
github.com/agladysh
15. Интеграция с другими языками
ActionScript 3 Ada Basic
C C++ COBOL D Delphi
Erlang Haskell Java
Objective-C .Net PHP Pascal
Perl Python Ruby Tcl
...
17. Lua — расширяемый
При помощи Lua C API можно
легко расширять доступный из
языка функционал
Всё, что можно сделать на Lua,
можно сделать при помощи
C API
18. Lua — лёгкий
• 150 КБ вся библиотека
• 100 КБ без компилятора
• Минимальное потребление памяти
• Луа очень любят embed-щики
22. LuaJIT 2
luajit.org
• x86, x86_64
• Потрясающая скорость!
• Полная совместимость со стандартом
• Отличия в недокументированном /
неопределённом поведении
• Почти полная ABI-совместимость
• Beta 4, достаточно стабильный для
продакшена
23. Lua 5.1.4 vs. LuaJIT2 beta4
luajit.org/performance.html
Логарифмическая шкала!
24. Lua 5.1.4 vs. LuaJIT2 beta4 (interp.)
luajit.org/performance.html
Логарифмическая шкала!
25. Lua — мощный
• Мета-механизмы,
а не конкретные решения
• Мультипарадигменный язык
26. Lua — мощный
• Множественные возвращаемые
значения у функций
• Полноценный lexical scoping
• Функции — значения
первого класса
• Полноценная хвостовая рекурсия
• Замыкания
• Кооперативная многозадачность
• Таблицы
36. Осторожно!
Глобальная видимость переменных
по умолчанию
local variable = 42
if vareable == 42 then
print("Life, the universe, and everything")
end
Решения:
• Run-time Global Environment Protection
• Статическая валидация кода
37. Осторожно!
nil и false — ложь
Всё остальное — истина
if 0 then
print("Ноль — тоже true")
end
38. Осторожно!
"Тернарный оператор"
Связка a and b or c
не полностью эквивалентна
(a) ? b : c
local foo, bar, baz = false, 1, 42
print(foo and bar or baz) --> 1
bar = false
print(foo and bar or baz) --> 42
39. Осторожно!
Массивы индексируются с единицы
local a = { [0] = 0, [1] = 1 }
for i, v in ipairs(a) do
print(i, "=>", v)
end
--> 1 => 1
for k, v in ipairs(a) do
print(k, "=>", v)
end
--> 1 => 1
--> 0 => 0
40. Осторожно!
Определение длины таблицы
print( #{ 1, 2, nil, 4 } )
The length of a table t is defined to be any integer
index n such that t[n] is not nil and t[n+1] is nil;
moreover, if t[1] is nil, n can be zero.
For a regular array, with non-nil values from 1 to a
given n, its length is exactly that n, the index of its
last value.
If the array has "holes" (that is, nil values between
other non-nil values), then #t can be any of the
indices that directly precedes a nil value (that is, it
may consider
41. Осторожно!
Определение длины таблицы
Также влияет на все функции, работающие с
таблицами как с линейным массивом.
unpack(), table.concat(), table.insert(),
table.remove(), table.sort() и т.п.
Поведение ipairs() отличается!
42. Осторожно!
Только конструкции вида return g(x) —
хвостовая рекурсия
Эта — да:
return x[i].foo(x[j] + a * b, i + j)
Эти — нет:
g(x); return
return g(x) + 1
return x or g(x)
return (g(x))
return g(x), 42
43. Осторожно!
Константные строки
-- Медленно:
local s = ""
for i = 1, #large_array do
s = s .. f(large_array[i])
end
-- Быстро:
local t = { }
for i = 1, #large_array do
t[#t + 1] = f(large_array[i])
end
local s = table.concat(t)
44. Кстати о строках
В Lua нет нативной поддержки Unicode, но
• Unicode (как и любые бинарные данные)
можно спокойно хранить в строках
• Есть сторонние библиотеки для работы
со строками в Unicode
52. Совет
Не изобретайте сложных обвязок
для ООП
Lua — скорее prototype-based,
множественное наследование и
проч. чудеса — не нужны
Duck Typing и делегирование —
ваши друзья!
53. Совет
Не используйте сторонние
библиотеки для написания
биндингов
Используйте стандартный Lua
C API для биндинга своего
кода
Используйте генераторы
(например, tolua)
для биндинга больших
3rd-party / legacy API
55. Совет
При написании биндинга
• Минимизируйте
поверхность
соприкосновения
• Пишите на стороне C, как
удобно коду на C
• Потом оберните это в Lua,
чтобы было удобно и там
56. Совет
При дизайне системы
• Максимум кода
выносите в Lua
• Минимум оставляйте
написанным на языке со
статической типизацией
Любой грамотно написанный
модуль на Lua можно заменить
на такой же на C / C++
68. Что читать?
Для углублённого изучения
• The implementation of Lua 5.0
lua.org/doc/jucs05.pdf
• The evolution of Lua
lua.org/doc/hopl.pdf
• A No-Frills Introduction
to Lua 5.1 VM Instructions
http://bit.ly/no-frills
69. Хотите знать больше?
• Lua.org (Lua.ru)
• Lua Users Wiki
lua-users.org/wiki
• Lua Mailing List
lua.org/lua-l.html
• StackOverflow
stackoverflow.com/questions/tagged/Lua
• IRC
#lua at irc.freenode.net