Hogar Mapa Indice Busqueda Noticias Arca Enlaces Sobre LF
[Top bar]
[Bottom bar]
[Photo of the Author]
por Emre Demiralp

Sobre el Author:

Soy un estudiante en el Istanbul American Robert College, y a la vez, uno de los administradores del Computer Labs en la Faculty of Arts and Sciences en la Istanbul Technical University. El sistema operativo que domina sobre todos los dem�s en estos laboratorios es LINUX. Intereses: PovRay y PostScript, animaci�n, dise�o de CDs, programaci�n, holograf�a, etc.. usuario de Linux desde 1994.

Contenidos:

  1. Introducci�n
  2. Manipulaci�n de la pila
  3. Operadores matem�ticos

PostScript II: La pila de operandos, manipulaciones y operadores matem'atico

[Ilustration]

Resumen:

Gota a gota, se hace un lago -Proverbio Turco-. El autor describe la pila de operandos del lenguaje PostScript. Se presentan aqu� las manipulaciones de la pila y los operadores matem�ticos. Este art�culo no cubre todas las propiedades de la pila de operandos. Los art�culos siguientes continuar�n hablando acerca de ello.



 

Introducci�n

Este es el segundo de una serie de art�culos acerca de PostScript. El prop�sito principal de este art�culo es comentar el manejo de la pila. La pila de operandos es quiz�s la parte m�s importante de PostScript. Asignaciones, operaciones aritm�ticas o matem�ticas, bucles y operaciones l�gicas son manejadas en esta porci�n de memoria espec�fica. �S�! La pila es una regi�n especial de memoria que PostScript usa para ejecutar casi cualquier cosa que nosotros queramos que PostScript haga. La pila mantiene la informaci�n en orden de forma que el �ltimo dato introducido sale primero. Puedes visualizar esto como una tuber�a con uno de sus extremos cerrado. Cuando pones algo en esta tuber�a, empujar� todos los elementos que ya estaban en ella hacia el extremo cerrado para hacer sitio para el mismo. Por lo tanto el �ltimo elemento en entrar ser� siempre el m�s cercano al extremo abierto de la tuber�a. Los elementos en la pila pueden ser cadenas de texto, constantes num�ricas, claves, bloques, ... �

 

Manipulaci�n de la pila

A pesar de que los elementos se ordenan en la pila, hay algunas operaciones de pila que nos permiten reordenar los elementos. Las "manipulaciones" se aplican a uno o m�s de los elementos de la pila. Los operadores, por definici�n, manipulan elemento(s) en la pila. Los operadores pueden o no necesitar par�metros (operandos en la terminolog�a PostScript) dependiendo del caracter de la manipulaci�n.� Si necesitan el(los) par�metro(s) entonces estos deben ser apilados en la pila primero. El operador toma acci�n entonces con respecto a estos operandos..� Aqu� se da una lista de estos operadores con las explicaciones necesarias. Adem�s se dan algunos ejemplos para ilustrarlo con m�s detalle.�

