Skip to Content

Lenguaje de la Materia

Se utiliza un lenguaje inventado específicamente para la materia, que nos permite definir procedimientos y funciones.

Procedimientos

Un procedimiento encapsula un bloque de código con su respectiva declaración de variables (que define el estado).

\[\begin{align} &\proc \; nombre(< \bfin | \out | \inout > p_1 : T_1, \; \ldots, \; < \bfin | \out | \inout > p_n : T_n) \\ &\quad < \textnormal{declaraciones de variables} > \\ &\quad < \textnormal{sentencias} > \\ &\bfend \; \proc \\ \end{align} \]

Donde \(p_1, \; \ldots, \; p_n\) son nombres de variables (parámetros) y \(T_1, \; \ldots, \; T_n\) sus respectivos tipos.

Entrada/salida de parámetros:

  • \(\bfin\) es el parámetro de entrada (no modificable)
  • \(\out\) el parámetro de salida.
  • \(\inout\) el parámetro de entrada/salida.

Un ejemplo de declaración de procedimiento es el siguiente:

\[\begin{align} &\proc \; abs(\bfin \; x : \intt, \; \out \; y : \intt) \\ &\quad \if \; x >= 0 \; \then \\ &\quad \quad y := x \\ &\quad \else \\ &\quad \quad y := -x \\ &\quad \fi \\ &\bfend \; \proc \\ \end{align} \]

Un ejemplo de llamada de este procedmiento puede ser:

\[\begin{align} &\proc \; llamadordeabs() \\ &\quad \var \; a, b : \intt \\ &\quad a := -10 \\ &\quad \else \\ &\quad abs(a,b) \\ &\quad \{- \;\; b = 10 \;\; -\} \\ &\bfend \; \proc \\ \end{align} \]

Observaciones:

  • Los procedimientos no devuelven cosas (pero pueden escribir varios parámetros \(\out\)).
  • Las llamadas a estos son sentencias del lenguaje.

Funciones

Las funciones son como procedimientos salvo que todos los parámetros son \(/bfin\) y devuelven algo.

\[\begin{align} &\fun \; nombre(p_1 : T_1, \; \ldots, \; p_n : T_n) \; \ret \; r : T \\ &\quad < \textnormal{declaraciones de variables} > \\ &\quad < \textnormal{sentencias} > \\ &\bfend \; \fun \\ \end{align} \]

Donde \(p_1, \; \ldots, \; p_n\) y \(r\) son nombres de variables (parámetros) y \(T_1, \; \ldots, \; T_n\) sus respectivos tipos.

Un ejemplo de declaración de función es el siguiente:

\[\begin{align} &\fun \; abs(\bfin \; x : \intt) \; \ret \; y : \intt \\ &\quad \if \; x >= 0 \; \then \\ &\quad \quad y := x \\ &\quad \else \\ &\quad \quad y := -x \\ &\quad \fi \\ &\bfend \; \fun \\ \end{align} \]

Y un ejemplo de llamada es:

\[\begin{align} &\proc \; llamadordeabs() \\ &\quad \var \; a, b : \intt \\ &\quad a := -10 \\ &\quad b := 35 \\ &\quad b := abs(a) \\ &\quad a := abs(a) + 10 \\ &\quad \{- \;\; b = 10, \; a = 20 \;\; -\} \\ &\bfend \; \proc \\ \end{align} \]

Observaciones sobre funciones:

  • No hay sentencia return. Se devuelve lo que sea asignado a la variable declarada como \(\ret\). La variable se puede usar libremente en el cuerpo de la función (se puede leer, asignar varias veces, etc.).
  • Las llamadas a funciones no son sentencias, son expresiones (e.g. se puede usar en la parte derecha de una asignación, en una guarda, etc).
  • Las funciones no tienen efectos colaterales en el estado. Una función no puede escribir las variables correspondientes a los parámetros.

Observaciones generales:

  • Cada función y procedimiento define un estado propio llamado “contexto”. Las variables declaradas dentro de funciones y procedimientos no existen fuera de éstas.
  • Cualquier función o procedimiento pueden llamar a cualquier otra función o procedimiento. Incluso pueden llamarse a sí mismas (recursión), y también mutuamente (recursión mutua).
  • No importa el orden en que se declaran, un procedimiento puede llamar a otro que esté definido más adelante.
  • No se pueden definir procedimientos ni funciones dentro de procedimientos o funciones (no hay anidamiento, todas las definiciones están al mismo nivel).

