#+TITLE: Seven More Languages in Seven Weeks
#+BEAMER_HEADER: \subtitle{Lua}
#+BEAMER_HEADER: \institute[INST]{Extreme Tech Seminar}
#+AUTHOR: Correl Roush
#+EMAIL: correl@gmail.com
#+DATE: January 13, 2016
#+OPTIONS: H:2 toc:nil ^:nil
#+STARTUP: beamer indent
#+COLUMNS: %45ITEM %10BEAMER_env(Env) %10BEAMER_act(Act) %4BEAMER_col(Col) %8BEAMER_opt(Opt)
#+PROPERTY: BEAMER_col_ALL 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.0 :ETC
#+LaTeX_CLASS: beamer
#+LaTeX_CLASS_OPTIONS: [presentation,aspectratio=169]
#+LaTeX_HEADER: \usemintedstyle{solarizeddark}

* Introduction
** Introduction
*** Lua                                                               :BMCOL:
:PROPERTIES: 
:BEAMER_col: 0.5
:END:      
#+BEGIN_CENTER
#+LATEX: \fontspec{Antonio-Bold}\color{trek@lightblue}
#+LATEX: \fontsize{80}{80}\selectfont
LUA
#+END_CENTER
#+BEGIN_CENTER
#+LATEX: \fontspec{Antonio-Bold}\color{trek@midblue}
A powerful, fast, lightweight, embeddable scripting language
#+END_CENTER
*** Indiana Jones                                                     :BMCOL:
:PROPERTIES: 
:BEAMER_col: 0.5
:END:      
#+ATTR_LATEX: :width \textwidth
[[file:indianajones1.png]]
* Day 1
** Day 1: The Call to Adventure
- Installing Lua
- Exploring with the REPL
  - Syntax
  - Types
  - Functions
** Syntax
#+BEGIN_CENTER
/Whitespace doesn't matter/
#+END_CENTER
** Types
- Lua is /dynamically/ typed
- No integers (all numbers are 64-bit floats)
- =nil= is its own type
** Functions
- Functions are /first-class values/
- Arguments are flexible
- Support arbitrary numbers of arguments
- Support arbitrary numbers of results
- Lua does /tail call optimization/
** Variables
#+BEGIN_CENTER
Lua variables are /global by default/
#+END_CENTER
** Excercises
#+BEGIN_CENTER
#+LATEX: \fontspec{Antonio-Bold}\color{trek@lightblue}
#+LATEX: \fontsize{80}{80}\selectfont
Exercises
#+END_CENTER

*** Notes                                                          :B_note:
:PROPERTIES:
:BEAMER_env: note
:END:
- [[http://lua-users.org/wiki/][Lua Users Wiki]]
- [[http://www.lua.org/pil/contents.html][Programming in Lua (First Edition)]]
- [[http://www.lua.org/manual/5.1/][Lua 5.1 Reference Manual]]
- [[http://www.lua.org/manual/5.1/manual.html#2.4.4][The difference between a while and repeat loop]]

* Day 2

** Day 2: Tables All the Way Down
#+BEGIN_CENTER
#+ATTR_LATEX: :width 0.75\textwidth
[[file:Picnic_Table_Stack.jpg]]
#+END_CENTER

** Tables as Dictionaries
#+BEGIN_SRC lua
  book = {
     title  = "Grail Diary",
     author = "Henry Jones",
     pages  = 100
  }

  book.stars  = 5
  book.author = "Henry Jones, Sr."
#+END_SRC
** Tables as Arrays
- Lua counts array indices starting at *1*
#+BEGIN_SRC lua
  medals = {
     "gold",
     "silver",
     "bronze"
  }

  medals[4] = "lead"
#+END_SRC
** Metatables
*** Left                                                            :BMCOL:
:PROPERTIES:
:BEAMER_col: 0.5
:END:
#+BEGIN_SRC lua
  function table_to_string(t)
     local result = {}

     for k, v in pairs(t) do
        result[#result + 1] = k .. ": " .. v
     end

     return table.concat(result, "\n")
  end

  greek_numbers = {
     ena  = "one",
     dyo  = "two",
     tria = "three"
  }
  mt = {
     __tostring = table_to_string
  }
  setmetatable(greek_numbers, mt)

#+END_SRC
*** Right                                                           :BMCOL:
:PROPERTIES:
:BEAMER_col: 0.5
:END:
#+BEGIN_EXAMPLE
  > =greek_numbers
  ena: one
  tria: three
  dyo: two
#+END_EXAMPLE
** OOP
*** Left                                                            :BMCOL:
:PROPERTIES:
:BEAMER_col: 0.5
:END:
#+BEGIN_SRC lua
  Villain = {
     health = 100,
     new = function(self, name)
        local obj = {
           name   = name,
           health = self.health
        }
        setmetatable(obj, self)
        self.__index = self
        return obj
     end,
     take_hit = function(self)
        self.health = self.health - 10
     end
  }
#+END_SRC
*** Right                                                           :BMCOL:
:PROPERTIES:
:BEAMER_col: 0.5
:END:
#+BEGIN_SRC lua
  SuperVillain = Villain.new(Villain)

  function SuperVillain.take_hit(self)
     -- Haha, armor!
     self.health = self.health - 5
  end

  SuperVillain:new("Toht")
#+END_SRC
** Coroutines
#+BEGIN_QUOTE
You may be wondering how Lua handles multithreading.

It doesn't.
#+END_QUOTE
** Coroutines
*** Generator                                                   :B_example:
:PROPERTIES:
:BEAMER_env: example
:END:
#+BEGIN_SRC lua
  function fibonacci()
     local m = 1
     local n = 1

     while true do
        coroutine.yield(m)
        m, n = n, m + n
     end
  end

  generator = coroutine.create(fibonacci)
  succeeded, value = coroutine.resume(generator)
  -- value = 1
#+END_SRC
** Multitasking
#+BEGIN_CENTER
#+LATEX: \fontspec{Antonio-Bold}\color{trek@lightorange}
#+LATEX: \huge
Example: Building a Scheduler
#+END_CENTER
** Excercises
#+BEGIN_CENTER
#+LATEX: \fontspec{Antonio-Bold}\color{trek@lightblue}
#+LATEX: \fontsize{80}{80}\selectfont
Exercises
#+END_CENTER
* Day 3

** Day 3: Lua and the World
#+BEGIN_CENTER
#+LATEX: \fontspec{Antonio-Bold}\color{trek@lightorange}
#+LATEX: \huge
Example: Making Music
#+END_CENTER
** Excercises
#+BEGIN_CENTER
#+LATEX: \fontspec{Antonio-Bold}\color{trek@lightblue}
#+LATEX: \fontsize{80}{80}\selectfont
Exercises
#+END_CENTER
* Wrapping Up

** Wrapping Up
#+BEGIN_QUOTE
A lot of programmers see the surface of Lua’s clean syntax and assume
it’s just another everyday scripting language. I certainly had that
feeling at first glance. But I hope that as you’ve taken a deeper look
at its tables and coroutines, you’ve enjoyed their beauty and
simplicity.
#+END_QUOTE
** Wrapping Up: Strengths
- Approachable
- Portable
- Easily included in other projects
** Wrapping Up: Weaknesses
- Batteries not included
- Inefficient string handling
- Quirky
** Final Thoughts
#+BEGIN_QUOTE
Lua’s prototype-based object approach proves that you don’t need
classes to build a great object system.
#+END_QUOTE