pop:
Este operador descarta el elemento que est� en la cima de la pila de operandos (el �ltimo en ser introducido).
exch:
Este operador intercambia los dos elementos que se encuentran en las posiciones m�s elevadas de la pila de operandos.�
dup:
Este operador crea una copia del �ltimo elemento introducido en la pila de operandos y lo apila en ella. En otras palabras, duplica el elemento de m�s arriba de la pila.�
copy:
Este operador necesita un operando entero (par�metro) que se debe introducir en la pila de operandos antes de que el operador act�e. Si le llamamos n a este par�metro entero, entonces el comando ser� n copy. Cuando se ejecuta el comando, se realiza una copia de los n elementos de la cima (los �ltimos en ser introducidos) y se colocan en la pila de operandos como los �ltimos elementos introducidos. En otras palabras, copy es un operador de duplicaci�n de conjuntos.�
index:
Este operador necesita un operando entero que se debe introducir en la pila de operandos antes de que el operador act�e. Si llamamos n a ese par�metro entero entonces el comando se introducir� como n index. Cuando esto se ejecuta, se crea una copia de los n elementos de las posiciones superiores de la pila (los �ltimos en ser introducidos) y se situa en la pila de operandos como los �ltimos elementos en ser introducidos. En otras palabras, index puede seleccionar un elemento interno y crear y situar una copia en la pila de operandos. El indexado de elementos empieza a partir del elemento de m�s arriba (�l �ltimo) con el n�mero 0.�
roll:
Este operador necesita dos par�metros enteros que se deben introducir en la pila de operandos antes de que el operador act�e. Si llamamos m y n a esos dos par�metros enteros entonces el comando ser� introducido como m n roll. Aqu� m denota cuantos elementos ser�n rotados mientras n indica el n�mero de rotaciones. Una rotaci�n se define de manera que el elemento de m�s arriba de la pila de operandos llega a ser el elemento m-esimo mientras el conjunto de m-1 elementos bajo el elemento de la cima son desplazados un lugar hacia la cima. Este esquema es v�lido cuando n es igual a 1. Si fuese 2 entonces ocurrir�an dos rotaciones consecutivas. En otras palabras m 2 roll es lo mismo que m 1 roll m 1 roll. El par�metro n puede tomar valores negativos. Si esto ocurre, se invierte la acci�n que ocurre cuando n es positivo. Esto significa que el efecto global del comando m n roll m -n roll es neutro. Esto deja la pila de operando sin cambio alguno. El indexado de los elementos empieza por el elemento de la cima que se considera que ocupa la posici�n 0.�
clear:
Este operador descarta todos los elementos de la pila de operandos.�
count:
Este operador cuenta los elementos de la pila de operandos. El resultado se apila en la pila de operandos como un elemento nuevo. Si no quieres este nuevo elemento entonces puedes formar el comando compuesto count pstack pop donde pop elimina el nuevo elemento que count ha creado despu�s de que el resultado del conteo sea visualizado a trav�s de la actuaci�n del operando de fichero pstack.��
mark:
Este operador coloca un elemento -marktype- en la pila de operandos. Este elemento se puede usar para dividir el conjunto de elementos de la pila de operandos en subconjuntos. Hay otras dos operaciones cleartomark y counttomark que buscan este elemento para sus acciones. Si no lo encuentran emiten un mensaje de error.�
cleartomark:
Este operador elimina todos los elementos desde el que est� en la cima hasta el primer -marktype-. Este objeto -marktype- se elimina tambi�n. Si no hay ning�n objeto marktype en la pila de operandos, se emite un mensaje de error.�
counttomark:
Este operador cuenta todos lo elementos empezando desde el elemento de la cima hasta encontrar el objeto -marktype-. El resultado que es un valor entero se apila en la pila de operandos como el �ltimo elemento. El primer elemento -marktype- no se incluye en el resultado. Si no hay ning�n elemento marktype en la pila de operandos PostScript informa el error y no hace nada.�

Permitenos decir algo ahora acerca de la pila. Si quieres ver en acci�n a los operadores anteriores, debes activar primero el interprete Postscript. Como se mencion� en el primer art�culo, en el mundo Linux se usa un interprete disponible publicamente, de nombre ghostscript. Ghostscript puede activarse de diferentes maneras mediante el paso de los par�metros apropiados en la linea de comandos. La forma habitual de hacerlo es teclear gs en el entorno X Window. A veces puede que no funcione debido a alg�n problema de configuraci�n en X. Se visualizar� un mensaje de error acerca de la incapacidad de crear un consola gr�fica. Entonces o bien solucionas esos problemas o puedes forzar a ghostscript a usar el dispositivo x11. Para conseguirlo debes teclear gs -sDEVICE=x11. Tanto esto como un simple gs (si esto �ltimo funciona) crea un ventana vac�a con el fondo blanco que se usar� para los mensajes que se crear�n durante la sesi�n. Dado que los mensajes (displays) no se tratan en este art�culo no necesitamos esta ventana y es posible librarse de ella. Para ello, se puede activar el interprete ghostscript sin displays tecleando el par�metro -dNODISPLAY en la linea de comandos despu�s de gs o de gs -sDEVICE=x11. Si se hace esto, se visualizar� una cabecera de copyright seguida del prompt de ghostscript GS> al principio de una nueva linea. En este punto, ghostscript est� preparado para tus comandos. La pila de operandos est� vac�a.

Para ver el contenido de la pila de operandos puedes usar el operador de fichero pstack. Se le llama operador de fichero porque env�a informaci�n acerca del contenido de la pila al fichero de salida estandar que por defecto es la pantalla. Si introduces este comando en el prompt no se visualiza nada y un nuevo prompt GS> aparecer� al principio de una nueva linea. Esto significa que la pila de operandos est� vac�a.�

Para introducir elementos en la pila de operandos puedes teclear los elementos en el prompt. Por ejemplo si quieres introducir 1 como un elemento, solo tienes que teclear 1 en el prompt. Despu�s de esto se crea un nuevo prompt al principio de la linea siguiente. Pero, ahora, el prompt no es GS>. Es G<1>. Esta nueva forma de prompt refleja el n�mero de elementos en la pila de operandos. De modo que, si tu tienes GS<123> en cualquier momento en tu sesi�n ghostscript esto significa que hay 123 elementos en la pila de operandos.�

