Você está na página 1de 12

6/12/12

1
Llnguagem de scrlpung
Mrclo Lopes Cornello
Cln-ulL
Llnguagens de rogramao
1radlclonals
Apllcaes auLo-conudas
AcelLao uma enLrada, manlpulao e gerao de
salda
Lnfase em eclncla, manuLeno, porLabllldade
e deLeco esLuca de erros
SlsLema de upos
Lnvolve concelLos assoclados a hardware: numeros de
ponLo-uLuanLe, caracLeres, arrays
Coordenao enLre programas
Llnguagens de rogramao
Scrlpung
Lnfase em exlbllldade, desenvolvlmenLo rpldo,
verlcao dlnmlca (em Lempo de execuo)
SlsLema de upos
Lnvolve concelLos como Labelas, padres, llsLas e
arqulvos
!"#$
Comblnao de componenLes escrlLos em ouLras
llnguagens
LxLenso
Llnguagens de scrlpung
CaracLerlsucas comuns
Modos baLch e lnLerauvo
Lconomla de expresses
LvlLam declaraes exLensas
lalLa de declaraes, regras de escopo slmples
ueclaraes globals so comuns
Lm cerLas llnguagens (P, por exemplo), Loda
declarao e local (defaulL)
1lplcao dlnmlca exlvel
ulnamlcamenLe upadas
verlcao anLes do uso
ConLexLo deLermlna a lnLerpreLao
Llnguagem Lua
CaracLerlucas
LxLenslbllldade
ro[eLada para ser esLendlda com Lua mesmo ou com
ouLra llnguagem
Slmpllcldade
Slmples, pequena. oucos concelLos, mas poderosos. lcll
de aprender
Lclncla
lmplemenLao eclenLe. uma das mals rpldas llnguagens
de scrlpung
orLabllldade
laLaformas: laySLauon, xbox, Mac CS x, Wlndows, unlx*
6/12/12
2
%&#'() de cdlgo
Cada pea de cdlgo que Lua execuLa (arqulvo
ou uma unlca llnha em modo lnLerauvo) e
chamado de *&#'(
no so necessrlo separadores, mas pode-se
(aconselha-se) o uso de ponLo-e-vlrgula
Lxemplo de *&#'() vlldos e equlvalenLes
a = 1
b = a*2
a = 1,
b = a*2,
a = 1 , b = a*2
a = 1 b = a*2
ldenucadores
Lua e *,)$-)$')./0$
ldenucadores
Cadelas de caracLeres, dlglLos e underscore, no
pode comear com dlglLo
alavras-reservadas
and break do else elself
end for lf ln funcuon
local nll noL or
repeaL
Lhen unul whlle
reLurn
1lpos e valores
Lua e dlnamlcamenLe upada
no h denlo de upos na llnguagem, cada
valor Lem seu prprlo upo
Sels upos bslcos
'." 1 233"$,'1 '#42$51 )65.'71 #)$58,6,1 9#'*/3'1
6&5$,8 e 6,2"$
luno 6:;$ reLorna o upo de um valor
prlnL(Lype(Pello world" )
prlnL(Lype(10*3))
varlvels
no possuem valores pre-denldos, qualquer
varlvel conLem qualquer upo
prlnL(Lype(a))
a = 10
prlnL(Lype(a))
a = prlnL
prlnL(Lype(a))
nll
1lpo com um unlco valor ('.") que Lem a
proprledade de ser dlferenLe de qualquer
ouLro valor
ara deleLar uma varlvel global, aLrlbulmos
'." a ela
L um no-valor, a ausncla de valor uul
8oolean
uols valores: !"#$ e %&'($
Sem monopllo
Cualquer valor represenLa uma condlo
Comandos condlclonals LraLam %&'($ e '." como
falso, qualquer ouLro valor, como verdadelro
ALeno: zero e sLrlngs vazlas so LraLados como
verdadelros
6/12/12
3
numbers
8epresenLam os numeros reals (ponLo-
uLuanLe de dupla preclso)
no h o upo lnLelro
Lxemplos de consLanLes numerlcas
4 4. .4 0.4 4.37e-3 0.3e12 3e+20
SLrlngs
Sequncla de caracLeres
Cualquer dado blnrlo pode ser armazenado
em uma sLrlng
So valores lmuLvels: uma mudana em um
caracLer crla uma nova sLrlng com a
modlcao
a = "one string
b = string.gsub(a, "one", "another)
print(a)
print(b)
SLrlngs
So alvo de gerenclamenLo auLomuco de
memrla como ouLros ob[eLos de Lua (Lables,
funcuons eLc)
no e preclso alocar e desalocar
> prlnL ("one llne\nnexL llne\n\"ln quoLes\" , 'ln quoLes'")
one llne
nexL llne
ln quoLes" , 'ln quoLes'
SLrlngs
uellmlLando com colcheLes
ul quando uma sLrlng conLem um programa
page = [[<P1ML>
<PLAu>
<1l1LL>An P1ML age</1l1LL>
</PLAu>
<8Cu?>
<A P8Ll="hup://www.Lecgraf.puc-rlo.br/lua">Lua</A>
[[a LexL beLween double brackeLs]]
</8Cu?>
</P1ML>
]]
wrlLe(page)
Converso de upos
Converso auLomuca enLre numeros e sLrlngs
Comparao 10 == "10" resulLa em falso
prlnL("10"+1) --> 11
prlnL("10+1") --> 10+1
prlnL("-3.3e-10"*"2") --> -1.0e-0
prlnL("hello"+1) -- L88C8 ("hello" cannoL be
converLed)
prlnL(10 .. 20) --> 1020
SLrlngs
luno 63'#42$5
l = lo.read()
n = Lonumber(l)
lf n == nll Lhen
error(l.." ls noL a valld number")
else
prlnL(n*2)
end
luno 63)65.'7
prlnL(LosLrlng(10) == "10") --> 1 (Lrue)
prlnL(10.."" == "10") --> 1 (Lrue)
6/12/12
4
1abela
lmplemenLa arrays assoclauvos
ode ser lndexado no apenas por numeros, mas
Lambem por sLrlngs ou qualquer valor da llnguagem,
exceLo *+'
no Lem Lamanho xo
nlco mecanlsmo de esLruLurao de dados de
Lua, mas poderoso
usada para represenLar
arrays ordlnrlos, Labelas de slmbolos, con[unLos,
reglsLros, las, eLc
1abela
no e um valor ou varlvel, mas um ,-.$!,
ulnamlcamenLe alocado
Manlpulao de refernclas
no h necessldade de declarar Labela em Lua
Crladas com uma expresso de consLruLor
a =
k = "x"
a[k] = 10
a[20] = "greaL" value="greaL"
prlnL(a["x"])
k = 20
prlnL(a[k])
a["x"] = a["x"]+1
prlnL(a["x"])
1abela
L annlma
no h relao xa enLre uma varlvel que
manLem a Labela e Labela em sl
a =
a["x"] = 10
b = a
prlnL(b["x"])
b["x"] = 20
prlnL(a["x"]
a = nll
b = nll
Sem referncla, pode ser felLa coleLa de llxo
1abela
ara represenLar reglsLros, Lua usa o nome do
campo como lndlce
a.x = 10 --> mesmo que a[x"]=10
prlnL(a.x) --> mesmo que prlnL(a[x"])
prlnL(a.y) --> mesmo que prlnL(a[y"])
Lrro comum: confundlr ,<= com ,>=?. C prlmelro
represenLa ,>@=A?, o segundo, a Labela lndexada com o
valor da varlvel =
a = , x = "y"
a[x] = 10,
prlnL(a[x]) --> 10
prlnL(a.x) --> nll
prlnL(a.y) --> 10
1abela
usando uma Labela como array ou llsLa
a =
for l=1,10 do
a[l] = lo.read()
end
Conveno: em Lua arrays comeam em 1
Cperador reLorna o ulumo lndlce
prlnL(a[a])
a[a]=nll
a[a+1]=v
a =
for l=1,10 do
a[a+1] = lo.read()
end
1abela
Cual e o Lamanho desLe array
a =
a[1000] = 1
Cualquer lndlce no-lnlclallzado resulLa em '."
llag para Lermlno do array
Array com elemenLos '.", assume-se qualquer deles e a
marca de m do array
6/12/12
5
1abela
uuvlda sobre upos dos lndlces
Converso expllclLa
l = 10, [ =10", k = +10"
a = ,
a[l] = um valor"
a[[] = ouLro valor"
a[k] = alnda ouLro valor"
prlnL(a[[])
prlnL(a[k])
prlnL(a[Lonumber([)])
prlnL(a[Lonumber(k)])
lunes
valores de prlmelra classe em Lua
Armazenadas em varlvels, passadas como
argumenLos para ouLras funes, reLornadas como
resulLados
SuporLe programao funclonal
Lxpresses em Lua
Cperadores
Cperadores arlLmeucos
'+', '-', '*', '/', '' (exponenclao), '' (mdulo) e
'-' (negaco unrlo)
Cperadores relaclonals
< > <= >= == =
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a
-- a==c mas a~=b
"aca" < aa" < "acorde
Cperadores
Lglcos
and or noL
%&'($ $ '." so falsos, Lodo o resLanLe verdadelro
&*/ e ," usam avallao em curLo-clrculLo
x = x or v e equlvalenLe a lf x == nll Lhen x = v end
(e and a) or b, e equlvalenLe expresso de C
e a : b
max = ((x > y) and x) or y
print(4 and 5) --> 5
print(nil and 13) --> nil
print(false and 13) --> nil
print(4 or 5) --> 4
print(nil or 5) --> 5
Cperadores
ConcaLenao
print(Hello .. World)
print(0 .. 1)
a = Hello
print(a .. World)
print (a)
6/12/12
6
ConsLruLores de Labelas
Lxpresses que crlam ou lnlclallzam Labelas
dias = {segunda, tera, quarta, quinta, sexta}
print(dias[4])
a = {x = 10, y = 20} -- equivalente a
a = {}, a.x=10, a.y =20
Adlo e remoo de campos
w = {x=0, y=0, label="console"}
x = {math.sin(0), math.sin(1), math.sin(2)}
w[1] = "outro campo"
x.f = w
print(w["x"])
print(w[1])
print(x.f[1])
w.x=nil
1abelas
Crlando e lnlclallzando uma llsLa encadeada
ercorrendo uma llsLa
list = nil
for line in io.lines() do
list = {next=list, value = line}
end
local l = list
while l do
print(l.value)
l = l.next
end
Comandos
ALrlbulo
Mulupla
A[usLe de numero de valores ao numero de
varlvels
a, b = 10, 2*x
x , y = y, x
a[i], a[j] = a[j], a[i]
a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
Comandos
varlvels locals
Lua suporLa varlvels locals, com o comando
',0&'
j = 10
local i =1
Lscopo llmlLado ao bloco (esLruLura de conLrole
x = 10
local i = 1 -- local ao chunk
while i<=x do
local x = i*2 -- local ao corpo do while
print(x)
i = i+1
end
if i > 20 then
local x - local ao corpo do "then
x = 20
print(x+2)
else
print(x) --> 10 (global)
end
print(x) --> 10 (global)
varlvels locals
no modo lnLerauvo, usar /,-$*/ para
dellmlLar blocos
do
local a2 = 2*a
local d = sqrt(b^2-4*a*c)
x1 = (-b+d)/a2
x2 = (-b-d)/a2
end
print(x1, x2)
6/12/12
7
varlvels locals
ueclarao sem valor lnlclao expllclLo, e
lnlclallzada com '."
local a, b = 1, 10
if a<b then
print(a) --> 1
local a -- = nil est implcito
print(a) --> nil
end -- finaliza o bloco que comeou no then
print(a,b) --> 1 10
LsLruLuras de conLrole
lf Lhen else
if a < 0 then a = 0 end
if a < b then return a else return b end
AnlnhamenLo
if op == "+" then
r = a+b
elseif op == "-" then
r = a-b
elseif op == "*" then
r = a*b
elseif op == "/" then
r = a/b
else
error ("invalid operation")
end
LsLruLuras de conLrole
whlle repeaL unul
local i = 1
while a[i] do
print(a[i])
i = i+1
end
repeat
line = os.read()
until line ~= ""
lor
numerlco
A varlvel de conLrole de loop e local e
auLomaucamenLe declarada
1odas as expresses so avalladas de uma vez,
anLes do loop lnlclar
for var=exp1,exp2,exp3 do
<algo>
end
for i=10,1,-1 do print(i) end
a = {a, b, c, d}
for i=1,f(x) do print(i) end
lor
enerlco
for i, v in pairs(a) do print(v) end imprime os valores de a
t = {x = 1, y = 10, z = -4}
for k,v in t do print(k,v) end
revDias={}
for k, v in pairs(dias) do
revDias[v] = k
end
lunes
6/12/12
8
lunes
CompuLam e reLornam valores
print(8*9, 9/8)
a = sin(3)+cos(10)
uenlo
function add (a)
local sum = 0
for i = 1, getn(a) do
sum = sum + a[i]
end
return sum
end
lunes
numero de argumenLos
function f(a, b) return a or b end
CHAMADA PARAMETROS
f(3) a=3, b=nil
f(3, 4) a=3, b=4
f(3, 4, 5) a=3, b=4 (5 descartado)
function inc_count (n)
n = n or 1
count = count + n
end
inc_count(5)
inc_count(1) ! inc_count()
lunes
Muluplos resulLados
function foo0 () end -- sem resultados
function foo1 () return a end retorna 1 resultado
function foo2 () return a,b end -- retorna 2 resultados
foo0()
foo1() -- a descartado
foo2() -- a e b descartados
print(foo0()) -->
print(foo1()) --> a
print(foo2()) --> a b
print(foo2().."x") --> ax
x,y=foo0() -- x=nil, y=nil
x,y=foo1() -- x=a, y=nil
x,y=foo2() -- x=a, y=b
x=foo2() -- x=a, b is discarded
lunes
numero de parmeLros varlvels
uma mesma funo recebe um numero varlvel
de argumenLos
ArgumenLos coleLados lnLernamenLe (0,5,57))
function add(...)
local s = 0
for i,v in ipairs{...} do
s = s + v
end
return s
end
print (add(3, 4, 1, 25))
lunes
lunes como valores de prlmelra classe
valor como, por exemplo, numeros e sLrlngs
odem ser armazenadas em varlvels (globals e
locals) e Labelas
Lscopo lexlco
uma funo pode acessar varlvels da funo em
que esL lnserlda
Lambda calculus
lunes
lunes so annlmas em Lua
print e uma varlvel que manLem uma
funo
a = {p = print}
a.p(Oi)
print = math.sin
a.p(print(1))
sin = a.p
sin(10, 20)
6/12/12
9
lunes como valores
ueclarao de funo e um comando (uma
aLrlbulo)
function (x) .... end como
consLruLor de funes
8esulLado: funo annlma
function foo (x) return 2 * x end
foo = function (x) return 2*x end
upvalue
luno lnserlda em ouLra funo Lem acesso
s varlvels locals da uluma
Lscopo lexlco
A funo annlma refere-se a uma varlvel no-local i
(#;0,"#$) para manLer o conLador
function newCounter ()
local i = 0
return function ()
i = i +1
return i
end
end
%"3)#5$
luno e acesso a varlvels no-locals
Cada chamada a funo newCounLer crla uma
nova varlvel local l
c1 = newCounter()
print(c1())
print(c1())
c2 = newCounter()
print(c2())
print(c1())
print(c2())
C *"3)#5$ e o valor em Lua, no a funo
8edenles de funes
or serem armazenadas em varlvels, funes
podem ser redenldas
Lxemplo: usando a denlo orlglnal na nova
lmplemenLao
oldSin = math.sin
math.sin = function (x)
return oldSin(x*math.pi/180)
end
do
local oldSin = math.sin
local k = math.pi/180
math.sin = function (x)
return oldSin(x*k)
end
end
lunes no-globals
luno local (resLrlLa a um escopo)
luno local vlslvel em um *&#'(
local f = function (...)
...
end
local g = function (...)
...
f() f externo visvel
...
end
lunes no-globals
SlLuao em que a funo local alnda no esL
denlda
local fact = function (n)
if n == 0 then return 1
else return n*fact(n-1) -- buggy
end
end
Corrlglndo
local fact
fact = function (n)
if n == 0 then return 1
else return n*fact(n-1)
end
end
6/12/12
10
lLerador e *"3)#5$)
ConsLruo que permlLe lLerar sobre
elemenLos de uma coleo
1odo lLerador manLem algum esLado enLre
chamadas sucesslvas
Soluo: *"3)#5$)
function value (t)
local i = 0
return function () i = i + 1; return t[i] end
end
lLerador e *"3)#5$)
lLerador para llsLa
A funo 0,"#$) e uma fbrlca. Cada chamada
crla um novo *"3)#5$ que manLem no esLado
as varlvels L e l
function values (t)
local i = 0
return function () i = i + 1; return t[i] end
end
Corrounas
Corrounas
Slmllar a Lhread
Llnha de execuo com pllha, varlvels locals e
aponLador de lnsLrues
Comparulha varlvels globals
So colaborauvas
Lm dado momenLo, um programa com corrounas
execuLa apenas uma delas
A corrouna em execuo suspende a prprla
execuo apenas quando expllclLamenLe requlslLa
suspenso
Corrounas
1abela coroutine
lunes: create, status, resume,
yield
ArgumenLo para creaLe frequenLemenLe e
uma funo annlma
co = coroutine.create(function () print(oi") end)
print(co)
LsLados
Aps execuLar o corpo da corrouna muda o
esLado para 8$,8
print(coroutine.status(co))
Suspensa, rodando, morLa e normal
Aps crlada, o esLado e )#);$'8$8
print(coroutine.resume(co))
LsLados: mudando de )#);$'8$8 para 5#''.'7
luno 5$)#4$
6/12/12
11
luno :.$"8
ermlLe que uma corrouna rode aLe que
suspenda a prprla execuo para ser
reLomada depols co = coroutine.create(function ()
for i=1,10 do
print("co", i)
coroutine.yield()
end
end)
Cuando uma corrouna reLoma uma ouLra, a
prlmelra no ca suspensa (ou no poderla ser
reLomada), val para o esLado '354,"
print(coroutine.resume(co))
1roca de dados
ar 5$)#4$-:.$"8
C prlmelro resume sem yleld correspondenLe,
passa os argumenLos exLras para a funo
prlnclpal da corrouna
co = coroutine.create(function (a,b,c)
print("co", a,b,c)
end)
coroutine.resume(co, 1, 2, 3)
1roca de dados
uma chamada a 5$)#4$ (no havendo erros)
reLorna qualsquer argumenLos passado para o
:.$"8 correspondenLe
co = coroutine.create(function (a,b)
coroutine.yield(a + b, a - b)
end)
print(coroutine.resume(co, 20, 10)) --> true 30 10
1roca de dados
uma chamada a :.$"8 reLorna qualsquer
argumenLos exLras passada para o 5$)#4$
correspondenLe
co = coroutine.create (function ()
print("co", coroutine.yield())
end)
coroutine.resume(co)
coroutine.resume(co, 4, 5) --> co 4 5
1roca de dados
Cuando uma corrouna nallza, qualsquer
valores passados para a funo prlnclpal vo
para o 5$)#4$ correspondenLe
co = coroutine.create(function ()
return 6, 7
end)
print(coroutine.resume(co)) --> true 6 7
CaracLerlsucas
Corrounas asslmeLrlcas
lunes dlsunLas para suspender a execuo e
para reLom-la
Cbs: Serla slmeLrlca se houvesse apenas uma
funo para suspender e reLomar a execuo
Seml-corrouna
Corrouna pode suspender a execuo apenas
quando no esL chamando ouLra funo (no
chamadas pendenLes na pllha de conLrole)
Apenas o corpo do maln pode fazer :.$"8
6/12/12
12
roduLor-consumldor
LxecuLam sempre
roblema
Como casar )$'8 e 5$*$.0$
function producer ()
while true do local x = io.read() -- produz novo valor
send(x) -- envia para consumidor
end
function consumer ()
while true do local x = receive() -- recebe do produtor
io.write(x, "\n") -- consome novo valor
end
end
roduLor-consumldor
usando o par 5$)#4$-:.$"8
uma chamada a :.$"8, no enLra em uma nova
funo, mas reLorna para uma chamada pendenLe
(para reLomar execuo)
uma chamada a 5$)#4$ no lnlcla uma nova
funo, mas reLorna uma chamada a :.$"8
roduLor-consumldor
Comblnar um )$'8 com um 5$*$.0$, de modo
que a[am com mesLre e escravo
5$*$.0$ reLoma (5$)#4$) a execuo do produLor
)$'8 envla (:.$"8) o novo valor de volLa para o
consumldor
function receive ()
local status, value = coroutine.resume(producer)
return value
end
function send (x)
coroutine.yield(x)
end
roduLor-consumldor
roduLor como corrouna
producer = coroutine.create(
function ()
while true do
local x = io.read() -- produz novo valor
send(x)
end
end)
rograma comea chamando um consumldor
A cada lLem necessrlo, o consumldor reLoma o
produLor, esLe execuLa aLe Ler dado para o
consumldor, enLo para aLe o consumldor
relnlclar a execuo do produLor
lllLros
1arefa enLre o produLor e o consumldor
8eallza Lransformao nos dados
Consumldor e produLor ao mesmo Lempo

Você também pode gostar