Tipos Nativos

Los tipos nativos son los tipos que trae predefinido el lenguaje de programación.

Tipos básicos:

  • \(\bool\): booleanos (\(True\) y \(False\))
  • \(\intt\): enteros
  • \(\nat\): naturales (con el \(0\))
  • \(\real\): reales
  • \(\char\): caracteres (\(\textnormal{'} a \textnormal{'}\))
  • \(\string\): secuencias de caracteres (\(\textnormal{"string"}\))

Se utilizan constantes que sirven como infinito/-infinito, etc.

Tipos estructurados:

  • \(\array\): arreglos
  • \(\pointer\): punteros

Expresiones

Expresiones válidas en programación imperativa:

  • valores constantes
  • variables y constantes declaradas
  • operaciones básicas \((+, -, *, /, \textnormal{div}, \textnormal{mod}, \textnormal{max}, \textnormal{min}, ∧, ∨, ¬, =, ≠, ≤, <, >)\)
  • accesos a elementos de arreglos
  • llamadas a funciones

Sentencias

Skip

Utilizamos \(\skip\) para no hacer nada.

Asignación

La sintaxis es: \(v := E\) donde \(v\) es variable y \(E\) expresión. No se utiliza la asignación múltiple en este lenguaje

Llamada a procedimiento

Llamamos los procedimientos como \(nombreproc(e_1, \ldots, e_n)\)

Condicional

Utilizamos \(\if, \; \then, \; \else\) de las siguientes maneras:

\[\begin{align} &\if \; B \; \then \\ &\quad S_1 \\ &\else \\ &\quad S_2 \\ &\fi \end{align} \]

O también, sin el \(\else\)

\[\begin{align} &\if \; B \; \then \\ &\quad S \\ &\fi \end{align} \]

Donde \(B\) es una guarda y expresión booleana, y \(S, S_1, S_2\) sentencias.

Repetición

Utilizamos \(\while, \; \do\):

\[\begin{align} &\while \; B \; \do \\ &\quad S \\ &\od \end{align} \]

Donde \(B\) es una guarda y expresión booleana, y \(S\) una sentencia.

Otras repeticiones, for to, for downto

Sintaxis de \(\for \; \too\):

\[\begin{align} &\for \; i:=N \; \too \; M \; \do \\ &\quad S \\ &\od \end{align} \]

Donde \(N\) y \(M\) son expresiones de tipo \(\intt\) y \(S\) es sentencia.

Su semántica es la siguiente:

  1. Se declara la variable \(i\) (sólo exisitirá dentro de la sentencia \(S\))
  2. Se le asigna a \(i\) el valor \(N\)
  3. Se ejecuta \(S\)
  4. Se incrementa \(i\) en \(1\)
  5. Si \(i > M\) termina, si no vuelve al punto 3.
  6. \(i\) deja de existir al terminar.

Sintaxis de \(\for \; \downto\):

\[\begin{align} &\for \; i:=N \; \downto \; M \; \do \\ &\quad S \\ &\od \end{align} \]

Donde \(N\) y \(M\) son expresiones de tipo \(int\) y \(S\) es sentencia.

Su semántica es igual a \(\for \; \too\) pero restando \(1\).

Observaciones:

  • No hace falta declarar el \(i\) (el \(\for\) ya lo declara)
  • Si había otra variable \(i\) afuera, esta \(i\) la tapa.
  • No se puede modificar \(i\) con asignaciones en el cuerpo del ciclo (\(S\))
  • No agrega expresividad al lenguaje (todo se puede hacer con \(\while\)).
  • itera desde \(N\) hasta \(M\) inclusive

Un ejemplo de \(\for \; \too\) podría ser:

\[\begin{align} &\var \; precios : \array [1..100] \; \of \; \intt \\ &\for \; i:=1 \; \too \; 100 \; \do \\ &\quad precios[i] := 0 \\ &\od \end{align} \]

Y para \(\for \; \downto\),

\[\begin{align} &\var \; precios : \array [1..100] \; \of \; \intt \\ &precios[100] := 35 \\ &\for \; i:=99 \; \downto \; 1 \; \do \\ &\quad precios[i] := precios[i+1] * 2 \\ &\od \end{align} \]

Secuenciación

No hay secuenciación explícita como en Algoritmos 1, basta con poner una sentencia después de otra.

Última vez actualizado el 9 de marzo de 2025