Puedes introducir m�s de un elemento en la pila de operandos de un solo paso. Para ello, debes teclear todos los elementos consecutivamente, pero separados por un espacio en blanco. Por ejemplo, si tu tecleas 1 2 3 4 5 6 en el prompt, los elementos 1, 2, 3, 4, 5, 6, se apilar�n en la pila de operandos respectivamente. Si ejecutas pstack despu�s de esto, entonces los elementos se visualizar�n en orden vertical de forma que el �ltimo elemento introducido se visualiza primero. La visualizaci�n de esta sesi�n de dos comandos puede quedar como sigue:�

GS>1 2 3 4 5 6�G<6>pstack
6
5
4
3
2
1
G<6>

Tambi�n es posible introducir elementos en la pila de operandos y ver el contenido de la pila en un solo paso. Todo lo que tienes que hacer es a�adir el comando pstack despu�s de los elementos a ser introducidos. Por tanto:�

GS>1 2 3 4 5 6 pstack6
5
4
3
2
1
G<6>

Hasta ahora hemos usado n�meros para introducir elementos. Los n�meros no son el �nico tipo de elementos, es posible introducir otros tipos de elementos como variables o claves, cadenas de texto, bloques, etc. Los trataremos m�s tarde en detalle. De todas maneras hay algo que debemos decir:  si intentas introducir por ejemplo, un solo caracter a o una cadena abc se emitir� un mensaje de error. Esto es debido a que PostScript no puede entender estas cosas. Si quieres introducir un caracter o una cadena tienes que encerrarlo mediante los s�mbolos (). Aqu� hemos hablado tambi�n acerca de un tipo especial de elemento que se llama marktype. Para ver todo esto podemos dar la siguiente sesi�n de ejemplo:�

GS>1 2 3 mark 4 5 6 pstack6
5
4
-marktype-
3
2
1
G<7>

Ahora vamos a ver algunos ejemplos de las operadores que manipulan la pila de operandos. Dar� una sesi�n para mostrar como actuan estos operadores y me gustar�a cerrar esta secci�n sin m�s explicaciones.�

GS>1 2 3 mark 4 5 6 pstack6
5
4
-marktype-
3
2
1
G<7>pop pstack
5
4
-marktype
3�
2
1
G<6>exch pstack
4
5
-marktype
3
2
1
G<6>dup pstack
4
4
5
-marktype-
3
2
1
G<7>2 copy pstack
4
4
4
4
5
-marktype
3
2
1
G<9>5 index pstack
-marktype-
4
4
4
4
5
-marktype
3
2
1
G<10>cleartomark cleartomark pstack
3
2
1
G<3>3 1 roll pstack
2
1
3
G<3>count pstack
3
2
1
3
G<4>mark 7 8 pstack
8
7
-marktype-
3
2
1
3
G<7>counttomark pstack
2
8
7
-marktype-
3
2
1
3
G<8>clear pstack
GS>

 

Operadores matem�ticos

Aparte de los operadores de manipulaci�n de la pila de operandos de PostScript hay algunos operadores aritm�ticos y matem�ticos. M�s abajo se dan estos operadores. No habr� ejemplos. Esto se deja en manos del lector que deber�a ser capaz de crearlos, despu�s de haber estudiado las sesiones de ejemplo de arriba.

