====== Introduction to Lua ======
----
===== Lua =====
  * Creator: Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes, Pontifical Catholic University of Rio de Janeiro, Brazil
  * Introduced: 1993
  * Open source
  * Installable package on many UNIX/Linux systems
  * Windows installer at http://code.google.com/p/luaforwindows
  * Can be used for tasks that other dynamic programming languages are used for.
    * Has gained its most prominent footholds in the areas of embedded programming because of its relatively small size and as a scripting language for large games
      * UI modification in World of Warcraft, Rift, Age of Conan, Lord of the Rings Online, Warhammer Online, Runes of Magic and others
    * Also used to extend applications such as Wireshark (http://wiki.wireshark.org/Lua) and Adobe Lightroom (http://www.sauria.com/blog/2008/10/09/lua-in-lightroom/).
    * Wikipedia [[http://developers.slashdot.org/story/12/02/01/1429229/wikipedia-chooses-lua-as-its-new-template-language|to move to Lua]] for its templating system (~5/2012).
    * Several Lua-based game development platforms, including commercially-licensed
      * LOVE 2D - https://love2d.org/
      * Corona SDK - http://www.anscamobile.com/corona/ (mobile)
      * MOAI SDK - http://getmoai.com/ (mobile, cloud)
    * See more [[http://en.wikipedia.org/wiki/Lua_%28programming_language%29#Applications|Lua applications]]
----
===== Lua Online Resources =====
  * http://www.lua.org - Official site
  * http://www.lua.org/manual/5.1 - Reference manual
  * http://lua-users.org/wiki - User-created wiki
  * http://lua-users.org/wiki/TutorialDirectory - Directory of Lua tutorials
  * http://www.lua.org/cgi-bin/demo - Web-based demo
  * Books:
    * http://www.lua.org/pil/ - "Programming in Lua" (1st Ed.)
----
===== Lua Execution =====
  * Programs typically given .lua extension
  * Can be executed with //lua prog.lua//
  * Interactive shell by running //lua//
  * Web-based demo at http://www.lua.org/cgi-bin/demo
----
===== Lua Syntax =====
  * syntax very similar to Python and even more similar to Ruby
  * strength is in processing strings and tables
  * uses [[http://en.wikipedia.org/wiki/Type_conversion|coercion]] for every integer and number type to convert it into a single type
    * can add a float, long integer or a double to any other type of integer or number without a hitch
  * Tables (like dictionaries or hashes) are the only data structuring mechanism that Lua has.
    * Lua tables can emulate other data structures as needed.
  * Object-oriented programming implementation is minimalistic.
    * Lua uses tables and functions rather than classes.
===== Data Types =====
  * Because it is small, Lua has only eight basic data types:
    * nil (denotes no data type)
    * booleans
    * numbers
    * strings
    * functions
    * userdata (a type that allows arbitrary C data to be stored in Lua variables)
    * threads
    * tables
===== Variables and Identifiers =====
  * Because any value can represent a condition, booleans in Lua differ from those in many other languages. 
  * Both false and nil are considered false in Lua, but Lua considers everything else true (including zero and an empty string).
==== Global and local variables ====
    * Unlike Python, global variables do not need to be declared.
    * To create one, assign a value to it. To delete it, give it the nil value.
      * A global variable exists only if it has a non-nil value.
    * Most variables in Lua are global by default, and you must declare the variable "local" to make it a local variable.
==== No integer types ====
    * Because most CPUs perform floating-point arithmetic just as fast as integer arithmetic, numbers in Lua represent real, double-precision, and floating-point numbers rather than common integers.
    * Lua doesn't need integer types, so it doesn't have them.
==== Rename anything ====
  * You can basically rename anything in Lua, even to the point of making a function un-callable:
                x = io
                x.read()
                io = "Hello world!"
                x = "Let's make io uncallable!"
                io.read()
  * The second line--x.read()--gets keyboard input through the io module.
  * Because io is essentially a variable with a function as a value, you can give it a different value so that io does not relate to the input/output functions anymore. (line 3)
  * In line 5, when you try to get keyboard input from the io module again, Lua returns an error.
  * The program is unable to call the input/output functions now that io's value has been reassigned.
  * In order to use io again, you must restart the Lua program.
===== Operators and Assignment =====
==== Concatenate strings with .. ====
  * print("Hello".."World!") is valid.
  * print("I've said 'Hello World'"..5.."or more times.") is not valid.
  * print("I've said 'Hello World' " ..5 .. " or more times.")is valid.
==== Logical not operators ====
  * Lua uses ~= for the negation of equality.
==== Strings and integers ====
  * Lua treats strings and integers differently.
  * Although print("1" * 2) prints 2, "1" < 2 is always false.
===== Lua and OOP =====
  * Lua supports OOP, but due to Lua's size, its implementation of OOP lacks a few features.
  * Lua uses tables and functions for OOP rather than classes.
  * In the same way that Python accesses a member function or member variable of a class, Lua accesses it with Table.function or Table.variable.
  * Because Lua does not have the class concept, each object defines its own behavior and shape:
              -- This is a Lua comment.
              -- Definition of the Earth "class"
              -- starts with a table called Earth:
              Earth = {martians = 5389}
              function Earth:casualties (survivors)
                 Earth.martians = Earth.martians - survivors
                 print("Earth is free! "..Earth.martians.." martians survived!")
              end
              -- Call the Earth:casualties method:
              Earth:casualties(5380)
  * Second implemention of the above code:
              -- The casualties function is part of the table this time
              -- so that it can be called via the dot or the colon syntax.
              Earth = {martians = 5389,
                 casualties = function (self, survivors)
                    self.martians = self.martians - survivors
                    print("Earth is free! "..self.martians.." martians survived!")
                 end
              }
              Earth.casualties(Earth, 5380)
              Earth.martians = 5389
              Earth:casualties(5380)
----
===== Lua vs. Python =====
  * Simple trivia game in Lua code that uses a table as a dictionary to store both the questions and the answers:
print("What's your name?")
name = io.read()
questions = {
  ["Which came first? Minix or Unix?"] = "Unix", 
  ["Who created Linux?"] = "Linus Torvalds",
  ["In what year was Linux created?"] = "1991"
}
correct_answers = 0
for key,value in pairs(questions) do
   print(key)
   answer = io.read()
   if answer == value then
     correct_answers = correct_answers + 1
   end
end
if correct_answers == 0 then
   print("You need to browse Wikipedia!")
else
   print("\nGood job, "..name.."!")
   print("Correct answers: "..correct_answers..")
end
* Equivalent Python code
name = raw_input("What's your name?\n")
questions = {"Which came first? Minix or Unix?":"Unix",
"Who created Linux?":"Linus Torvalds",
"In what year was Linux created?":"1991"}
correct_answers = 0
for key in questions:
   print key
   answer = raw_input()
   if answer == questions[key]:
      correct_answers += 1
	
if correct_answers == 0:
   print "You need to browse Wikipedia!"
else:
   print "\nGood job, " + name + "!"
   print "Correct answers: ", correct_answers
----
===== Lua Tables =====
See the [[http://lua-users.org/wiki/TablesTutorial|Tables Tutorial]] at lua-users.org.
For an example of a two-dimensional array implemented through tables, see the LOVE game framework [[https://love2d.org/wiki/Tutorial:Gridlocked_Player|Gridlocked Player]] example.
----
===== Patterns (Regular Expressions) =====
See the [[http://lua-users.org/wiki/PatternsTutorial|Patterns Tutorial]] at lua-users.org.
----
===== Performance =====
See some [[http://trac.caspring.org/wiki/LuaPerformance|notes on Lua performance]] at trac.caspring.org
----
===== Coroutines (Threading) =====
See the [[http://lua-users.org/wiki/CoroutinesTutorial|Coroutines Tutorial]] at lua-users.org.
----