*
Carlos Andres Delgado S, Ing
Mayo de 2018
2. No se permite división de grupos ni cambios de integrantes de última hora. No se recibirá el taller si esto
va producir conflictos entre los integrantes.
3. No se permite copiar código de Internet ni de sus compañeros. Si se encuentra código copiado el proyecto
será anulado por completo.
4. Entregue un sólo archivo
5. No deje que el enlace del campus se cierre. No se reciben trabajos por correo, no insista. Si el campus
falla, esto será verificado con la DINTEV. Recuerde estar autenticado ya que el curso permite acceso a
invitados
6. Las primeras lı́neas de cada archivo de código fuente, deben tener los integrantes del grupo con sus nombres
y código completos. Si no cumple esto, será sancionado con 0.5 en la nota de la entrega correspondiente.
7. Incluya los ejemplos solicitados. Si no realiza este paso con 0.5 en la nota de la entrega correspondiente.
* carlos.andres.delgado@correounivalle.edu.co
1
2. Introducción
El presente proyecto tiene por objeto enfrentar a los estudiantes del curso:
a la comprensión de todos los conceptos vistos en clase
3. Lenguaje OBLIQ
Obliq[1] es un lenguaje de programación interpretado que soporta programación orientada a objetos y tiene
una estructuras de paso de parámetros por valor. La sintaxis y semántica de Obliq es descrita a continuación:
<b o o l − e x p r e s i o n >
::= true
::= f a l s e
: : = <b o o l − p r i m i t i v a > " ( "{< e x p r e s i o n >}?(,) " ) "
: : = <bool−oper> " ( "{<b o o l − e x p r e s i o n >}?(,) " ) "
<bool−oper> : : = n o t | a n d | o r
2
3.2. Estructuras sintácticas
Identificadores: Son secuencias de caracteres alfanuméricos que comienzan con una letra
Definiciones: Comienzan con lalet, let rec o var seguido de una lista de ligaduras a expresiones, separados
por comas
Expresiones: En Obliq, casi todas las estructuras sintácticas son una expresión y todas las expresio-
nes producen un valor. Las expresiones pueden ser calificadas en Identificadores, datos, constructores u
operaciones
Comentarios: Inician con (* y terminan con *)
true,false booleanos
0,1, 1 enteros
‘a’ caracteres
“abc” cadenas
ok valor vacı́o
Operadores:
La primitiva is retorna verdadero si dos expresiones son iguales (es lo mismo que == de C++ o Java).
La primitiva & concatena dos textos
Objetos: Los objetos son una colección de campos xi =>ai donde xi es un nombre de campo y ai es una
expresión:
o b j e c t { x1 => a , x2 => a2 , . . . , xn => an }
3
• Una definición var introduce una colección de identificadores actualizables y sus valores iniciales
• Una definición let introduce una colección de identificadores no actualizables y sus valores iniciales
• Una definición let rec introducción una colección de procedimientos (no actualizables) recursivos
Asignación:
s e t x := a
Tenga presente que la asignación no puede realizarse en definiciones tipo let ni let rec.
Secuenciación:
a1 ; a 2 ; . . . ; a n
Un conjunto de expresiones puede ser evaluado secuencialmente, separándolos con “punto y coma”. Ejem-
plo:
v a r x = 3 i n b e g i n s e t x :=+(x 2 ) ; s e t x :=+( x 1) ; x end end
En donde b es una expresión y xi son los argumentos y s es el self (del objeto invocado). El s es obligatorio.
Los proc son procedimiento y los meth son los métodos en los objetos.
Condicionales:
i f a1 t h e n a2 elsif a3 t h e n a4 . . . else a n end
Iteraciones:
for x = a t o a2 d o a3 e n d
4
4. Evaluación
Este proyecto tendrá entregas parciales en los enlaces respectivos del campus virtual y una sustentación
corta utilizando la librerı́a SLLGEN de Dr Racket. Este debe sustentado y cada persona del grupo obtendrá
una nota entre 0 y 1 (por sustentación), la cual se multiplicará por la nota total en el proyecto. Este proyecto
tiene 3 entregas.
5. (10 puntos) Planteamiento del ambiente y funcionamiento de las estructuras de control: var, let y letrec.
En este punto se tendrá en consideración la abstracción del ambiente para funcionar con var y let, utilizando
un sólo Datatype
Entrega 3 pruebas de cada operador. Déjelas comentadas en el archivo. El interpretador tiene un ambiente
inicial con 3 variables y un procedimiento, dé valores a su gusto.
Entregue pruebas con 3 objetos que cumplan algun proposito especifico. Genere al menos 3 objetos clonados.
Referencias
[1] Cardelli, L. A language with distributed scope. In Proceedings of the 22Nd ACM SIGPLAN-SIGACT
Symposium on Principles of Programming Languages (New York, NY, USA, 1995), POPL ’95, ACM,
pp. 286–297.
Anexos
Factorial
let rec
Fact ( n )= i f i s ( n 0 ) t h e n 1 e l s e ∗ ( n a p p l y Fact (−(n 1 ) ) ) e n d
in
a p p l y Fact ( 5 )
end
5
Números primos
l e t primo =
o b j e c t { m =>
meth ( s , n )
begin
n;
let
s0 = clone ( s )
in
update s .m :=
meth ( s1 , n1 )
i f i s ( %(n1 n ) 0 ) t h e n
ok
else
s e n d s 0 .m( n1 )
end
end
end
end
end
}
muestra los primos ¡100
in
f o r i = 2 t o 100 d o s e n d primo .m( i ) e n d
end
6
Calculadora
let c a l c =
object {
a r g => 0 ,
a c c => 0 ,
entra un nuevo argumento
e n t e r =>
meth ( s , n )
begin
update s . a r g := n ;
s
end
end ,
la suma
add =>
meth ( s )
begin
update s . a c c := send s . e q u a l s ;
update s . e q u a l s := meth ( s ) +( g e t s . a c c g e t s . a r g ) e n d ;
s
end
end ,
la resta
sub =>
meth ( s )
begin
update s . a c c := send s . e q u a l s ;
update s . e q u a l s := meth ( s ) −( g e t s . a c c g e t s . a r g ) e n d ;
s
end
end ,
el resultado
e q u a l s =>
meth ( s )
g e t s . a r g end ,
inicializar
r e s e t =>
meth ( s )
begin
update s . a r g := 0;
update s . a c c := 0;
update s . e q u a l s := meth ( s ) g e t s . a r g e n d ; s e n d
end
}
in
begin
send c a l c . r e s e t ( ) ;
send c a l c . e n t e r ( 3 ) ;
send c a l c . e q u a l s ( ) ; 3
send c a l c . r e s e t ( ) ;
send c a l c . e n t e r ( 3 ) ;
s e n d c a l c . sub ( ) ;
send c a l c . e n t e r ( 2 ) ;
send c a l c . e q u a l s ( ) ; 1
send c a l c . r e s e t ( ) ;
send c a l c . e n t e r ( 3 ) ;
s e n d c a l c . add ( ) ;
send c a l c . e q u a l s ( ) ; 6
send c a l c . r e s e t ( ) ;
send c a l c . e n t e r ( 3 ) ;
s e n d c a l c . add ( ) ;
s e n d c a l c . add ( ) ;
send c a l c . e q u a l s ; 9 ;
ok
end
end