add:
Este comando necesita dos par�metros num�ricos cuyos valores se suman. Si llamamos m y n a estos valores, entonces el comando ser�a m n add. Al ejecutarlo se introducen primero m y despu�s n en la pila de operandos. La fase final es al ejecuci�n del operador add sobre los dos operandos de la cima de la pila. Esto crea un nuevo elemento cuyo valor es la suma de m y n. Una vez finalizada la operaci�n m y n desaparecen de la pila. En su lugar, el resultado llega a ser el elemento de la cima de la pila de operandos.
div:
Este comando necesita dos par�metros num�ricos que ser�n los que se usar�n en la operaci�n de divisi�n. Sean estos par�metros, m y n, la instrucci�n ser�a m n div. La mec�nica de la operaci�n es la misma que la de la operaci�n add. La operaci�n de divisi�n trabaja a nivel de aritm�tica de punto flotante. Despu�s de que finaliza la operaci�n solo queda en la pila de operandos el resultado de la operaci�n de divisi�n como un nuevo elemento. m y n desaparecen.
idiv:
Este comando necesita dos par�metros num�ricos que se usar�n en la operaci�n de divisi�n entera. Sean estos par�metros, m y n, la instrucci�n ser�a m n idiv. Todo funciona como en el caso de div excepto por la divisi�n misma. En este caso se trata de una divisi�n que funciona en el nivel de la aritm�tica entera. Tambi�n funcionar� aunque los par�metros no sean enteros.
mod:
Este comando necesita dos par�metros enteros. Obtiene el resto de dividir el primer par�metro entre el segundo. Si cualquiera de los par�metros no es entero la operaci�n falla. Al final lo �nico que queda en la pila de operandos es el resultado de la operaci�n, no los par�metros.
mul:
Igual que add, div. Es un operador binario que necesita dos valores num�ricos. El resultado es la multiplicaci�n de los par�metros y se mantiene en la pila de operandos como un nuevo elemento.
sub:
Igual que add, div, mul. La �nica diferencia es el tipo de operaci�n. En operador resta el valor del segundo par�metro del valor del primero. Tanto los par�metros como el resultado son valores num�ricos y el resultado queda en la pila de operandos despu�s de que la operaci�n ha finalizado.
exp:
Este es un operador matem�tico binario. Necesita dos par�metros. El primero es la base y el segundo el exponente. Eleva el valor de la base a la potencia cuyo valor es el exponente. Los par�metros deben estar dentro de los l�mites de la operaci�n de exponenciaci�n. El resultado es un n�mero en punto flotante que queda como un nuevo elemento de la pila de operandos.
atan:
Este es otro operador matem�tico binario, en este caso para eval�a un �ngulo. El �ngulo se da en grados entre 0 y 360. Se necesitan dos par�metros. La raz�n del primer par�metro al segundo es igual a la tangente del �ngulo a ser eval�ado. Cualquiera de los par�metros puede ser 0 pero no ambos. Los signos de los par�metros determinan el cuadrante donde el resultado yace. Los valores positivos en el primer par�metro corresponden a planos y positivos. Por otro lado, los valores positivos en el segundo par�metro indican planos x positivos.
abs:
Este es un operador matem�tico unario. Necesita un solo par�metro cuyo valor absoluto es el resultado de la operaci�n. De forma similar a lo visto arriba, el resultado permanece en la pila como un nuevo elemento.
neg:
Cambia el signo de su �nico par�metro. Es un operador aritm�tico unario.
ceiling:
Es un operador unario cuyo valor es el entero m�s cercano por arriba al par�metro que recibe.
floor:
Es un operador unario cuyo valor es el entero m�s cercano por abajo al par�metro que recibe.
round:
Es un operador unario cuyo valor es el entero m�s cercano al par�metro que recibe.
truncate:
Es un operador unario que elimina la parte decimal de su par�metro.
sqrt:
Es un operador unario cuyo valor es la ra�z cuadrada (square root) de su par�metro.
cos:
Es un operador unario cuyo valor es el coseno de su par�metro. El par�metro debe estar en grados.
sin:
Es un operador unario cuyo valor es el seno de su par�metro. El par�metro debe estar en grados.
ln:
Es un operador unario cuyo valor es el logaritmo natural de su par�metro.
log:
Es un operador unario cuyo valor es el logaritmo en base 10 de su par�metro.

Antes de terminar este art�culo una nota m�s. Si bien se ha mencionado arriba, quiz�s de forma impl�cita, los par�metros (operandos en la terminolog�a PostScript) de un comando pueden crear algunos problemas desagradables. El comando (u operador en la terminolog�a PostScript) busca sus par�metros en la pila de operandos. Cuando se encuentran el comando los usa y son borrados de la pila de operandos. De manera que ejecutar, a prop�sito o por error, un comando que necesita par�metro(s) sobre una pila de operandos sin valores para ellos, puede provocar bien una notificaci�n sobre los par�metros que est�n el cima de la pila si estos no son v�lidos para el tipo de par�metro requerido, o que alguno(s) de los elementos de la pila de operandos sean eliminados. Por tanto el usuario debe tener mucho cuidado con esto.

Antes de finalizar esta presentaci�n recomendamos escribir programas m�s complicados y completos a los usuarios que quieran avanzar con el lenguaje PostScript. Todas las preguntas y comentarios son bienvenidos.


Contactar con el equipo de LinuFocus
© Emre Demiralp
LinuxFocus 1999
Translation information:
en -> -- Emre Demiralp
en -> es David Abilleira Freijeiro
en -> en Jorge M. Paulo y Jose Quesada

1999-07-02, generated by lfparser version 0.6