You are on page 1of 3

04/04/13

25

26

Semntica de skip
El estado actual de la mquina es: ([(skip, E), (S1,E1) , (S2, E2), ] , ) El siguiente estado ser: ([(S1,E1) , (S2, E2), ] , )

Composicin Secuencial
El estado actual de la mquina es ([S1 S2 , E), (S3,E1) , (S4, E2), ] , ) El siguiente estado se consigue poniendo (S1, E) y (S2, E) en la pila semntica El siguiente estado queda entonces: ([(S1, E), (S2, E), (S3,E1), (S4, E2), ], )

27

28

Declaracin de Variables
El estado actual es: ([(local X1 in S1 end, E), (S2, E2), ], ) El siguiente estado es ([(S1, E), (S2, E2), ], ) donde E es E+{X1 X1} X1 es una variable nueva. es el resultado de haberle pedido al ASA que cree la nueva variable.

Igualdad Variable Valor


El estado actual es: ([(X1=<V>, E), (S2, E2), ] , ) El siguiente estado es ([(S2, E2), ] , ) donde es el resultado de haber modicado creando una nueva variable X2 creando el valor <V>, ligado a X2 ligando X2 con E(X1)

29

Alcance Lxico de identicadores de variables


Ocurrencias ligadas y libres de identicadores de variables: Una ocurrencia de un identicador de variable ser ligada con respecto a una sentencia s si la variable ocurre dentro de una declaracin. Un identicador de variable es declarado por una sentencia local, por un procedimiento o por un sentencia case. En caso contrario, una ocurrencia es libre. Un programa listo para ejecutar tiene que tener todas las ocurrencias ligadas con respecto al programa mismo <- Restriccin sintctica

30

Alcance Lxico
proc {P X} local Y in Y = 1 {Browse Y} end X = Y end Ocurrencias Libres Ocurrencias Ligadas

04/04/13

31

32

Alcance Lxico
local Arg1 Arg2 in Arg1 = 111*111 Arg2 = 999*999 Res = Arg1*Arg2 end

Alcance Lxico
local Res in local Arg1 Arg2 in Arg1 = 111*111 Arg2 = 999*999 Res = Arg1*Arg2 end {Browse Res} end ahora s es un programa ejecutable, porque Res ya no es una variable libre

Ocurrencia Libre

Ocurrencia Ligadas

Esto no es un programa ejecutable, porque la variable libre no puede tomar valor

33

34

Alcance Lxico
local P Q in proc {P} {Q} end proc {Q} {Browse hello} end local Q in proc {Q} {Browse hi} end {P} end end

valores de procedimientos
Un valor de procedimiento en el ASA incluye un ambiente (llamado porque este puede tener referencias externas. local P Q in Q = proc {$} {Browse hello} end P = proc {$} {Q} end local Q in Q = proc {$} {Browse hi} end {P} end end

35

valores de procedimientos en la memoria


los valores de procedimientos son pares (proc {$ Y1Yn} s end , CE) donde CE es un ambiente, llamado ambiente contextual

36

valores de procedimiento
La sentencia semntica es (X = proc {Y1Yn} s end, E) Y1Yn son los parmetros formales Sean Z1Zk los identicadores libres con respecto a s. Sea E igual a E |{Z1 ... Zk} Crear un nuevo valor de procedimiento de la forma: 1. (proc {$ Y1Yn} s end, E) , ligado a una variable fresca Xp 2. Ligar la variable E(X) a Xp

04/04/13

37

38

valores de procedimiento
local P Q in Q = proc {$} {Browse hello} end P = proc {$} {Q} end local Q in Q = proc {$} {Browse hi} end {P} X1 end P end proc{$}{Q}end

sentencias suspendibles
Las siguientes sentencias requieren que las variables marcadas estn ligadas a un valor para poder ejecutarse:

( , )
Q X2

X2 ( , )

s ::= | if var then s else s end | { var varvar } | case var of pattern then s1 else s2 end

condicional aplicacin de procedimiento pattern matching

proc{$}{Browse hello}end

BrowseX0

39

40

aplicacin de procedimiento
el estado actual es: ([({X Y1 Yk}, E), (S1, E1), ] , ) si E(X) es determinada: Si E(X)no es un valor de procedimiento o tiene aridad distinta de k, marcar un error Sea E(X) igual a (proc {$ R1Rk} S end, E) si E(X) es no determinada: suspender
([(S,E+{R1E(Y1),,RkE(Yk)}), (S1, E1), ], )

condicional
el estado actual es:
([(if X then S1 else S2 end , E), (S3, E3), ] , )

Si E(X) es determinada: E(X) no ligada a un booleano (true, false), marcar un error E(X) es true, ([(S1, E), (S3, E3), ] , ) E(X) es false, ([(S2, E), (S3, E3), ] , ) Si E(X) es no determinada: suspender

41

42

sentencia case
el estado actual tiene la siguiente sentencia (case X of g(f1 :X1 fn:Xn) then S1 else S2 end , E) si E(X) est determinada: si la etiqueta de E(X) es g y su aridad es [f1 fn]: [(local X1 = X.f1 Xn=X.fn in S1 end, E),] si no, empujar (S2,E) en la pila: [(S2,E),] si la condicin de activacin es falsa: suspender

Ejemplos de case
local X=foo(a:1 b:_) case X of foo(a:A b:B) then {Browse [A B]} else {Browse nope} end end local X case X of foo(a:A b:B) then {Browse [A B]} else {Browse nope} end end local X=foo(a:1 b:_) case X of Y(a:A b:B) then {Browse [A B]} else {Browse nope} end end

You might also like