Функции языка позволяют принимать несколько аргументов, и возвращать несколько аргументов. Так аргументы, значения которых не указаны явно, считаются равными nil.
ПОДУМАЙТЕ: зачем может понадобиться возвращать несколько аргументов?
function swap(a, b) return b, a end x, y = swap(x, y) — кстати, это можно сделать и без функции: x, y = y, x — и если уж функция возвращает несколько аргументов, — а они вам не нужны — игнорируйте их с помощью — специальной переменной-подчеркивания «_» a, _, _, d = some_function()
Функции могут принимать переменное количество аргументов:
— в прототипе переменное число аргументов записывается как троеточие function sum(. ) s = 0 for _, n in pairs(arg) do — в функции обращаются к ним, как к таблице «arg» s = s + n end return a end sum(1, 2, 3) — вернет 6 sum(1, 2, 3, 4) — вернет 10
Поскольку функции — это полноценный тип данных, то можно создавать переменные-функции, а можно передавать функции как аргументы других функций
How to Install Lua on Windows 10/11
a = function(x) return x * 2 end — функция, умножающая на 2 b = function(x) return x + 1 end — функция, увеличивающая на 1 function apply(table, f) result = <> for k, v in pairs(table) do result = f(v) — заменяем элемент на какую-то функцию от этого элемента end end — ПОДУМАЙТЕ: что вернут вызовы t = apply(t, a) apply(t, b)
2001
03 Dec 2001
Lua IRC channel
#lua created at Open Projects Network
(now freenode).
lua-users.org,
a meeting place for Lua users,
is online,
courtesy of John Belmonte.
Lua 4.1 (alpha) released.
(removed; the next version will be 5.0)
Lua store opens at CafePress.
Use Lua, wear Lua!
(no longer exists)
Roberto
gives an invited talk on the
history of Lua
at the
V Brazilian Symposium on Programming Languages.
New
mirror in
Russia,
courtesy of the Chernogolovka Science Center.
(no longer active)
lua.org
is online,
courtesy of Jim Mathies and
Soho One.
Использование
См. также категорию: Программное обеспечение, использующее Lua
В настоящее время используется в различных проектах, где требуется встроить достаточно быстрый и нетрудный в освоении скриптовый язык программирования — например, в разработке игр, где Lua часто используется в качестве прослойки между игровым движком и данными для написания сценариев поведения и взаимодействия объектов. Благодаря компактности применим и в портативных устройствах, в частности один из графических микрокалькуляторов Texas Instruments использует язык вместо традиционного для такого класса устройств Бейсика.
Игры
Первыми в разработку компьютерных игр язык Lua внедрила компания LucasArts, начиная с игры Grim Fandango. Авторы языка в своём докладе на конференции HOPL (англ.)русск. вспоминают, что в январе 1997 они получили сообщение от Брета Могилефски, главного разработчика Grim Fandango, где он писал, что, прочитав о языке в статье 1996 года в Dr. Dobb’s Journal, он планирует заменить используемый ими самодельный скриптовый язык SCUMM на Lua. В результате им был создан игровой движок GrimE, используемый также более поздним квестом от LucasArts — Escape from Monkey Island.
0 Настройка персонального компьютера для работы с Lua
В 2003 году в результате опроса на сайте GameDev.net Lua был признан самым популярным скриптовым языком для разработки игр.
Примером игры, программируемой с помощью Lua, является World of Warcraft. На языке Lua описываются уровни игры-головоломки Enigma.
Доступен ряд свободных игровых движков, программируемых на Lua, таких, как Defold[неавторитетный источник?][значимость факта?], аркадный движок LÖVE, игровой конструктор Novashell и ориентированный на квесты (преимущественно — текстовые) INSTEAD.
Также используется в авиасимуляторе X-Plane, в движке X-Ray для S.T.A.L.K.E.R.
Для популярной игры Minecraft созданы модификации ComputerCraft и его более совершенный аналог OpenComputers, которые добавляют компьютеры, программируемые на языке Lua.
Достаточно известная игра Garry’s Mod программируется, а также поддерживает модификации, написанные на Lua.
Команда Croteam (разработчики Serious Sam и The Talos Principle) используют Lua в скриптах начиная с версии Serious Engine 3.5.
Для игры GTA: San Andreas создаются модификации, написанные на языке Lua и поддерживаемые плагином Moonloader. Также игра Multi Theft Auto поддерживает программирование скриптов на языке Lua.
Игровая платформа Roblox использует Lua в качестве языка кодирования игр и управления игровой средой.
LuaTeX
Программа компьютерной вёрстки LuaTeX, расширенная версия pdfTeX, использует Lua как встроенный скриптовый язык.
Литература
- Роберто Иерузалимски. Программирование на языке Lua. — 3-е изд.. — ДМК, 2014. — ISBN 9785940747673. (оригинал: Roberto Ierusalimschy. Programming in Lua. — 3-nd ed.. — 2012. — ISBN 9788590379850.)
- Ian Dees. Lua // Seven More Languages in Seven Weeks. Languages That Are Shaping the Future / Bruce Tate, Fred Daoud, Jack Moffitt, Ian Dees. — The Pragmatic Bookshelf, 2015. — С. 1—48. — 320 с. — ISBN 978-1941222157.
- Mário Kašuba. Lua Game Development Cookbook. — Packt Publishing, 2015. — 402 с. — ISBN 978-1849515504.
- David Young. Learning Game AI Programming with Lua. — Packt Publishing, 2014. — 352 с. — ISBN 978-1783281336.
- Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes. . Reprint from Proceedings of V Brazilian Symposium on Programming Languages (2001) B-14–B-28.. Дата обращения 9 декабря 2011.
- Федерико Бьянкуцци, Шейн Уорден. Глава 7. Lua // Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования = Masterminds of Programming: Conversations with the Creators of Major Programming Languages. — Символ, 2011. — С. 211—230. — 608 с. — 1500 экз. — ISBN 9785932861707.
Calling a Function
While creating a Lua function, you give a definition of what the function has to do. To use a method, you will have to call that function to perform the defined task.
When a program calls a function, program control is transferred to the called function. A called function performs the defined task and when its return statement is executed or when its function’s end is reached, it returns program control back to the main program.
To call a method, you simply need to pass the required parameters along with the method name and if the method returns a value, then you can store the returned value. For example −
function max(num1, num2) if (num1 > num2) then result = num1; else result = num2; end return result; end — calling a function print(«The maximum of the two numbers is «,max(10,4)) print(«The maximum of the two numbers is «,max(5,6))
When we run the above code, we will get the following output.
The maximum of the two numbers is 10 The maximum of the two numbers is 6
Основные свойства и возможности
Lua — популярный мощный скриптовый язык программирования. Lua в переводе с португальского означает «луна», и это слово не является аббревиатурой или акронимом.
Lua разработан подразделением Tecgraf Католического университета Рио-де-Жанейро в Бразилии (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro), история языка ведёт отсчёт с 1993 года. Lua распространяется свободно, с открытыми исходными текстами на языке Си. Основные особенности языка:
- это зрелый, стабильный и популярный язык; Lua используется в промышленных приложениях, и в настоящее время это ведущий язык сценариев в играх;
- это один из самых производительных скриптовых языков в принципе;
- Lua существует для Linux, Windows и MacOS, а также может быть запущен и на мобильных устройствах;
- Lua — компактный и легко встраиваемый язык; имеется документированный API, который позволяет осуществить сильную интеграцию с кодом, написанным на других языках; Lua использовался, чтобы расширить программы, написанные на C, C++, Java, C#, Smalltalk, Фортране, Ада, и даже Perl и Ruby; точно так же можно расширить Lua библиотеками, написанными на других языках;
- хотя Lua — не объектно-ориентированный язык в строгом понимании этого термина, он обеспечивает специальные мета-механизмы для того, чтобы реализовать классы и наследование; эти мета-механизмы экономят сущности и сохраняют язык маленьким, позволяя при этом расширить его семантику;
- поставка языка компактна; например, поставка Windows x86 Executables имеет размер менее 900 Кб;
Изначально язык задумывался как описательный, для удобства формирования больших массивов данных при решении задач машинного моделирования. Сейчас язык часто позиционируется как лучший встраиваемый язык, что, впрочем, не мешает его использовать отдельно. Список программных продуктов, в которых Lua используется как встраиваемый язык, вы можете увидеть здесь или .
Чтобы установить Lua на Windows, просто распакуйте бинарный дистрибутив. Можете ассоциировать расширение .lua с интерпретатором lua5.1.exe, а также прописать путь к интерпретатору в PATH.
Основные возможности языка:
- есть интерактивный интерпретатор;
- можно компилировать скрипты в байт-код;
- существует LuaJIT — свободный Just-In-Time компилятор (компилятор «на лету») байт-кода в машинный код (это отдельный продукт).
- модульность; код может быть вынесен в отдельные модули (файлы), которые можно подгружать с помощью оператора «require» и обращаться к содержащимся в них переменным и функциям; можно динамически перезагрузить модуль, в случае, если он был изменён с момента загрузки;
- мощный механизм ассоциативных массивов (в терминах Lua — таблиц), встроенные функции и удобные синтаксические приёмы для работы с таблицами;
- мощный механизм расширения языка с помощью так называемых метатаблиц, позволяющий фактически ввести полноценные объекты и изменить поведение некоторых важнейших стандартных типов данных (например, тех же таблиц);
- базовые встроенные функции, позволяющие работать с отладочными сообщениями (assert), выполнить указанный файл скрипта, работать с метатаблицами и модулями, работать с таблицами напрямую (в обход их метатаблиц);
- встроенные функции для работы со строками, позволяющие получить массив кодов байтов строки, получить строку из массива кодов байтов, работать с регулярными выражениями, искать вхождения подстрок и получать срезы строк, форматировать строки аналогично printf в Си, получить длину строки, преобразовать регистр символов строки, получить результат конкатенации указанного количества копий исходной строки, осуществить реверсинг строки;
- встроенные математические функции: модуль, целая часть (ceil, floor), (гиперболические) (арк)синус, (арк)косинус и (арк)тангенс, остаток от деления, перевод угла из радиан в градусы и обратно, степень, экспонента, натуральный и десятичный логарифм, случайные числа, квадратный корень, константа pi;
- встроенные функции для ввода-вывода на консоль и в файлы, работы с датой-временем, вызова команд системы, работы с файлами;
- встроенные функции для интерактивной отладки.
Некоторые полезные ресурсы:
- Русскоязычный сайт по Lua (документация, форум);
- небольшой учебник по Lua (рус.);
- уроки по использованию Lua совместно с С++ (рус.);
- Lua-Alchemy — порт языка программирования Lua на платформу Adobe Flash при помощи Alchemy (англ.);
- LuaForge — сайт сообщества Lua, каталог проектов (англ.);
- небольшой FAQ по Lua (англ.).
Реализация
Как и многие интерпретируемые языки программирования, реализация Lua имеет отдельно компилятор с исходного языка в исполняемый байт-код и виртуальную машину для исполнения сгенерированного байт-кода. Причём байт-код — это не команды стековой машины, а команды некоего виртуального процессора с несколькими регистрами, что повышает эффективность исполнения. В стандартной виртуальной машине Lua используется распределение памяти со сборкой мусора (аналогично Java или .NET).
Lua использует единый строковый пул, что позволяет снизить расходы памяти на хранение строк.
Для задач, критичных по времени, имеется JIT-компилятор Lua — LuaJIT. Также разработан компилятор llvm-lua, генерирующий код для виртуальной машины LLVM, предоставляющей возможность последующей компиляции в очень эффективный машинный код для процессоров различной архитектуры.
Объекты = функции + таблицы
Раз мы можем сохранять функции в переменных, то и в полях таблиц тоже сможем. А это уже получаются как-бы-методы. Для тех, кто не знаком с ООП скажу, что основная его польза (по крайней мере в Lua) в том, что функции и данные, с которыми они работают находятся рядом — в пределах одного объекта. Для тех, кто знаком с ООП скажу, что классов здесь нет, а наследование прототипное.
Перейдем к примерам. Есть у нас объект, скажем, лампочка. Она умеет гореть и не гореть. Ну а действия с ней можно сделать два — включить и выключить:
lamp = < on = false >function turn_on(l) l.on = true end function turn_off(l) l.on = false end — это просто функции для работы со структурой turn_on(lamp) turn_off(lamp)
А если лампочку сделать объектом, и функции turn_off и turn_on сделать полями объекта, то получится:
lamp = < on = false turn_on = function(l) l.on = true end turn_off = function(l) l.on = false end >lamp.turn_on(lamp) lamp.turn_off(lamp)
lua-language-server
Lua development just got a whole lot better The Lua language server provides various language features for Lua to make development easier and faster. With nearly a million installs in Visual Studio Code, it is the most popular extension for Lua language support. See our website for more info.
Features
- ⚙️ Supports Lua 5.4 , Lua 5.3 , Lua 5.2 , Lua 5.1 , and LuaJIT
- Over 20 supported annotations for documenting your code
- ↪ Go to definition
- Dynamic type checking
- Find references
- ⚠️ Diagnostics/Warnings
- ️ Syntax checking
- Element renaming
- ️ Hover to view details on variables, functions, and more
- ️ Autocompletion
- Support for libraries
- Code formatting
- Spell checking
- ️ Custom plugins
- Documentation Generation
Install
The language server can be installed for use in Visual Studio Code, NeoVim, and any other clients that support the Language Server Protocol.
Community Install Methods
The install methods below are maintained by community members.
Links
If you find any mistakes, please report it or open a pull request if you have a fix of your own ❤️
如果你发现了任何错误,请告诉我或使用Pull Requests来直接修复。❤️
Available Languages
- en-us
- zh-cn
- zh-tw
- pt-br
Note All translations are provided and collaborated on by the community. If you find an inappropriate or harmful translation, please report it immediately.
Are you able to provide a translation? It would be greatly appreciated!
Privacy
The language server had opt-in telemetry that collected usage data and sent it to the development team to help improve the extension. Read our privacy policy to learn more. Telemetry was removed in v3.6.5 and is no longer part of the language server.
Contributors
Credit
Software that the language server (or the development of it) uses:
Источник: marketplace.visualstudio.com
Lua язык программирования скачать программу. Lua – Установка Lua
Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции.
Скрипт может быть как очень простым, состоящим всего из одной команды, так и весьма сложным, содержащим десятки, сотни и даже тысячи инструкций. Следующие друг за другом инструкции могут разделяться точкой с запятой (;). Однако это требование не является обязательным, поэтому весь приведённый ниже код является корректным с точки зрения синтаксиса:
Работа с переменными в Lua
Переменные используются для хранения значений в процессе выполнения скрипта.
Имена переменных в Lua
Именами (идентификаторами) переменных в Lua могут быть любые последовательности из букв, цифр и символа подчеркивания, начинающиеся не с цифры.
Язык Lua различает регистр символов, поэтому abc, Abc, ABC являются различными именами.
В таблице ниже приведены слова, которые зарезервированы языком Lua и не могут использоваться в именах переменных:
and break do else elseif
end false for function if
in local nil not or
repeat return then true until
Кроме того, все имена, начинающиеся с символа подчеркивания, за которым идут заглавные буквы (например, _VERSION) также являются зарезервированными.
Какие переменные бывают в Lua?
Переменные в Lua могут быть глобальными и локальными. Если переменная не объявлена явно как локальная, она считается глобальной.
Глобальные переменные Lua
Глобальная переменная появляется в момент присваивания ей первого значения. До присваивания первого значения обращение к глобальной переменной даёт nil.
MsgBox(tostring (g)) —> nil
MsgBox(tostring (g)) —> 1
Глобальная переменная существует до тех пор, пока существует среда исполнения скрипта и доступна любому Lua-коду, выполняемому в этой среде.
При необходимости удалить глобальную переменную можно явным образом, просто присвоив ей значение nil.
g = 1 — создаем глобальную переменную g со значением 1
g = nil — удаляем глобальную переменную g
MsgBox(tostring (g)) —> nil
Все глобальные переменные являются полями обычной таблицы, называемой глобальным окружением. Эта таблица доступна через глобальную переменную _G. Поскольку полями глобального окружения являются все глобальные переменные (включая саму _G), то _G._G == _G.
Локальные переменные Lua
Любые локальные переменные должны быть объявлены явно с использованием ключевого слова local. Объявить локальную переменную можно в любом месте скрипта. Объявление может включать в себя присваивание переменной начального значения. Если значение не присвоено, переменная содержит nil.
local a — объявляем локальную переменную a
local b = 1 — объявляем локальную переменную b, присваиваем ей значение 1
local c, d = 2, 3 — объявляем локальные переменные c и d, присваиваем им значения 2 и 3
Область видимости локальной переменной начинается после объявления и продолжается до конца блока.
Областью видимости переменной называется участок кода программы, в пределах которого можно получить доступ к значению, хранящемуся в данной переменной.
Под блоком понимается:
тело управляющей конструкции (if-then, else, for, while, repeat);
фрагмент кода, заключённый в ключевые слова do. end.
Если локальная переменная определена вне какого-либо блока, её область видимости распространяется до конца скрипта.
local i = 1 — переменная i локальна в пределах скрипта
while i 1, 4, 9, 16, 25
local a — переменная а локальна внутри then
MsgBox(a) —> 5 (здесь обращение к глобальной a)
local a = 20 — переменная а локальна внутри do-end
MsgBox(a) —> 5 (здесь обращение к глобальной a)
Когда возможно, рекомендуется использовать локальные переменные вместо глобальных. Это позволит избежать «засорения» глобального пространства имён и обеспечит лучшую производительность (поскольку доступ к локальным переменным в Lua выполняется несколько быстрее, чем к глобальным).
Типы данных Lua
Какие типы данных поддерживает язык Lua?
Lua поддерживает следующие типы данных:
1. Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil.
2. Boolean (логический). К данному типу относятся значения false (ложь) и true (истина).
При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true.
3. Number (числовой). Служит для представления числовых значений.
В числовых константах можно указывать необязательную дробную часть и необязательный десятичный порядок, задаваемый символами «e» или «E». Целочисленные числовые константы можно задавать в шестнадцатеричной системе, используя префикс 0x.
Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff.
4. String (строковый). Служит для представления строк.
Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки:
b = «это вторая строка»
Строки, заключённые в двойные кавычки, могут интерпретировать C-подобные управляющие последовательности (escape-последовательности), начинающиеся с символа «» (обратный слэш):
n (перевод строки),
r (возврат каретки);
t (горизонтальная табуляция),
Символ в строке также может быть представлен своим кодом с помощью escape-последовательности:
где ddd — последовательность из не более чем трёх цифр.
Кроме кавычек для определения строки могут также использоваться двойные квадратные скобки:
Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана:
local a = [] в Lua]=]
Будет срока: «определение строки [] в Lua»
5. Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции ивозвращены как результат выполнения функций.
6. Table (таблица). Таблица представляет собой набор пар «ключ» — «значение», которые называют полями илиэлементами таблицы. Как ключи, так и значения полей таблицы могут иметь любой тип, за исключением nil. Таблицы не имеют фиксированного размера: в любой момент времени в них можно добавить произвольное число элементов.
Подробнее — в статье «Создание таблиц в Lua»
7. Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте.
Userdata используется для представления новых типов, созданных в вызывающей скрипт программе или в библиотеках, написанных на языке С. Например, библиотеки расширений Lua для «CronosPRO» используют этот тип для представления таких объектов, как:
банки данных (класс Bank);
базы данных (класс Base);
записи (класс Record) и т. п.
8. Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua.
Как в Lua задать тип переменной?
Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее).
a = 123 — переменная a имеет тип number
a = «123» — теперь переменная a имеет тип string
a = true — теперь переменная a имеет тип boolean
a = <> — теперь переменная a имеет тип table
Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них.
a = <> — создаем таблицу. В переменную a помещается ссылка на таблицу
b = a — переменная b ссылается на ту же таблицу, что и a
a = 10 — элементу таблицы с индексом 1 присвоено значение 10
Остальные данные являются непосредственными значениями.
Как в Lua получить тип переменной?
Тип значения, сохранённого в переменной, можно выяснить при помощи стандартной функции type. Эта функция возвращает строку, содержащую название типа («nil», «number», «string», «boolean», «table», «function», «thread», «userdata»).
t = type («это строка») — t равно «string»
t = type (123) — t равно «number»
t = type (type) — t равно «function»
t = type (true) — t равно «boolean»
t = type (nil) — t равно «nil»
t = type (CroApp.GetBank()) — t равно «userdata»
Как в Lua преобразовать тип переменной?
Lua при необходимости автоматически преобразует числа в строки и наоборот. Например, если строковое значение является операндом в арифметической операции, оно преобразуется в число. Аналогично числовое значение, встретившееся в том месте, где ожидается строковое, будет преобразовано в строку.
a = «10» + 2 — a равно 12
a = «10» + 2 — a равно «10 + 2»
a = «-5.3e-10″*«2» — a равно -1.06e-09
a = «строка» + 2 — Ошибка! Невозможно преобразовать «строка» в число
Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring.
a = tostring (10) — a равно «10»
a = tostring (true) — a равно «true»
a = tostring (nil) — a равно «nil»
a = tostring (< = «это поле 1»>) — a равно «table: 06DB1058»
Из предыдущего примера видно, что содержимое таблиц функцией tostring не преобразуется. Выполнить такое преобразование можно с помощью функции render.
a = render (10) — a равно «10»
a = render (true) — a равно «true»
a = render (nil) — a равно «nil»
Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil.
a = tonumber («10») — a равно «10»
a = tonumber («10»..».5″) — a равно 10.5
a = tonumber (true) — a равно «nil»
a = tonumber (nil) — a равно «nil»
Расстановка комментариев в Lua
Комментарий в Lua начинается двумя знаками «минус» (—) и продолжается до конца строки.
local a = 1 — однострочный комментарий
Если непосредственно после символов «—» идут две открывающие квадратные скобки ([[), комментарий являетсямногострочным и продолжается до двух закрывающих квадратных скобок (]]).
local a = 1 — [[ многострочный
Двойные скобки в комментариях могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется знак равенства (=):
local a = [[Компания «Кронос»]] — [=[
local a = [[Компания «Кронос»]]
Количество символов «=» определяет вложенность:
local a = [=[определение некоторой строки [] в языке Lua]=] —[==[
local a = [=[определение некоторой строки [] в языке Lua]=]
Операции, применяемые в Lua
В выражениях, написанных на Lua, могут применяться следующие виды операций:
1. Арифметические операции.
Lua поддерживает следующие арифметические операции:
^ (возведение в степень);
% (остаток от деления).
Арифметические операции применимы как к числам, так и к строкам, которые в этом случае преобразуются в числа.
2. Операции сравнения.
В Lua допустимы следующие операции сравнения величин:
= (больше или равно).
Операции сравнения всегда возвращают логическое значение true или false.
Правила преобразования чисел в строки (и наоборот) при сравнениях не работают, т. е. выражение «0» == 0 даёт в результате false.
3. Логические операции.
and (логическое И).
Операция and возвращает свой первый операнд, если он имеет значение false или nil. В противном случае, операция возвращает второй операнд (причём этот операнд может быть произвольного типа).
a = (nil and 5) — a равно nil
a == (false and 5) — a равно false
a == (4 and 5) — a равно 5
or (логическое ИЛИ).
Операция or возвращает первый операнд, если он не false и не nil, иначе он возвращает второй операнд.
a == (4 or 5) — a равно 4
a == (false or 5) — a равно 5
Логические операции and и or могут возвращать значения любых типов.
Логические операции and и or вычисляют значение второго операнда только в том случае, если его нужно вернуть. Если этого не требуется, второй операнд не вычисляется. Например:
a == (4 or f()) — вызова функции f() не произойдет
not (логическое НЕ).
Операция not всегда возвращает true или false.
4. Операция конкатенации.
Для конкатенации (объединения) строк служит операция… (две точки).
a = «Кронос»..»-«..«Информ» — переменная a получит значение «Кронос-Информ»
Если один или оба операнда являются числами, выполняется их преобразование в строки.
a = 0..1 — переменная a получит значение «01»
5. Операция получения длины.
В Lua определена операция длины #, которую можно использовать для получения длины строки.
len = #a — len равно 6
len = #«ещё строка» — len равно 10
С помощью операции # можно также узнать максимальный индекс (или размер) массива. Подробнее — в статье «Работа с массивами в Lua» .
Приоритет операций в Lua
В языке Lua выполнение операций осуществляется в соответствии со следующим приоритетом (в порядке убывания):
2. not # — (унарный)
Вызов скриптов из форм
С каждой формой (включая вложенные формы) связан отдельный скрипт, который обычно содержит функции, выполняющие обработку событий формы и её элементов.
Когда форма запускается, её скрипт загружается в глобальное окружение. При возникновении события формы или её элемента система вызывает сопоставленную этому событию функцию-обработчик.
Необходимо отметить, что скрипт формы, хотя и не содержит вызова функции module, фактически является модулем. Это означает, что переменные, объявленные в скрипте формы без ключевого слова local, не выносятся в глобальное окружение и доступны только внутри этого скрипта. Если необходимо сделать какое-либо значение доступным для скриптов других форм, его следует явным образом определить в глобальной таблице _G:
Блоки операторов (инструкций)
К основным операторам Lua относятся:
операторы для организации циклов.
Группа операторов может быть объединена в блок (составной оператор) при помощи конструкции do… end.
do — начало блока
end — конец блока
Блок открывает новую область видимости, в которой можно определять локальные переменные.
a = 5 — глобальная переменная a
local a = 20 — внутри do-end определяется локальная переменная а
MsgBox(a) —> 5 (здесь обращение уже к глобальной a)
Оператор присваивания в Lua
Присваивание изменяет значение переменной или поля таблицы. В простейшем виде присваивание может выглядеть так:
a = 1 — переменной a присвоено значение 1
a = b + c — переменной a присвоена сумма значений переменных b и с
a = f(x) — переменной a присвоено значение, возвращённое функцией f(x)
В Lua допускается так называемое множественное присваивание, когда несколько переменных, находящихся слева от оператора присваивания, получают значения нескольких выражений, записанных справа от оператора присваивания:
a, b = 1, 5*c — a равно 1; b равно 5*c
Если переменных больше чем значений, «лишним» переменным присваивается nil.
a, b, c = 1, 2 — a равно 1; b равно 2; c равно nil
Если значений больше чем переменных, «лишние» значения игнорируются.
a, b = 1, 2, 3 — a равно 1; b равно 2; значение 3 не использовано
Множественное присваивание можно использовать для обмена значениями между переменными:
a = 10; b = 20 — a равно 10, b равно 20
a, b = b, a — теперь a равно 20, b равно 10
Условный оператор (if) в Lua
Оператор if проверяет истинность заданного условия. Если условие является истинным, выполняется часть кода, следующая за ключевым словом then (секция then). В противном случае, выполняется код, следующий за ключевым словом else (секция else).
return a — если a больше b, вернуть a
return b — в противном случае — вернуть b
Секция else является необязательной.
Перед каждой итерацией цикла проверяется условие :
если условие ложно, цикл завершается и управление передаётся первому оператору, следующему за оператором while;
если условие истинно, выполняется тело цикла, после чего все действия повторяются.
while i > 0 do — цикл от 10 до 1
while i > 0 do — ищем в массиве отрицательное значение
MsgBox («Индекс отрицательного значения: »..i)
MsgBox («Массив не содержит отрицательных значений»)
Цикл с постусловием (repeat) в Lua
Оператор repeat предназначен для организации циклов с постусловием и имеет следующий вид:
Тело цикла выполняется до тех пор, пока условие не станет истинным. Проверка условия осуществляется после выполнения тела цикла, поэтому в любом случае тело цикла выполнится хотя бы один раз.
Суммируем значения массива a, пока сумма не превысит 10
MsgBox («Сложено »..i..» элементов. Сумма равна «..sum)
Для выхода из цикла до его завершения можно использовать оператор break.
Подробнее об особенностях использования оператора break — в статье «Операторы break и return»
Циклы с оператором for в Lua
Оператор for предназначен для организации циклов и допускает две формы записи:
простую (числовой for);
расширенную (универсальный for).
Простая форма оператора for
Простая форма оператора for имеет следующий вид:
for var = exp1, exp2, exp3 do
Тело цикла выполняется для каждого значения переменной цикла (счётчика) var в интервале от exp1 до exp2, с шагом exp3.
Шаг может не задаваться. В этом случае он принимается равным 1.
for i = 1, 10 do — цикл от 1 до 10 с шагом 1
MsgBox («i равно »..i)
for i = 10, 1, -1 do — цикл от 10 до 1 с шагом -1
MsgBox («i равно »..i)
Выражения exp1, exp2 и exp3 вычисляются всего один раз, перед началом цикла. Так, в примере ниже, функция f(x) будет вызвана для вычисления верхнего предела цикла только один раз:
for i = 1, f(x) do — цикл от 1 до значения, возвращенного функцией f()
MsgBox («i равно »..i)
Переменная цикла является локальной для оператора цикла и по его окончании не определена.
for i = 1, 10 do — цикл от 1 до значения, возвращенного функцией f()
MsgBox («i равно »..i)
MsgBox («После выхода из цикла i равно »..i) — Неверно! i равно nil
Значение переменной цикла нельзя изменять внутри цикла: последствия такого изменения непредсказуемы.
Для выхода из цикла до его завершения используется оператор break.
for i = 1,#a do — ищем в массиве отрицательное значение
if a[i] = 0 then — дописать при необходимости нужное расширение pic = fs_dlg.value if not (string.sub(pic, string.len(pic)-3) == «.emf») then pic = pic .. «.emf» end — создаем псевдо-холст, ассоциированный с файлом tmp_cv = cd.CreateCanvas(cd.EMF, pic .. » 400×300″) — выводим график на холст iup.PPlotPaintTo(plot, tmp_cv) — сохраняем данные в файл cd.KillCanvas(tmp_cv) end end — отображаем диалог с графиком plot_dg:showxy(iup.CENTER, iup.CENTER) — запускаем петлю обработки событий для диалога if (iup.MainLoopLevel()==0) then iup.MainLoop() end end — в цикле создаем вкладки, в которых мы будем размещать виджеты — для сбора данных for i=1,plots_number do — создание текстовых виджетов, куда будут вводиться координаты точек coords[i] = <> for j = 1,2 do coords[i][j] = iup.text < expand=»HORIZONTAL», multiline = «YES», VISIBLELINES = 5 >end — виджет для редактирования подписи к графику legends[i] = iup.text < expand = «HORIZONTAL» >— создаем контейнер вкладки и заполняем его элементами vboxes[i] = iup.vbox < iup.hbox < iup.label < title = «Подпись графика:» >, legends[i] >, iup.hbox < iup.label < title=»X: «, >, coords[i] >, iup.hbox < iup.label < title=»Y: «, >, coords[i] >; expand=»YES», > — меняем заголовк вкладки vboxes[i].tabtitle = «График » .. i — создаем чекбокс, который будет указывать на то, нужно ли строить — график по данным из указанной вкладки checkboxes[i] = iup.toggle < title= «График» .. i, value = «ON» >end — теперь из заполненных нами контейнеров создаем вкладки tabs = iup.tabs — создаем текстовые виджеты для редактирования подписей осей global_legend = iup.text<> global_legend = iup.text<> — создаем фрейм для общих настроек графика frame = iup.frame < iup.vbox < iup.label< title=»Использовать данные:», expand=»HORIZONTAL» >, iup.vbox < unpack(checkboxes) >, iup.label<>, — пустую подпись можно использовать как распорку iup.label, iup.hbox < iup.label< title = «Ось X «>, global_legend >, iup.hbox < iup.label< title = «Ось Y «>, global_legend >, iup.label<>, plot_btn >; expand = «VERTICAL», > — создаем главное окно программы и наносим на него настройки и табы dg = iup.dialog < iup.hbox < frame, tabs >, title=»Строим график», size = «HALF» > — показываем главное окно и запускаем обработку событий dg:showxy(iup.CENTER, iup.CENTER) if (iup.MainLoopLevel()==0) then iup.MainLoop() end
Пара слов о развертывании
Скрипт можно запустить при помощи команды:
В данном случае библиотеки будут подключаться из поддиректории clibs/, которая находится в директории, куда был установлен Lua for Windows. Чтобы максимально компактно упаковать скрипт и библиотеки для переноса на другую машину, достаточно скопировать в одну папку следущие файлы(указаны с относительными путями от директории установки Lua):
Lua.exe lib/lua5.1.dll clibs/cd.dll clibs/cdlua51.dll clibs/iup.dll clibs/iup_pplot.dll clibs/iupcd.dll clibs/iupcontrols.dll clibs/iupgl.dll clibs/iuplua51.dll clibs/iuplua_pplot51.dll clibs/iupluacd51.dll clibs/iupluacontrols51.dll clibs/freetype6.dll
Не забудьте поместить в эту папку и сам скрипт с программой. Теперь вы можете перенести эту папку на другую машину и запустить вашу программы командой, указанной выше. При этом никакие другие действия по установке библиотек и рантайма не нужны.
К сожалению файлы cd.dll, cdluad51.dll и iupcd.dll в данной версии Lua for Windows могут работать некорректно, поэтому рекомендую взять их из архива по ссылке ниже.
Итоги
Архив с рабочей версией , для удобства добавлена пускалка app.bat.
В результате получили, пусть и неказистую, утилиту, имеющую такой же функционал, как и если бы она была написана на «серьезном» языке программирования. При этом простую в развертывании и суммарным весом менее 2 мб. Потребление памяти — около 7 мб. Исходный код доступен для редактирования, сам Lua интерактивно понятен, что упрощает доработку подобного софта на местах.
На мой взгляд, это отличный выбор для написания учебного софта для школ и институтов, а также для внутреннего использования на предприятиях. Так как слабые машины до сих пор в изобилии присутствуют в подобных местах по всему СНГ, то использование Luа подобным образом целесообразно, особенно в свете постепнного прихода Linux на десктопы. К тому же тенденцию потери исходников самописного софта при жуткой его же забагованности можно приравнять к национальному бедствию.
Теги: Добавить метки
Это вопрос, который возникает достаточно часто. Что, вообще-то, достаточно удивительно, потому как установка на самом деле, крайне проста и понятна. Можно даже сказать, что там вообще нечего делать. Но, раз уж такие вопросы возникают, давайте немного поговорим об установке .
Установка Луа. Скачиваем
Первое, что нам нужно будет сделать перед установкой, это скачать исходники с её официального сайта: . Для установки, естественно, нам понадобится самая последняя версия, на данный момент это lua 5.1.4. После скачивания, естественно, надо разархивировать исходники lua в отдельную папку.
Установка Луа. Компиляция.
Есть два варианта компиляции , которые, в принципе, ничем не отличаются))) Первый – это компиляция из Visual Studio Command Prompt:
- Запускаем Visual Studio
- Выполняем Tools->Visual Studio Command Prompt
- Переходим в папку с луа, в директорию etc. Вот так: cd D:/mylibs/lua-5.1.4
- запускаем скрипт компиляции луа: etc/luavs.bat
- Мы получили нужны нам файлы lua.exe и luac.exe
Второй способ без запуска Visual Studio:
- В любом файл-мендеже (я лично работаю в ) заходим в папку где_луа/etc/
- Редактируем файл, первой строкой ставим: call “путь_к_вижуалстудио/VC/bin/vcvars32.bat”
- Добавляем вторую строку: cd .. и сохраняем файл
- Запускаем, получаем искомые экзешники
Установка Луа. Доступ
Что бы вы могли запускать луа откуда угодно – вам надо добавить их (путь к ним) в переменную окружения %PATH%. Думаю, Вы сами прекрасно знаете как это сделать. В любом случае, нам не нужны эти файлы, т.к. мы планируем использовать луа внтри наших программ, а не как отдельное приложение. После этого считайте, что сама установка Lua завершена, вам лишь остаётся прописать в Visual Studio пути в получившейся.lib и хидерам луа.
Установка Луа. Статическая линковка.
Меня лично выводит из себя то, что с каждый проектом, использующим луа, приходится таскать и lua.dll , поскольку без неё программы работать не будут. А что бы они работали – надо что бы луа линковалась с нашей программой статически. Делается это тоже совсем не сложно:
- Делаем в Visual Studio новый проект, Win32Project, назовём его “LuaLib”
- Тип проекта указываем “Static Library”, отключаем использование Precompiled Header, нажимаем Finish
- Добавляем в проект все файлы.h и.c, кроме lua.c и luac.c
- Что бы компилятор не выдавал нам варнингов, в настройки проекта (Protec/Propreties/Preprocessor) добавляем;_CRT_SECURE_NO_WARNINGS (не забудьте сделать это и для релиз и для дебаг-версии. )
- В настройках линковки (Project/Properties/Librarian/General/OutputFile) указываем какие имена библиотек мы хотим. Я указал lua.lib для релиза и lua-debug.lib для дебага.
- Компилируем дебаг и релиз-версии. Получаем нужные нам либы
- Прописываем пути к ним в Visual Studio
Установка Луа. Проверка.
Проверим, всё ли работает. Создаём новый проект (я сделал консольный проект win32). Дописываем инклюды луа:
и доделываем сам main():
| int _tmain(int argc, _TCHAR* argv ) < lua_State * L; L = lua_open() ; //Создаем стэк luaL_openlibs(L) ; //подключить стандартные библиотеки int status = luaL_loadfile(L, «test.lua» ) ; //загрузить файл /* Состояние стtка: [-1]main if (status) < (void ) fprintf (stderr , «file not found n » ) ; return 1 ; >int result = lua_pcall(L, 0 , LUA_MULTRET, 0 ) ; _getch() ; return 0 ; > |
В настройки линковщика (Project/Properties/Linker/Input/Addition Dependencies) не забываем добавить нашу библиотеку (lua.lib для релиза и lua-debug.lib для дебага). Компилируем. Создаём тестовый файлик с луа-скриптом.
В этой серии уроков, которую я задумал, будет обсуждаться язык программирования Lua. Я постараюсь сделать изложение как можно более доступным для начинающих, и именно на них буду ориентироваться. То есть, опытные Lua-кодеры, скорее всего, не почерпнут отсюда ничего нового (уверен, тут они найдут только простор для придирок и замечаний, которые, собственно, с их стороны даже приветствуется), но если у вас за плечами нет богатого опыта программирования, то, думаю, кое-что вы вынесете.
Вся серия не будет подчиняться какой-то системе. Уроки будут последовательно вводить ряд конструкций языка, чтобы уже к третьему или четвёртому уроку вы уже могли писать свои программы. Моя цель — подтолкнуть вас к самостоятельному изучению языка, помочь ощутить его, а не разъяснить от А до Я — если хотите освоить язык полностью, читайте справочное руководство (которое, хоть и скверно, переведено на русский язык: http://www.lua.ru/doc/). Чем раньше вы перейдёте от уроков «для чайников» в Сети к изучению справочника, тем лучше.
Если что-то непонятно — обязательно задайте вопрос в комментариях, и я и другие участники постараемся вам помочь.
Lua — популярный, несложный для освоения встраиваемый интерпретируемый динамически типизированный язык программирования общего назначения. Нет, вам необязательно понимать и половины слов, сказанных в предыдущем предложении — главное знайте, что он популярный и несложный.
Кстати, простотой, а также маленьким размером дистрибутива (около 150 килобайт), он и заслужил свою популярность. Скрипты на Lua поддерживаются большим количеством приложений, в том числе играми. World of Warcraft и S.T.A.L.K.E.R. используют язык Lua. Мой любимый игровой движок, позволит вам с помощью Lua с лёгкостью создавать разнообразные игры. Как видите, Lua открывает вам немалые горизонты!
Прежде чем мы начнём, вам следует обустроить среду для программирования: то есть, найти программу, которая принимала бы написанный вами код на Lua и исполняла его: интерпретатор. Тут есть три варианта:
1. Скачать официальный дистрибутив Lua с одного из сайтов, поставляющих их.
С официального сайта Lua можно скачать только исходные коды интерпретатора. Однако поизучав http://lua.org/download.html в разделе Binaries, вы можете обнаружить ссылки на сайты с исполняемыми файлами для Windows. Один из них: . Загрузите оттуда один из архивов (совпадающий с вашей платформой: Win32 или Win64) и распакуйте его куда-нибудь, желательно в каталог с коротким путём: вроде C:lua. Отныне я буду полагать, что вы пользуетесь Windows, и ваш интерпретатор лежит именно там.
Пользователям операционных систем на базе Linux в этом смысле проще: им достаточно воспользоваться пакетным менеджером и установить Lua из репозиториев. В Debian и Ubuntu это делается командой apt-get install lua, а в Fedora, Red Hat и производных дистрибутивах — yum install lua. Однако не доверяйте мне слепо и обратитесь к справочнику вашей операционной системы, чтобы узнать, как именно это делается у вас.
2. Использовать онлайн-интерпретатор.
Находится по адресу http://www.lua.org/demo.html . На первых порах его может хватить, однако в дальнейшем, когда мы коснёмся модулей, вы будете вынуждены использовать оффлайн-версию. Пользоваться онлайн-интерпретатором очень просто: введите в окошко с текстом вашу программу и нажмите кнопку Run. Программа будет исполнена, в окошке Output покажется вывод вашей программы, а также отчёты об ошибках, если таковые были вами допущены.
3. Использовать IDE.
Например ZeroBrane Studio: http://studio.zerobrane.com/ . Есть и другие — поищите в Интернете.
В ходу сейчас две несколько различающиеся версии Lua: 5.1 и 5.2. Я буду ориентироваться на самую последнюю версию — версию 5.2, но обязательно укажу на важные различия между ей и 5.1, так как последняя тоже достаточно распространена. Кстати, Lua 5.1 исполняет код в полтора раза быстрее, чем Lua 5.2, чтобы вы знали.
Итак, начнём. Создайте в изолированной от посторонних файлов папке файл main.lua и напишите в него:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
— main.lua —
print(«Hello world!»)
После чего запустите в командной строке (не забудьте переместиться в директорию с main.lua с помощью команды cd):
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
> C:lualua.exe main.lua
В ответ интерпретатор Lua выдаст:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
Hello world!
В принципе, этого следовало ожидать. В программе мы вызвали функцию print. Функция print принимает произвольное число параметров и последовательно выводит их на экран. В данном примере мы передали ей строку (цепочку символов) «Hello world!». С таким же успехом можно передать в качестве параметра:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
print(8) — какое-нибудь десятичное число
— выведет: 8
Print(0xDEADBEEF) — шестнадцатиричное число
— выведет: 3735928559
Print(«0xDEADBEEF») — а это строка, не число! Видете кавычки?
— выведет: 0xDEADBEEF
Print(1.35e-4) — число с плавающей запятой (дробное число)
— Выведет 0.000135. 1.35e-4 следует понимать как «1.35, умноженное
— на десять в минус четвёртой степени», если кто не знает.
Print((198*99)-3*500 + 14/88) — выражение
— Выведет значение выражения: 18102.159090909. Неплохая альтернатива
— настольному калькулятору!
Print(198/7, «fertilizer», 2^9) — несколько параметров произвольного
— типа. Будут выведены значения каждого из них, разделённые знаками
— табуляции:
— 28.285714285714 fertilizer 512
— Обратите внимание, что кавычки вокруг fertilizer не выводятся!
Print(1,35) — два числа, а не десятичная дробь 1,35!
— Запятая используется для разделения параметров.
— Выведет:
— 1 35
Знак «—» — не просто имитация знака тире, которая вставлена для красоты. Знаком «—» в Lua отмечаются комментарии: подсказки для программиста, которые игнорируются интерпретатором, и предназначенные для того, чтобы в коде было легче разобраться. Можете попробовать написать в программе:
Интерпретатор подумает, что это комментарий, и не станет выполнять инструкцию.
Хозяйке на заметку: если вы хотите напечатать только одну строку, можно написать вызов print так, без скобок:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
print «Just one string»
Удобство, безусловно, сомнительное: просто имейте ввиду, что так можно. Вместе с тем, такие вызовы недопустимы:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
print 2 — не сработает, 2 — не строка.
print 2*2 + 6 — тем более не сработает
Str = «string!!» — присвоили переменной str значение «string!!»
— о переменных читайте ниже
print str — тоже не сработает.
В каждом из вышеперечисленных случаев программа просто откажется работать. Таким образом, в «бесскобочном» вызове за названием функции может стоять лишь строковый литерал (то есть, последовательность символов, заключённая в кавычки), и больше ничего. В будущем я расскажу об этой особенности чуть подробнее, но сейчас с вас хватит и этого.
В любом хорошем языке программирования возможно объявлять переменные: маленькие контейнеры, которые могут содержать какие-нибудь данные. В Lua это делается таким образом:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
star = 8 — Теперь в переменной star хранится число 8
wars = «owl» — В переменной wars — строка «owl»
jedi = 42/2 — В переменной jedi — число 21
luke = star*jedi — В переменной luke — число 168 (да, 21 умножить на 8)
Значения переменных и выражений с ними также можно вывести на экран:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
print(star, wars, jedi, jedi-star+luke)
— Выведет:
— 8 owl 21 181
Только не пытайтесь сложить переменные star и wars — попытавшись прибавить 8 к «owl», вы ничего хорошего не добьётесь!
Как вы должны были заметить, имя у переменной может быть практически любым: главное, чтобы оно не начиналось с цифры. Серьёзно, вы даже можете объявить переменную с названием print, и тогда функция print перестанет работать, потому что имя print станет ссылаться на вновь объявленную переменную. Но есть группа слов, которые запрещено использовать в качестве названий переменных — это ключевые слова языка, с которыми мы пока не познакомились, но на которые точно стоит посмотреть:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
and break do else elseif end
false for function goto if in
local nil not or repeat return
then true until while
Создав переменную с одним из этих названий, вы вызовете ошибку в программе, и работать она точно не будет. Обратите внимание: в Lua 5.1 ключевого слова goto нет, и переменную так назвать можно, но вы лучше так не делайте.
Также учтите, что имена переменных чувствительны к регистру. Это означает, что foo, fOo, fOO и FOO — четыре разные переменные, так что если вы написали имя какой-то переменной строчными буквами, а позднее написали его прописными, то, скорее всего, программа не будет работать корректно.
А теперь один важный момент: что будет если вы, случайно или преднамеренно, обратитесь к несуществующей переменной? В большинстве других языков это вызовет ошибку, но в Lua такая ситуация допустима.
Она трактуется так, как будто несуществующая переменная на самом деле существует, но её значение равно nil . nil — запомните это слово! — особый тип значения в Lua, который означает «ничто». Не нуль и не пустую строку (строку вида «» — попробуйте её вывести на экран), а просто ничто. Сравните это с такой моделью: есть два человека, у одного из них есть банковский счёт, но на нём нет денег, а у другого банковского счёта нет вообще. В терминах Lua будет считаться, что на счету у первого — 0 долларов, а на счету у второго — nil . И даже не долларов, а просто nil . Надеюсь, я вас не запутал.
Попробуйте, например, запустить такую программу:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
— main.lua —
foo = «bar»
print(foo, baz)
— Выведет:
— bar nil
Таким образом, у переменной baz, которой нет, но считается, будто она есть, значение nil, и функция print понимает это и выводит его на экран в виде строки «nil». В Lua есть хороший метод проверки существования переменной: если значение переменной не равняется nil, то она по крайней мере объявлена. С другой стороны, можно явно объявить переменную, равную nil:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
cool_var = nil
Так можно делать, и, хотя это на первый взгляд и кажется глупым, так иногда делают. В последующих уроках вы узнаете, кто и зачем, и наверняка начнёте делать так же. Иногда, конечно же.
Будьте осторожны с nil»ом: напечатать nil можно, но совершать с ним арифметические операции нельзя! То есть, если print(nil) сойдёт вам с рук, то конструкция вроде 99+nil вызовет ошибку, даже если вам бы хотелось, чтобы 99+nil равнялось 99. Поверьте, я тоже огорчился, когда узнал.
Резюме:
1. Мы узнали про функцию print, что она умеет и как правильно вызывать её без скобок.
2. Узнали, как объявлять переменные, как вычислять выражения (правда, совсем немножко), какие могут быть имена у переменных.
3. Узнали про nil, прониклись его мистической загадочностью и обрели уверенность в том, что в будущем многое будем связано с ним.
Для пытливых и желающих укрепить свои познания предлагаю простые упражнения, которые можно не выполнять, если вы чувствуете себя и без того достаточно компетентным:
1. Напишите программу, которая выводит припев вашей любимой песни.
2. Попробуйте вывести значения следующий выражений. Попытайтесь понять, почему некоторые из них работают, а некоторые — нет. Посмотрите, какие ошибки вызывают несработавшие выражения.
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
2 + «string»;
6 + «14»;
«box» — «vox»;
1 * «11b»
«148» * «1e6»;
3. Напишите программу, которая обменивает две переменные значениями. То есть:
200?»200px»:»»+(this.scrollHeight+5)+»px»);»>
a = 6502
b = 8086
Сделайте так, чтобы a стала равна 8086, а b — 6502. Для этого создайте третью переменную и совершите нехитрые перестановки. Убедитесь, что задача решена правильно, вызвав print(a,b) до обмена и print(a,b) после.
Источник: shongames.ru
