# Intro à Lua ## 17/05/2017 <img src="lua-logo.gif" alt="Lua logo" style="width: 20%;border: none"> Note: setup: luarocks install --server=http://luarocks.org luarepl inspect eval $(luarocks path --bin) rep.lua # use rlwrap ### Le langage (1/4) - 1993, écris en C - typé dynamiquement - garbage collection - first-class functions <pre style="width: 100%"><code class="lang-lua hljs">foo = function () print(42) end </code></pre> - closures - coercion (conversion auto number/string) ### Le langage (2/4) - gestion des erreurs via fonctions: `error` / `pcall` - modules: <pre style="width: 100%"><code class="lang-lua hljs">utils = require('utils') </code></pre> - package manager: `luarocks` - API Lua/C simple: LIFO stack - luaJIT ### Le langage (3/4) - variables globales par défault <pre style="width: 100%"><code class="lang-lua hljs">local foo = function () print(42) end </code></pre> - une fonction peut retourner plusieurs valeurs <pre style="width: 100%"><code class="lang-lua hljs">foo = function () return 4, 2 end </code></pre> - unpack - passage de paramètres par nom <pre style="width: 100%"><code class="lang-lua hljs">kung = function (t) return t.a + t.b end </code></pre> - varargs <pre style="width: 100%"><code class="lang-lua hljs">bar = function (a, ...) return a + ... end </code></pre> Note: foo = function (a, b) return a + b end foo(1, 2) foo(unpack({1, 2})) kung{a=1,b=2} bar(1, 2) bar(1) bar(1, 2, 3) ### Le langage (4/4) - iterators (coroutines) - ranges: `i = 1,100` - **tables** <pre style="width: 100%"><code class="lang-lua hljs">t = {a = 5, 10} </code></pre> - une valeur "`nil`" clôt une table Note: t[1] inspect = require('inspect') print(inspect({1, 2, nil, 3})) ### Lua & Redis - API Lua - Redis "`EVAL`", "`SCRIPT LOAD`" & "`EVALSHA`" - [tuto](https://www.redisgreen.net/blog/intro-to-lua-for-redis-programmers/) Note: redis-cli --eval incrset.lua links:counter links:urls , https://chezsoi.org redis-cli KEYS '*' redis-cli GET links:counter redis-cli HGET links:urls 1 ### Lua & Redis: what for ? - lock / atomic transactions (alt: `WATCH`/`MULTI`/`EXEC`) - conditional logic: `EXISTS`, `HEXISTS` - bénéficier de la stdlib (base, table, string, math, cjson, cmsgpack...) ### Lua & Nginx Avec [OpenResty](https://openresty.org) : serveur de webapps basé sur Nginx Trivia: le script Lua CLI de [Kong](https://github.com/Mashape/kong/blob/master/bin/kong) est démarré via [resty](https://github.com/openresty/resty-cli/blob/master/bin/resty), le script CLI d'OpenResty... écris en PERL ! ### Lua & Nginx: à quoi ça ressemble ? https://github.com/openresty/lua-nginx-module#synopsis https://github.com/openresty/lua-nginx-module#directives - `content_by_lua_block` - `content_by_lua_block` - `access_by_lua_file` ### Lua & Nginx: what for ? - gestion des accès & sécu custom - manipulation des headers HTTP - choix de backend dynamique - URL dispatch - cache custom ### Des questions ? - [Learn Lua in 15min](http://tylerneylon.com/a/learn-lua/) - [Sources de cette prez](https://github.com/Lucas-C/linux_configuration/blob/master/languages/Lua/prez-vsct-2017-05-17.html)