OpenWest 2014/Lua

From Omnia
Revision as of 15:10, 17 May 2014 by Kenneth (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Script up your application with Lua!

Ryan Erickson (@ryan_erickson)

"Come learn about Lua, the embeddable language that's used in everything from game scripting to Wikipedia, in mobile to web development. In this presentation, I'll give a short introduction to Lua, how it can be used to extend a C/C++ application, to allow complex scripting without losing performance. I'll also show some interesting Lua language features. Lastly, I'll give a live demonstration of the ease of embedding Lua into a C application."


Script up your application with Lua


Ryan's home automation - http://ericksonfamily.com/


The Programming Language Lua - http://www.lua.org/

Lua: getting started - http://www.lua.org/start.html

Installation:

yum install lua
curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz
tar zxf lua-5.2.3.tar.gz
cd lua-5.2.3
make linux test


History:

  • lua.org
  • created in 1993 at PUC-RIO
  • Predecessors: DEL and Sol (merged to Lua)
  • Lua is Portuguese for Moon, not an acronym (play on words from Sol)


Focus:

  • Simplicity for non-programmer audience
  • Portability
  • Designed to be easily embedded, extended
  • Clean ANSI C code
  • Garbage Collected


Why:

  • Size (tiny) < 100kb DLL/LIB
  • Runs on mobile / embedded devices
  • Performance - interpreted faster than Pyuthon, Ruby, Perl, PHP
    • Need faster? LuaJIT
    • LuaJIT is C++ / Java 6 territory (luajit.org)


Momentum:

  • Used a lot in games
  • Adobe Lightroom and Photoshop
  • First interpreted lanugage allowed on iOS
  • Angry Birds / World of Warcraft
  • Control4 uses


Safety:

  • Code runs in sandbox
  • Embedder chooses which modules to expose
  • Host application can provide APIs / primitives to Lua engine


Language:

  • Dynamically typed
  • Whitespace not significant
    • spaces, linebreaks, tabs, what you like
  • Semicolons not required, and discouraged
  • single line comments
  • variables are global by default, 'local' keyword


Types:

  • number, string, boolean, nil, table, function, userdata
  • numbers are double by default
  • can represent floats and integers
  • no i++, i+=2. use i =i +1


Strings:

  • single/double quote
  • backslash to escape
  • string concatenation uses '..' (not +)


nil:

  • empty value
  • evaluates to false
  • frees item for garbage collection


tables:

  • lua's single data structure
  • simultaneous array and hashmap
a = {"apple", "banana"}
b = {lua = "cool", java = "sucks"}
c = a
print(c[3], b.fred, b.["java"], a.grape)
  # orange 3 sucks nul
  • arrays in Lua are 1 based


Comments:

-- this is a comment
--[[ this is a multi
line comment ]]


Functions:

  • first class objects
function add(a, b)
   print(a + b)
end
multiply = function(a, b) print(a * b) end
plus = add
plus(3,5)


Control:

if ... then ... elseif ... else ... End
do
  print("one")
end
for i = 1, 10 do print(i) end
for k, v in pairs({"}} ???


C Programmer Hangups:

  • no curly braces - uses begin... end
  • No +=, ++
  • Not equals is "~="
  • Not is "not"
  • arrays start at 1
  • #array is not always right (if empty items in the middle)


C interface API

  • set of functions allow C to interact with Lua
  • functions to read/write lua global variables
  • functions to call lua functions
  • functions to register c functions to call within lua
  • stack based parameter passing


Book:


Reference PDF:


Demo:

-- comment
print("test" .. os.date())

function rirc(user, message)
  local no_err, errmsg = pcall(parseIRC, user, message)
  if (no_error == false) then SendIRC("ryan", errmsg) end
end

function parseIRC(user, message)
  message = message:gsub("%s", "") -- trim white space
  if (message == "|reload") then
    if (user == "ryan") then
      dofile("default.lua")
    end
  end
  if (message == "|echo") then
      SendIRC(user, "hello")
  end
  if (message:find("|giflet") ~= nil) then
      local figstr = message:sub(8)
      local sd = io.popen("figlet " .. figstr)
      while(line) do
            SendIRC(user, line)
      end
      sd:close()
  end

end