Sobre Yabasic
Yabasic es un intérprete tradicional de BASIC. Esto significa que contempla muchas de las construcciones básicas de este lenguaje, como goto, gosub, números de línea, read, data o variables de cadena con el sufijo '$'. Pero, por otro lado, Yabasic implementa algunas características de programación más avanzadas, como librerías o subrutinas (pero no objetos). Yabasic trabaja de forma muy parecida en Unix y en Windows.
Yabasic pone énfasis  en obtener resultados de forma fácil y rápida; por tanto se proveen comandos para abrir una ventana, imprimir gráficos o controlar la pantalla de consola y capturar información del teclado o el ratón. El ejemplo siguiente abre una ventana, dibuja un círculo e imprime el gráfico:
open window 100,100
open printer
circle 50,50,40
text 10,50,"Pulse una tecla para obtener una impresión"
clear screen
inkey$
close printer
close window

Este ejemplo tiene menos líneas de las que pueden encontrarse en otros lenguajes de programación. Es cierto que Yabasic carece de las características de otros lenguajes más modernos y avanzados como C++ o Java. Pero lo que se pretende es obtener resultados de forma rápida y fácil.

Yabasic bajo Windows
Iniciando Yabasic
Una vez se haya instalado correctamente, existen tres formas de iniciarlo:
1.	Pulsando el botón derecho sobre el escritorio: Aparece el menú contextual con un submenú llamado Nuevo. Desde este submenú seleccione yabasic. Esto crea un nuevo icono en su escritorio. Si pulsa el botón derecho sobre este icono, aparecerá su menú contextual; elija Execute para ejecutar el programa.
2.	Una variante de la vía descrita anteriormente es simplemente crear un fichero con la extensión .yab (usando su editor favorito). A partir de ahí se trabaja como se describió anteriormente.
3.	 Desde el menú de inicio: Seleccione yabasic en el menú de inicio. Se abrirá una ventana de consola para que pueda escribir su programa. Una vez hecho, podrá pulsar dos veces return, y Yabasic interpretará y ejecutará su programa.
Nota
Esta NO es la mejor manera de iniciar Yabasic, puesto que el programa que haya escrito no podrá guardarse y se perderá inevitablemente. No está pensado implementar un comando save ni otra vía para conservar el programa escrito. Este modo es sólo para programas cortos (como, por ejemplo, cuando queremos usarlo como calculadora científica).
Opciones
Bajo Windows, lo normal es invocar Yabasic haciendo doble click sobre el icono apropiado; por esta vía usted no puede especificar ninguna opción de línea de comando de las descritas a continuación. Sin embargo, un usuario avanzado puede añadir algunas de estas opciones en las entradas apropiadas del registro.
Todas las opciones siguientes pueden abreviarse, dado que la abreviación no comporta ambigüedad. Por ejemplo, puede escribir -e en vez de -execute.
-help o -? 
Imprime un breve mensaje de ayuda, el cual muestra a su vez dos opciones de ayuda adicionales.
-version 
Muestra la versión de Yabasic.
-geometry +POS_X+POS_Y 
Establece la posición de la ventana gráfica que es abierta con open window (el tamaño de esta ventana, claro está, se especifica dentro del comando open window). Un ejemplo puede ser -geometry +20+10, el cual sitúa la ventana gráfica 10 pixels abajo y 20 pixels a la derecha del borde de la pantalla. Este valor no puede cambiarse una vez se inicia la ejecución de Yabasic.
-font NOMBRE-DE-LA-FUENTE 
Nombre de la fuente que va a utilizarse en los textos en modo gráfico; puede ser decorative, dontcare, modern, roman, script o swiss. Puede añadirse el tamaño de la fuente (medido en pixels); por ejemplo -font swiss30 selecciona la fuente de tipo swiss con un tamaño de 30 pixels.
-bind NOMBRE-DEL-PROGRAMA-INDEPENDIENTE 
Crea un programa independiente (cuyo nombre es especificado por NOMBRE-DEL-PROGRAMA-INDEPENDIENTE) a partir de un programa Yabasic dado en la línea de comando. Vea la sección crear un programa independiente para más detalles.
-execute UN-PROGRAMA-COMO-UNA-CADENA-SIMPLE 
Con esta opción se indica un código en Yabasic para ser ejecutado. Esto es útil en programas cortos que no se desea conservar (si se especifica esta opción, Yabasic no leerá ningún fichero de código fuente). Esto quiere decir que si, por ejemplo, olvida cuales son los cuadrados de los números entre 1 y 10, usted podría ejecutar el comando yabasic -e 'for a=1 to 10:print a*a:next a' para obtener la respuesta inmediatamente.
-infolevel NIVEL-DE-INFORMACION 
Cambia el nivel de información de Yabasic, donde NIVEL-DE-INFORMACION puede ser debug, note, warning, error o fatal (por defecto es warning). Esta opción cambia la cantidad de información de depuración producido por Yabasic. Por lo general, sólo el autor de Yabasic (Marc Oliver) deseará cambiar esta opción.
-doc NOMBRE-DEL-PROGRAMA 
Muestra la documentación embebida del programa indicado. La documentación embebida de un programa consiste en todos los comentarios existentes en su código que empiecen con la palabra clave especial doc. Esta documentación puede ser visualizada también eligiendo la correspondiente entrada del menú contextual de cualquier programa Yabasic.
-librarypath DIRECTORIO-CON-LIBRERIAS 
Cambia el directorio donde se habrán de buscar las librerías a importar (con el comando import). Por defecto las librerías invocadas se buscarán en el directorio actual o, en el caso de un sistema Windows, en C:\yabasic\lib.

Además, en Unix existen estas otras opciones:
-fg COLOR-DE-PRIMER-PLANO o -foreground COLOR-DE-PRIMER-PLANO 
Define el color de primer plano para la ventana gráfica (la que se abre con open window). Se aceptan los nombres de color usuales de X11, como red, green, … Este valor no puede cambiarse tras el inicio de Yabasic.
-bg COLOR-DE-FONDO o -background COLOR-DE-FONDO 
Define el color de fondo para la ventana gráfica (la que se abre con open window). Se aceptan los nombres de color usuales de X11, como red, green, … Este valor no puede cambiarse tras el inicio de Yabasic.
-display COLOR-DE-FONDO 
Especifica el display donde la ventana gráfica de Yabasic va a aparecer. Normalmente este valor se encontrará en la variable de entorno DISPLAY.

El menú contextual
Al igual que otros iconos en Windows, el de todo programa Yabasic tiene un menú contextual que ofrece las operaciones más frecuentes a aplicar sobre él.
Execute 
Invoca Yabasic para ejecutar el programa. Se consigue lo mismo que haciendo doble click sobre el icono.
Edit 
Invoca Notepad para editar el programa.
View docu 
Muestra la documentación embebida en el programa con el comentario especial doc.

Todos los comandos y funciones de Yabasic agrupados por orden alfabético
Nombre
abs() — devuelve el valor absoluto de su argumento numérico
Sinopsis
y=abs(x)
Descripción
Si el argumento de la función abs es positivo (por ejemplo, 2) lo devuelve sin cambios; si es negativo (por ejemplo, -1) lo devuelve como un valor positivo (en este caso, 1).
Ejemplo
print abs(-2),abs(2)
          
Este ejemplo imprime 2 2
Ver también
sig

Nombre
acos() — devuelve el arco coseno de su argumento numérico
Sinopsis
x=acos(angle)
Descripción
acos es la función arco coseno, es decir, el inverso de la función coseno cos. Esta función devuelve el ángulo en radianes.
Ejemplo
print acos(0.5),acos(cos(pi))
          
Este ejemplo muestra 1.0472 3.14159 que es π/3 y π, respectivamente.
Ver también
cos, asin

Nombre
and — ‘y’ lógico, usado en condiciones
Sinopsis
if (a and b) …
while (a and b) …
Descripción
Usado en condiciones (por ejemplo, dentro de if, while o until) para unir dos expresiones. Devuelve true si, y sólo si, sus argumentos derecho e izquierdo son ambos true; en otro caso, devuelve false.
Téngase en cuenta lo descrito en cortocircuitos lógicos.
Ejemplo
input "Por favor, introduzca un numero" a
if (a>=1 and a<=9) print "Su numero esta comprendido entre 1 y 9"
          
Ver también
or,not

Nombre
and() — la operación de bit and
Sinopsis
x=and(a,b)
Descripción
Usado para computar la operación a nivel de bit and entre ambos argumentos. Los argumentos son tratados como números binarios (es decir, como una serie de ceros y unos), de tal forma que un bit determinado dará como resultado 1 si el mismo bit en ambos argumentos es también 1.
Fíjese que ambos argumentos son convertidos a valores enteros, y que los números negativos tienen su propia representación binaria y pueden producir resultados inesperados.
Ejemplo
print and(6,3)
          
Se muestra 2. La representación binaria de 6 es 110, y la de 3 es 011; el resultado en binario será 010 (sólo el bit central coincide en ambos), o sea, 2 en decimal.
Ver también
or, eor y not

Nombre
arraydim() — devuelve el número de dimensiones de una matriz. Usado sobre todo cuando se pasa una referencia a matriz
Sinopsis
a=arraydim(b())
Descripción
Si se aplica la función arraydim() a una matriz unidimensional (por ejemplo, un vector) devuelve 1; si se aplica a una matriz bidimensional devuelve 2; etc.
Esta función es muy usada dentro de subrutinas que esperan una matriz entre sus parámetros, para comprobar que posee las dimensiones adecuadas. Por ejemplo, en una subrutina para multiplicar dos matrices bidimensionales, esta puede comprobar que ambas matrices cumplen la condición de tener dos dimensiones.
Ejemplo
dim a(10,10),b(10)
print arraydim(a()),arraydim(b())
          
Se muestra 2 1, que son el número de dimensiones de las matrices a() y b(). Repase la función arraysize para ver un ejemplo más completo.
Ver también
arraysize y dim.

Nombre
arraysize() — devuelve el tamaño de una dimensión determinada de una matriz
Sinopsis
x=arraysize(a(),b)
Descripción
La función arraysize calcula el tamaño de una dimensión determinada de la matriz especificada. Por tamaño se entiende el número máximo que puede alcanzar un índice en esa dimensión de la matriz. El primer argumento para esta función debe ser una referencia a una matriz; el segundo debe indicar cual de las múltiples dimensiones de la matriz es a la que se quiere calcular su tamaño.
Un ejemplo que implica el uso de subrutinas: supongamos que hemos declarado una matriz bidimensional dim a(10,20). Si se pasa como una referencia a matriz a una subrutina, esta no puede saber que tipo de matriz es. Con la función arraydim puede averiguarse cuantas dimensiones tiene, y con arraysize cual es el tamaño de cada dimensión, que en este caso serían respectivamente 10 y 20. Es decir, con arraysize(a(),1) obtenemos el tamaño de la primera dimensión (10), y con arraysize(a(),2) obtenemos el de la segunda (20). En el siguiente ejemplo puede contemplarse un caso típico de uso de esta función.  
Ejemplo

rem
rem  Este programa suma dos matrices elemento a elemento.
rem

dim a(10,20),b(10,20),c(10,20)

rem  Inicialización de las matrices a() y b() 
for y=1 to 10:for x=1 to 20
   a(y,x)=int(ran(4)):b(y,x)=int(ran(4))
next x:next y

matadd(a(),b(),c())

print "Resultado:"
for x=1 to 20
   for y=10 to 1 step -1
      print c(y,x)," ";
   next y
   print
next x

sub matadd(m1(),m2(),r())

   rem  Esta subrutina suma las matrices m1() y m2()
   rem  elemento a elemento y almacena el resultado en r().
   rem  Esto no es muy útil pero sí fácil de implementar.
   rem  Sin embargo, se destaca el control de sus argumentos
   rem  mediante arraydim() y arraysize()

   local x:local y
   
   if (arraydim(m1())<>2 or arraydim(m2())<>2 or arraydim(r())<>2) then
      error "Se necesitan matrices de dos dimensiones como entrada"
   endif

   y=arraysize(m1(),1):x=arraysize(m1(),2)
   if (arraysize(m2(),1)<>y or arraysize(m2(),2)<>x) then
      error "Estas matrices no pueden sumarse elemento a elemento"
   endif

   if (arraysize(r(),1)<>y or arraysize(r(),2)<>x) then
      error "El resultado no puede almacenarse en el tercer argumento"
   endif

   local xx:local yy
   for xx=1 to x
      for yy=1 to y
         r(yy,xx)=m1(yy,xx)+m2(yy,xx)
      next yy
   next xx

 end sub

Ver también
arraydim y dim.

Nombre
asc() — acepta una cadena de caracteres y devuelve la posición del primer caracter dentro del juego de caracteres ASCII
Sinopsis
a=asc(char$)
Descripción
La función asc acepta una cadena de caracteres, toma su primer caracter y lo busca dentro del juego de caracteres ASCII, devolviendo su posición. La función asc es la contraria de la función chr$. Esta función tiene muchos usos útiles, pero la de comparar alfabéticamente cadenas de caracteres no es uno de ellos; puede hacerlo mucho más fácilmente usando directamente los símbolos de comparación (=, <, >, <=, etc.).
Ejemplo
input "Por favor, introduzca una letra entre 'a' y 'y': " a$
if (a$<"a" or a$>"y") print a$," no se encuentra en el rango adecuado":end
print "La letra posterior a ",a$," es ",chr$(asc(a$)+1)
          
Ver también
chr$

Nombre
asin() — devuelve el arcoseno del argumento numérico 
Sinopsis
angle=asin(x)
Descripción
asin es la función arcoseno, o sea, el inverso de la función seno. El valor devuelto es el ángulo en radianes.
Ejemplo
print asin(0.5),asin(sin(pi))
          
Se mostrará 0.523599 -2.06823e-13.
Ver también
sin, acos

Nombre
at() — se usa con el comando print para emplazar la salida en una posición especificada
Sinopsis
clear screen
…
print at(a,b)
print @(a,b)
Descripción
La cláusula at toma dos argumentos numéricos (por ejemplo, at(2,3)) y ha de ir después de la palapra clave print. at() puede usarse sólo si se ha ejecutado previamente clear screen al menos una vez dentro del programa (en caso contrario se obtiene un error).
Los dos argumentos numéricos de la función at deben encontrarse en el rango de 0 al ancho del terminal menos uno, y de 0 al alto del terminal menos 1; si algún argumento excede estos valores, se truncará. Yabasic no puede influir en el tamaño de nuestro terminal (normalmente 80x25, pero no necesariamente), por lo que los valores aceptables por la cláusula at pueden variar. Para obtener el tamaño de nuestro terminal podemos usar la función peek: peek("screenwidth") devuelve el ancho del terminal, y peek("screenheight") la altura.
Ejemplo
clear screen
maxx=peek("screenwidth")-1:maxy=peek("screenheight")-1
for x=0 to maxx
  print at(x,maxy*(0.5+sin(2*pi*x/maxx)/2)) "*"
next x
          
Ver también
print, clear screen, color

Nombre
atan() — devuelve el arcotangente del argumento numérico
Sinopsis
angle=atan(a,b)
angle=atan(a)
Descripción
atan es la función arcotangente, es decir, el inverso de la función tan. El valor devuelto es el ángulo en radianes.
La función atan tiene una segunda forma que acepta dos argumentos: atan(a,b) que es, en general, equivalente a atan(a/b) excepto por el hecho de que la forma con dos argumentos devuelve un ángulo en el rango de -π a π, mientras que la forma con un solo argumento devuelve un ángulo en el rango de -π/2 a π/2. Para entender esto hay que tener una buena base matemática.
Ejemplo
print atan(1),atan(tan(pi)),atan(-0,-1),atan(-0,1)
          
Se muestra 0.463648 2.06823e-13 -3.14159 3.14159 que es π/4, casi 0, -π y π respectivamente.
Ver también
tan, sin

Nombre
backcolor — cambia el color de fondo de la ventana gráfica 
Sinopsis
backcolor red,green,blue
backcolor "red,green,blue"
Descripción
Cambia el color, que se hace visible si se borra alguna parte de la ventana, por ejemplo despues de clear window o clear line. Fíjese sin embargo que las partes de la ventana que muestran el anterior color de fondo no cambian.
Como en el comando color, el nuevo color de fondo se especifica con tres números o con una cadena de caracteres que contiene los tres números separados por comas. 
Ejemplo
open window 255,255
for x=10 to 235 step 10:for y=10 to 235 step 10
  	backcolor x,y,0
	clear window
	sleep .01
next y:next x
          
Esto cambia el color de fondo de la ventana gráfica de forma repetida, limpiando la ventana cada vez para mostrar el nuevo color de fondo.
Ver también
open window, color, line, rectangle, triangle, circle

Nombre
backcolour — ver backcolor
Sinopsis
backcolour red,green,blue
backcolour "red,green,blue"
Ver también
color

Nombre
beep — emite una señal acústica; es un sinónimo de bell
Sinopsis
beep
Descripción
El comando beep hace sonar un pitido dentro del ordenador. Este comando no usa el interface de sonido, por lo que no puede variarse la duración o el tono del mismo (técnicamente es lo mismo que imprimir \a). bell es exactamente lo mismo que beep.
Ejemplo
beep:print "Hay un problema ..."
          
Ver también
bell

Nombre
bell — ver beep

Nombre
bin$() — convierte un número a una secuencia de dígitos binarios
Sinopsis
hexadecimal$=bin$(decimal)
Descripción
La función bin$ toma un único argumento numérico y lo convierte en una cadena de dígitos binarios (o sea, de ceros y unos). Si se le pasa un número negativo, la cadena resultante va precedida por el signo '-'.
Si lo que se desea es pasar una cadena binaria a un número decimal, se usará la función dec.
Ejemplo
for a=1 to 100
  print bin$(a)
next a
          
Este ejemplo muestra la representación binaria de todos los números entre 1 y 100.
Ver también
hex$, dec

Nombre
bind() — Une un programa Yabasic con el intérprete para generar un programa que se ejecuta de forma autónoma.
Sinopsis
bind("foo.exe")
Descripción
El comando bind combina el código fuente (junto con todas las librerias importadas con import) y el intérprete para copiarlo en un nuevo fichero cuyo nombre será el pasado en el argumento. Este nuevo fichero puede ser ejecutado en cualquier ordenador sin necesidad de que tenga instalado Yabasic.
Vea la sección sobre creación de un programa independiente para más detalles.
Ejemplo
if (!peek("isbound")) then
  bind "foo"
  print "Creado correctamente el ejecutable independiente 'foo' !"
  exit
endif

print "Hola mundo!"
          
Este ejemplo crea el programa independiente foo por si mismo.
Ver también
La sección sobre creación de un programa independiente, la función peek y las opciones de comando para Unix y Windows.

Nombre
box — dibuja un rectángulo. Es un sinónimo de rectangle
Sinopsis
Ver el comando rectangle.

Nombre
break — sale de un bucle o una declaración switch 
Sinopsis
break
Descripción
break transfiere inmediatamente el control fuera de un bucle o una declaración switch. Esta es la forma preferible de abandonar un bucle, en vez de goto, aunque este último puede ser útil en algunos casos (como, por ejemplo, para salir excepcionalmente de un sistema profundo de bucles anidados).
Ejemplo
for a=1 to 10
  break
  print "Hola"
next a

while(1)
  break
  print "Hola"
wend

repeat
  break
  print "Hola"
until(0)

switch 1
case 1:break
case 2:case 3:print "Hola"
end switch
          
Este ejemplo no muestra nada, ya que cada bucle (y también la declaración switch) tiene un break inmediatamente antes de mostrar "Hola".
Ver también
for, while, repeat y switch.

Nombre
case — marca los diferentes casos dentro de una declaración switch
Sinopsis
switch a
  case 1
  case 2
  …
end switch

…

switch a$
  case "a"
  case "b"
  …
end switch
Descripción
Ver la declaración switch.
Ejemplo
input a
switch(a)
  case 1:print "uno":break
  case 2:print "dos":break
  default:print "mas"
end switch
          
Dependiendo de la entrada numérica este código muestra uno, dos o, en otro caso,  más.
Ver también
switch

Nombre
chr$() — acepta un número y devuelve el caracter correspondiente a la posición indicada en el juego de caracteres ASCII
Sinopsis
character$=chr$(ascii)
Descripción
La función chr$ es la opuesta a asc. Devuelve el caracter correspondiente a la posición indicada dentro de juego de caracteres ASCII. Su uso típico es para construir caracteres no imprimibles que no aparecen en el teclado.
Sin embargo no suele usarse demasiado, ya que los caracteres no imprimibles más importantes pueden construirse usando secuencias de escape con el caracter \ (por ejemplo, puede usarse \n en vez de chr$(10) cuando deseemos usar el caracter de nueva línea).
Ejemplo
print "a",chr$(10),"b"
          
Se muestran las letras 'a' y 'b' en diferentes líneas debido a la intervención del caracter de nueva línea, que es obtenido con chr$(10).
Ver también
asc

Nombre
circle — dibuja un círculo en la ventana gráfica
Sinopsis
circle x,y,r
clear circle x,y,r
fill circle x,y,r
clear fill circle x,y,r
Descripción
El comando circle acepta tres parámetros: las coordenadas x e y del centro, y el radio del círculo.
Algunas observaciones más relacionadas con el comando circle:
·	La ventana gráfica tiene que estar abierta previamente.
·	El círculo puede extenderse más allá de los límites de la ventana.
·	Si se ha declarado antes open printer, el círculo dibujado en la ventana será también impreso.
·	fill circle dibujará un cículo relleno (con tinta negra).
·	clear circle borra el contorno del círculo.
·	clear fill circle o fill clear circle borra el área del circulo.
Ejemplo
open window 200,200

for n=1 to 2000
  x=ran(200)
  y=ran(200)
  fill circle x,y,10
  clear fill circle x,y,8
next n
          
Este código abre una ventana y dibuja 2000 círculos superpuestos. Cáda círculo es dibujado en dos pasos: primero se rellena con tinta negra (fill circle x,y,10); después se borra la mayor parte del círculo (clear fill circle x,y,8). Como resultado, cada círculo es dibujado con un interior opaco blanco y un borde de 2 pixels (debido a que el radio difiere en 2 pixels).
Ver también
open window, open printer, line, rectangle, triangle

Nombre
clear — borra circles, rectangles y triangles
Sinopsis
clear rectangle 10,10,90,90
clear fill circle 50,50,20
clear triangle 10,10,20,20,50,30
Descripción
Se usa dentro de comandos circle, rectangle y triangle para borrar dichas figuras (dibujándolas con el color del fondo).
clear puese ser usado en conjunción con y donde quiera que la cláusula fill pueda aparecer. Usado solo, clear borra el borde (no el interior) de la figura (círculo, rectángulo o triángulo); junto con fill se borrará toda la figura (incluido el interior).
Ejemplo
open window 200,200
fill circle 100,100,50
clear fill rectangle 10,10,90,90
          
Esto abre una ventana y dibuja una figura parecida a un pacman.
Ver también
clear, circle, rectangle, triangle

Nombre
clear screen — limpia la ventana de texto
Sinopsis
clear screen
Descripción
clear screen borra la ventana de texto (la ventana donde se muestran las salidas de print).
Este comando debe ser ejecutado al menos una vez antes de usar algunos comandos de ventana avanzados (como, por ejemplo, print at o inkey$); esto es debido a algunas limitaciones de la librería curses, que es usada por Yabasic bajo Unix para algunos comandos.
Ejemplo
clear screen
print "Por favor, pulse una tecla : ";
a$=inkey$
print a$
          
El comando clear screen es esencial en este caso; si se omite, Yabasic devuelve un mensaje de error ("need to call 'clear screen' first") cuando intenta ejecutar la función inkey$.
Ver también
inkey$

Nombre
clear window — limpia la ventana gráfica y, si se está imprimiendo, comienza una nueva página
Sinopsis
clear window
Descripción
clear window borra el contenido de la ventana gráfica. Si se ha iniciado el modo de impresión gráfica via open printer, el comando clear window inicia una nueva página.
Ejemplo
open window 200,200
open printer "t.ps"

for a=1 to 10
if (a>1) clear window
text 100,100,"Hola "+str$(a)
next a

close printer
close window
          
Este ejemplo imprime 10 páginas con el texto “Hola 1”, “Hola 2”, etc. El comando clear screen borra la ventana gráfica e inicia una nueva página.
Ver también
open window, open printer

Nombre
close — cierra un fichero que a sido abierto previamente
Sinopsis
close filenum
close # filenum
Descripción
El comando close cierra un fichero abierto. Ha de invocarse inmediatamente después de haber terminado de leer o escribir en un fichero.
Ejemplo
open "my.data" for reading as 1
input #1 a
print a
close 1
          
Este programa abre el fichero "my.data", lee un número desde él, imprime dicho número y cierra el fichero.
Ver también
open

Nombre
close curve — cierra una curva que ha sido dibujada con el comando line
Sinopsis
new curve
line to x1,y1
…
close curve
Descripción
El comando close curve cierra una secuencia de líneas dibujadas repitiendo comandos line to.
Ejemplo
open window 200,200
new curve
line to 100,50
line to 150,150
line to 50,150
close curve
          
Este ejemplo dibuja un triángulo: tres comandos line to dibujan dos de las líneas, y la línea final no se dibuja explícitamente, sino mediante el comando close curve.
Ver también
line, new curve

Nombre
close printer — detiene la impresión de gráficos
Sinopsis
close printer
Descripción
El comando close printer finaliza la impresión del contenido de la ventana gráfica. Entre open printer y close printer cada cosa que se dibuje (círculos, líneas, …) es enviado a la impresora. close printer pone fin a la impresión y hace que la impresora expulse la página.
Ejemplo
open window 200,200
open printer
circle 100,100,50
close printer
close window
          
Tan pronto se ejecuta close printer, la impresora expulsa una hoja con un círculo en ella.
Ver también
open printer

Nombre
close window — cierra la ventana gráfica
Sinopsis
close window
Descripción
El comando close window cierra la ventana gráfica (es decir, hace que esta desaparezca de la pantalla). Esto incluye implícitamente un close printer, si se ha abierto previamente una impresora con open printer.
Ejemplo
open window 200,200
circle 100,100,50
close window
          
Este ejemplo abre una ventana gráfica, dibuja un círculo y cierra la ventana; todo ello sin una pausa o retardo, con lo que la ventana se cerrará antes de que pueda ver el círculo.
Ver también
open window

Nombre
color — cambia el color para cualquier subsiguiente comando de dibujo
Sinopsis
colour red,green,blue
colour "red,green,blue"
Descripción
Cambia el color en el que se van a dibujar líneas, puntos, círculos, rectángulos o triángulos. El comando color acepta tres números en el rango entre 0 y 255. Estos números especifican la intensidad de los colores primarios rojo, verde y azul, respectivamente. Por ejemplo, 255,0,0 sería rojo; y 255,255,0, amarillo.
De modo alternativo, puede especificar el color como una cadena de caracteres; esta cadena contendrá tres números separados por comas. Por ejemplo, "255,0,255" sería el color violeta. Utilizando esta variante del comando color, pueden usarse nombres simbólicos para los colores: 
open window 100,100
amarillo$="255,255,0"
color amarillo$
text 50,50,"Hola"
, lo que hace que se entienda mejor. 
Ejemplo
open window 255,255
for x=10 to 235 step 10:for y=10 to 235 step 10
  	color x,y,0
  	fill rectangle x,y,x+10,y+10
next y:next x
          
Este ejemplo llena la ventana gráfica con rectángulos coloreados. Sin embargo, ninguno de estos colores usa componente azul, debido a que el comando color tiene siempre 0 como tercer argumento.
Ver también
open window, backcolor, line, rectangle, triangle, circle

Nombre
colour — ver color
Sinopsis
colour red,green,blue
colour "red,green,blue"
Ver también
color

Nombre
compile — compila una cadena de caracteres con código Yabasic al vuelo
Sinopsis
compile(code$)
Descripción
Este es un comando avanzado (“emparentado” con el comando execute). Permite compilar una cadena de caracteres con código Yabasic que se le pasa como único argumento. Tras eso, el código compilado forma parte integral de nuestro programa.
Tenga en cuenta que no hay forma de eliminar el código compilado.
Ejemplo
compile("sub mysub(a):print a:end sub")
mysub(2)
          
Este ejemplo crea una función llamada mysub, que simplemente imprime su único argumento numérico.
Ver también
execute

Nombre
continue — inicia la siguiente iteración de un bucle for, do, repeat o while
Sinopsis
continue
Descripción
Se usa continue dentro de cualquier bucle para iniciar la siguiente iteración inmediatamente. Dependiendo del tipo de bucle, la condición del bucle puede ser chequeada o no. En concreto, los bucles for y while evaluarán sus respectivas condiciones, y los do y repeat no.
Nota: otra forma de cambiar el flujo de ejecución dentro de un bucle es con el comando break.
Ejemplo
for a=1 to 100
  if mod(a,2)=0 continue
  print a
next a
          
Este ejempo muestra todos los números impares entre 1 y 100.
Ver también
for, do, repeat, while, break

Nombre
cos() — devuelve el coseno de su único argumento 
Sinopsis
x=cos(angle)
Descripción
La función cos espera un ángulo (en radianes) y devuelve su coseno.
Ejemplo
print cos(pi)
          
Este ejemplo muestra -1.
Ver también
acos, sin

Nombre
data — establece una lista de datos
Sinopsis
data 9,"mundo"
…
read b,a$
Descripción
La palabra clave data establece una lista de datos separados por comas, constituidos por números y cadenas de caracteres, que pueden ser recuperados con el comando read.
El comando data por sí mismo no hace nada; sólo almacena datos. Un único comando data puede preceder a una lista de valores de longitud arbitraria, donde números y cadenas de caracteres pueden estar mezclados.
Yabasic internamente usa un data-pointer (puntero a comandos data) para guardar la localización dentro de la lista de comandos data; este puntero puede ser reiniciado con el comando restore.
Ejemplo
do
  restore
  for a=1 to 4
    read num$,num
    print num$,"=",num
  next a
loop
data "once",11,"doce",12,"trece",13,"catorce",14
          
Este ejemplo muestra una serie de líneas de la forma once=11, sin solución de continuidad.
El comando restore asegura que la lista de items de un data se lea desde el principio en cada iteración.
Ver también
read, restore

Nombre
date$ — devuelve una cadena de caracteres con varios componentes de la fecha actual
Sinopsis
a$=date$
Descripción
La función date$ (que debe ser invocada sin paréntesis, o producirá un error) devuelve una cadena de caracteres conteniendo varios compoenentes de la fecha; un ejemplo sería 4-05-27-2004-Thu-May. Esta cadena consiste en varios campos separados por guiones:
·	El día dentro de la semana como un número en el rango entre 0 (= Domingo) y 6 (= Sábado) (en el ejemplo anterior: 4, o sea, jueves).
·	El mes como un número en el rango entre 1 (= Enero) y 12 (= Diciembre) (en el ejemplo: 5 que corresponde a Mayo).
·	El día dentro del mes como un número en el rango entre 1 y 31 (en el ejemplo: 27).
·	El año en formato completo de 4 dígitos (en el ejemplo: 2004).
·	El nombre abreviado del día de la semana (Mon a Sun).
·	El nombre abreviado del mes (Jan a Dec).
Así, el ejemplo anterior (4-05-27-2004-Thu-May) se leería: día 4 de la semana (contando desde 0), Mayo día 27 del 2004, que es un Jueves de Mayo.
Fíjese que todos los campos dentro de la cadena devuelta por date$ tienen un tamaño fijo (cuando sea necesario se completarán los números con ceros); de esta manera es fácil el extraer el contenido de los campos deseados con la función mid$.
Ejemplo
rem   Dos maneras de mostrar lo mismo ...

print mid$(date$,3,10)

dim fields$(6)
a=split(date$,fields$(),"-")
print fields$(2),"-",fields$(3),"-",fields$(4)
          
Este ejemplo muestra dos técnicas diferentes para extraer componentes del resultado devuelto por date$. La función mid$ constituye la via preferible, pero puede usarse también split (véase esta función).
Ver también
time$

Nombre
dec() — convierte un número en base 2 o base 16 en un número en formato decimal
Sinopsis
a=dec(number$)
a=dec(number$,base)
Descripción
La función dec toma la representación en cadena de caracteres de un número en base 2 o base 16 (que es el que se toma por defecto) y lo convierte en un número decimal. El segundo argumento opcional (base) se usa para especificar una base distinta a la 16. Sin embargo, actualmente sólo se soportan las bases 2 y 16.
Ejemplo
input "Por favor, introduzca un numero binario o hexadecimal: " a$
print a$," es ",dec(a$)
          
Ver también
bin$, hex$

Nombre
default — marca la bifurcación por defecto dentro de una declaración switch
Sinopsis
switch a+3
case 1
  …
case 2
  …
default
  …
end switch
Descripción
La cláusula default es una parte opcional de la declaración switch (vea esta para más información). Esta introduce una serie de declaraciones que se ejecutarán si no coinciden ninguno de los supuestos que se hayan especificado antes (cada uno con su propia cláusula case).
Así pues, default especifica las instrucciones que se ejecutarán por defecto si ninguno de los valores explícitos indicados previamente casan; de ahí su nombre.
Ejemplo
print "Por favor, introduzca un numero entre 0 y 6,"
print "especificando el dia de la semana. "
input d
switch d
case 0:print "Lunes":break
case 1:print "Martes":break
case 2:print "Miercoles":break
case 3:print "Jueves":break
case 4:print "Viernes":break
case 5:print "Sabado":break
case 6:print "Domingo":break
default:print "Ha introducido un numero no valido."
end switch
          
Este programa traduce un número entre 0 y 6 en el nombre de un día de la semana; la cláusula default se usa para detectar una entrada no válida.
Ver también
sub, case

Nombre
dim — crea una matriz antes de su primer uso
Sinopsis
dim array(x,y)
dim array$(x,y)
Descripción
El comando dim prepara una o más matrices (de números o cadenas de caracteres) para su posterior uso. Este comando también sirve para aumentar el tamaño de una matriz existente.
Cuando una matriz es creada con la declaración dim, se reserva la cantidad de memoria necesaria y se inicializan todos los elementos a 0 (si es una matriz numérica) o "" (para matrices de cadenas de caracteres).
Si ya existe la matriz, la declaración dim especificará un tamaño mayor que el actual, agrandándola y conservando su contenido.
Fíjese que dim no puede usarse para acortar una matriz: si se especifica un tamaño inferior al actual, el comando no hace nada.
Si se desea crear una matriz que sólo sea “visible” dentro de una subrutina, deberá usarse el comando local, que sirve para crear variables y matrices locales.
Ejemplo
dim a(5,5)
for x=1 to 5:for y=1 to 5
  a(x,y)=int(ran(100))
next y:next x
printmatrix(a())
dim a(7,7)
printmatrix(a())

sub printmatrix(ar())
  local x,y,p,q
  x=arraysize(ar(),1)
  y=arraysize(ar(),2)
  for q=1 to y
    for p=1 to x
      print ar(p,q),"\t";
    next p
    print
  next q
end sub
          
Este ejempo crea una matriz bidimensional con la declaración dim y la rellena con números aleatorios. La segunda declaración dim agranda la matriz, rellenando automáticamente todos los nuevos elementos con 0.
La subrutina printmatrix imprime el contenido de la matriz.
Ver también
arraysize, arraydim, local

Nombre
do — inicio de un bucle incondicional do-loop
Sinopsis
do 
… 
loop
Descripción
Inicia un bucle terminado en loop; todo lo que se encuentre entre do y loop se repetirá indefinidamente. Este bucle no tiene condiciones, por lo que es un bucle infinito; sin embargo, puede abandonarse el bucle en cualquier momento con el uso de una declaración break o goto.
Ejemplo
do
  a=a+1
  print a
  if (a>100) break
loop
          
Este ejemplo muestra los números entre 1 y 101. La declaración break es usada para salir del bucle.
Ver también
loop, repeat, while, break

Nombre
doc — comentario especial que puede ser recuperado por el propio programa
Sinopsis
doc   Esto es un comentario
docu  Esto es otro comentario
Descripción
Introduce un comentario, que se extiende hasta el final de la línea. A diferencia que un comentario rem, todos los comentarios docu son recogidos dentro de la matriz especial docu$ para ser recuperados más tarde. Además, puede usarse la forma yabasic -docu foo.yab en la línea de comandos para mostrar la documentación embebida dentro del programa foo.yab.
En vez de doc puede escribirse docu o documentation.
Ejemplo
rem   Hola, esto ha sido escrito por mí
rem
doc   Este programa pregunta por un número y
doc   muestra ese número multiplicado por 2
rem
rem   Muestra el mensaje anterior
for a=1 to arraysize(docu$()):print docu$(a):next a

rem   Lee y muestra el número
input "Por favor, introduzca un número: " x
print x*2
          
Este programa usa los comentarios dentro del código para mostrar al usuario un mensaje de ayuda.
El contenido de las líneas doc se recupera desde la matriz docu$; si no se desea que se recolecte un comentario se debe usar la declaración rem en lugar de doc.
Ver también
docu$, rem

Nombre
docu$ — matriz especial que recoge todas las declaraciones doc del programa
Sinopsis
a$=docu$(1)
Descripción
Antes de que su programa se ejecute, Yabasic recolecta el contenido de todas las declaraciones doc existentes en su código dentro de una matriz unidimensional (aunque sólo las correspondientes al programa principal, no las de las librerias).
Puede usarse la función arraysize para averiguar cuantas líneas contiene.
Ejemplo
docu
docu  Estre programa lee dos números 
docu  y los suma.
docu

rem recupera y muestra la documentación embebida
for a=1 to arraysize(docu$(),1)
  print docu$(a)
next a

input "Primer numero: " b
input "Segundo numero: " c

print "La suma de ",b," y ",c," es ",b+c
          
Este programa usa la documentación incrustada para mostrar un mensaje al usuario.
Ver también
arraydim, rem

Nombre
dot — dibuja un punto en la ventana gráfica
Sinopsis
dot x,y
clear dot x,y
Descripción
Dibuja un punto en las coordenadas especificadas dentro de la ventana gráfica. Si se ha activado la impresión con open printer, el punto aparecerá también en la salida por impresora.
Use las funciones peek("winheight") o peek("winwidth") para obtener el tamaño de la ventana y conocer los límites de las coordenadas que se pueden especificar en el comando dot.
Ejemplo
open window 200,200
circle 100,100,100
do
  x=ran(200):y=ran(200)
  dot x,y
  total=total+1
  if (sqrt((x-100)^2+(y-100)^2)<100) in=in+1
  print 4*in/total
loop
          
Este programa utiliza un bien conocido algoritmo para calcular π.
Ver también
line, open window

Nombre
else — establece una alternativa dentro de una declaración if
Sinopsis
if (…) then 
  … 
else 
  … 
endif
Descripción
La declaración else introduce una rama alternativa de una declaración if. Es decir, comienza una secuencia de sentencias que se ejecutarán si la condición de la declaración if no es cierta.
Ejemplo
input "Por favor, introduzca un numero: " a
if (mod(a,2)=1) then
  print a," is impar."
else
  print a," is par."
endif
          
Este programa detecta si el número introducido es par o impar.
Ver también
if

Nombre
elsif — establece una condición alternativa dentro de una declaración if
Sinopsis
if (…) then
  …
elseif (…) 
  …
elsif (…) then
  …
else
  …
endif
Descripción
La declaración elsif se usa para seleccionar una sola alternativa entre una serie de opciones.
Para cada declaración elsif debe especificar una condición que es puesta a prueba si la condición principal (especificada con la declaración if) falla. Fíjese que elsif puede ser escrito también como elseif.
Dentro del ejemplo siguiente, dos variables a y b son comprobados dentro de un rango de valores. La variable a es comprobada dentro de la declaración elsif. Las mismas pruebas se realizan a la variable b; pero estas implican el uso de series de declaraciones if-else, haciendo las comprobaciones mucho más oscuras.
Ejemplo
input "Por favor, introduzca un numero: " a
if (a<0) then
  print "menor que 0"
elseif (a<=10) then
  print "entre 0 y 10"
elsif (a<=20)
  print "entre 11 y 20"
else
  print "mayor que 20"
endif

input " Por favor, introduzca un numero: " b
if (b<0) then
  print "menor que 0"
else
  if (b<=10) then
    print "entre 0 y 10"
  else
    if (b<=20) then
      print "entre 11 y 20"
    else
      print "mayor que 20"
    endif
  endif
endif
          
Fíjese que se realizan las mismas comprobaciones para las variables a y b, pero resulta mucho más claro con el uso de la declaración elsif.
Note que elsif puede escribirse también como elseif, y que la palabra clave then es opcional.
Ver también
if, else

Nombre
end — pone fin al programa
Sinopsis
end
Descripción
Pone fin al programa. Es muy parecido (pero no igual) al comando exit.
Fíjese que end no finaliza el programa inmediatamente; si se ha abierto una ventana o se ha llamado a clear screen, Yabasic asume que el usuario desea estudiar la salida del programa después de finalizado; así que se muestra la línea ---Program done, press RETURN--- (es decir, programa terminado, pulse RETURN) y aguarda a que se presione una tecla. Sin no desea que realize esto, considere usar exit.
Ejemplo
print "¿Desea continuar?"
input "Por favor, responda si o no: " a$
if (lower$(left$(a$,1))="s") then
  print "adios"
  end
fi
          
Ver también
exit

Nombre
endif — finaliza una declaración if
Sinopsis
if (…) then
  …
endif
Descripción
La declaración endif cierra (o finaliza) una declaración if.
Fíjese que endif puede ser escrito de varias formas: end if, end-if o fi.
La declaración endif puede ser omitida si la declaración if no contiene la palabra clave then (vea el ejemplo a continuación). Una declaración if sin endif se extiende sólo una única línea.
Ejemplo
input "Un numero, por favor: " a
if (a<10) then
  print "Su numero es menor que 10."
endif

REM  y ahora sin endif 

input "Un numero, por favor: " a
if (a<10) print "Su numero es menor que 10."
          
Ver también
if

Nombre
end sub — concluye la definición de una subrutina
Sinopsis
sub foo(…) 
  …
end sub
Descripción
Marca el final de la definición de una subrutina (que comienza con la palabra clave sub). El concepto completo de subrutina se explica dentro de la entrada para sub. 
Ejemplo
print foo(3)

sub foo(a)
  return a*2
end sub
          
Este programa muestra 6. La subrutina foo símplemente devuelve el doble de su argumento.
Ver también
sub

Nombre
eof — comprueba si un fichero abierto contiene datos
Sinopsis
open 1,"foo.bar"
if (eof(1)) then 
   …
end if
Descripción
La función eof comprueba si todavía quedan datos en un fichero abierto. Como argumento espera el número de fichero que devuelve la declaración open.
Ejemplo
a=open("foo.bar")
while(not eof(a)) 
  input #a,a$
  print a$
end while
          
Este ejemplo muestra el contenido del fichero "foo.bar". La función eof finaliza el bucle si no quedan más datos en el fichero. 
Ver también
open

Nombre
eor() — computa el or exclusivo de sus dos argumentos
Sinopsis
print eor(a,b)
Descripción
La función eor toma dos argumentos y calcula el or exclusivo (si desea saber qué es esto, busque información sobre el tema en un texto introductorio de informática).
La función xor es la misma que eor; ambas son sinónimos; sin embargo, cada una tiene su propia descripción, por lo que puede echar un vistazo a la entrada de xor para una visión ligeramente diferente
Ejemplo
for a=0 to 3
  for b=0 to 3
    print fill$(bin$(a))," eor ",fill$(bin$(b))," = ",fill$(bin$(eor(a,b)))
  next b
next a

sub fill$(a$)
  return right$("0"+a$,2)
end sub
          
Este ejemplo muestra una tabla sobre la que se calcula la función eor.
Ver también
and, or

Nombre
error — genera un error y pone fin al programa
Sinopsis
error "¡¡ Error, error, error !!"
Descripción
Produce el mismo tipo de mensajes de error que los generados por Yabasic (por ejempo, en caso de un error de sintaxis). Se muestra el único argumento de la función (el mensaje propiamente dicho) junto con el número de línea en el que se encuentra.
Ejemplo
input "Por favor, introduzca un numero entre 1 y 10: " a
if (a<1 or a>10) error "Oh no ..."
         
El mensaje de error mostrado será:

---Error in t.yab, line 2: Oh no ...
---Error: Program stopped due to an error

Nombre
euler — otro nombre para la constante 2.71828182864
Sinopsis
foo=euler
Descripción
euler es la bien conocida constante bautizada con el nombre de su descubridor Leonard Euler; su valor es 2.71828182864. euler no es una función, por lo que no se usan paréntesis (euler() produciría un error).
Ejemplo
print euler
          
Ver también
pi

Nombre
execute$() — ejecuta una subrutina definida por el usuario, que debe devolver una cadena de caracteres
Sinopsis
print execute$("foo$","arg1","arg2")
Descripción
execute$ se usa para ejecutar una subrutina definida por el usuario, cuyo nombre debe especificarse en una expresión de cadena de caracteres.
Esta característica es la única vía para ejecutar una subrutina de la que no se conoce el nombre en el momento de escribir el programa. Esto puede ocurrir si desea ejecutar una subrutina que es compilada (usando el comando compile) durante el curso de la ejecución del programa.
Obsérvese, sin embargo, que la función execute$ no es el método preferible para ejecutar una subrutina definida por el usuario; en la mayoría de los casos, basta con invocar el nombre de la subrutina dentro del programa (ver el ejemplo).
Ejemplo
print execute$("foo$","Hola","mundo !")
sub foo$(a$,b$)
  return a$+" "+b$
end sub
          
El ejemplo simplemente muestra Hola mundo !, que es el valor devuelto por la subrutina definida por el usuario foo$. Lo mismo podría obtenerse ejecutando:
print foo$(a$,b$)
Ver también
compile, execute

Nombre
execute() — ejecuta una subrutina definida por el usuario, que debe devolver un número
Sinopsis
print execute("bar","arg1","arg2")
Descripción
La función execute es la contrapartida de la función execute$ (por favor, vea esta para algunas advertencias). execute ejecuta subrutinas que devuelven un número.
Ejemplo
print execute("bar",2,3)
sub bar(a,b)
  return a+b
end sub
          
Ver también
compile, execute$

Nombre
exit — finaliza el programa
Sinopsis
exit
exit 1
Descripción
Finaliza el programa y devuelve un valor al sistema operativo. exit es similar a end, pero finaliza el programa inmediatamente.
Ejemplo
print "¿Desea continuar?"
input "Por favor, responda si o no: " a$
if (lower$(left$(a$,1))="n") exit 1
          
Ver también
end

Nombre
exp() — calcula la función exponencial de su único argumento
Sinopsis
foo=exp(bar)
Descripción
Esta función calcula e elevado al exponente de su argumento, donde e es la constante de euler: 2.71828182864.
La función exp es la inversa de la función log.
Ejemplo
open window 100,100
for x=0 to 100
   dot x,100-100*exp(x/100)/euler
next x
          
Este programa dibuja la gráfica de parte de la función exp, sin embargo el rango es más bien pequeño, de modo que no puede reconocer la función de este gráfico.
Ver también
log

Nombre
export — marca una función como visible globalmente
Sinopsis
export sub foo(bar)
…
end sub
Descripción
La declaración export es usada dentro de librerías para marcar una subrutina definida por el usuario como visible fuera de la librería donde está definida. Las subrutinas que no son exportadas deben ser referidas indicando el nombre de la librería; por ejemplo  foo.baz (donde foo es el nombre de la librería y baz el de la subrutina); las subrutinas exportadas pueden usarse sin especificar el nombre de la librería; por ejemplo, bar.
Por lo tanto, export debe usarse sólo dentro de librerías.
Ejemplo
La librería foo.bar (cuyo listado puede verse abajo) define dos funciones bar y baz, donde sólo la función bar es exportada y, por tanto, visible fuera de la librería; baz no está exportada y puede usarse solo dentro de la librería foo.yab:
export sub bar()
  print "Hola"
end sub

sub baz()
  print "Mundo"
end sub
          
Ahora dentro del programa principal cux.yab (el cual importa la librería foo.yab), vea como se produce un error:
import foo

print "Llamando a la subrutina foo.bar (correcto) ..."
foo.bar()
print "Hecho."

print "Llamando a la subrutina bar (correcto) ..."
bar()
print "Hecho."

print "Llamando a la subrutina foo.baz (correcto) ..."
foo.baz()
print "Hecho."

print "Llamando a la subrutina baz (INCORRECTO) ..."
baz()
print "Hecho."

La salida que se produce al ejecutar yabasic foo.yab es la siguiente:
Llamando a la subrutina foo.bar (correcto) ...
Hola
Hecho.
Llamando a la subrutina bar (correcto) ...
Hola
Hecho.
Llamando a la subrutina foo.baz (correcto) ...
Mundo
Hecho.
Llamando a la subrutina baz (INCORRECTO) ...
---Error in main.yab, line 16: can't find subroutine 'baz'
---Dump: sub baz() called in main.yab,16
---Error: Program stopped due to an error
Como muestra el mensaje de error visualizado, la subrutina baz debe ser cualificada con el nombre de la librería si se usa fuera de la misma donde está definida (por ejemplo, foo.baz. Es decir, fuera de la librería foo.yab se necesita escribir foo.baz. El uso solo de baz produce un error.
La subrutina bar (sin añadir el nombre de la librería) sin embargo puede (y probablemente debería) ser usado en cualquier programa que importe la librería foo.yab.
Nota
En cierto sentido, el conjunto de subrutinas exportadas constituye la interfaz de la librería.
Ver también
sub, import

Nombre
false — una constante con el valor 0
Sinopsis
okay=false
Descripción
La constante false puede ser asignada a variables que luego aparezcan en condiciones (por ejemplo, dentro de una declaración if).
false puede ser escrito también como FALSE o incluso FaLsE.
Ejemplo
input "Por favor, introduzca un numero entre 1 y 10: " a
if (check_input(a)) print "Correcto"

sub check_input(x)
  if (x>10 or x<1) return false
  return true
end sub
          
La subrutina check_input comprueba el argumento y devuelve true o false según el resultado de la comprobación.
Ver también
true

Nombre
fi — otro nombre para endif
Sinopsis
if (…)
…
fi
Descripción
fi marca el final de una declaración if y es exactamente equivalente a endif (vea esta última forma para más información).
Ejemplo
input "Un numero, por favor: " a
if (a<10) then
  print "Su numero es menor que 10."
fi
          
Ver también
endif

Nombre
fill — dibuja circles, rectangles o triangles rellenos
Sinopsis
fill rectangle 10,10,90,90
fill circle 50,50,20
fill triangle 10,20,20,10,20,20
Descripción
La palabra clave fill se usa con los comandos circle, rectangle o triangle y efectua el relleno de las figuras.
fill puede ser usado en conjunción con la cláusula clear. Usado solo, fill rellena el interior de las figuras (círculo, rectángulo o triángulo); usado con clear se borrará la figura.
Ejemplo
open window 200,200
fill circle 100,100,50
clear fill rectangle 10,10,90,90
          
El programa anterior dibujará una figura similar al pacman.
Ver también
clear, circle, rectangle, triangle

Nombre
for — inicia un bucle for
Sinopsis
for a=1 to 100 step 2
  …
next a
Descripción
El bucle for permite a una variable numérica (a en la sinopsis) asumir todos los valores posibles dentro de un rango determinado. La cláusula opcional step puede especificar un valor (que, por defecto, es 1) en el que se incrementará (o decrementará, si step es negativo).
Ejemplo
for a=1 to 10 step 2:print a:next 

Este ejemplo simplemente imprime los números 1, 3, 5, 7 y 9.
Ver también
step, next

Nombre
frac() — devuelve la parte fraccional del argumento numérico
Sinopsis
x=frac(y)
Descripción
La función frac toma su argumento y devuelve los dígitos a la derecha de la coma, es decir, la parter fraccional.
Este ejemplo enseña como reescribir frac empleando la función int.
Ejemplo
for a=1 to 10
  print frac(sqr(a))
  print sqr(a)-int(sqr(a))
next a
          
El ejemplo muestra la parte fraccional de la raiz cuadrada de los números entre 1 y 10. Cada resultado es calculado (y mostrado) dos veces: Uno empleando la función frac y otra empleando la función int.
Ver también
int

Nombre
getbit$() — devuelve una cadena de caracteres que representa el patrón de bits de un rectángulo dentro de la ventana gráfica
Sinopsis
a$=getbit$(10,10,20,20)
a$=getbit$(10,10 to 20,20)
Descripción
La función getbit devuelve una cadena que contiene el patrón de bits codificado de un rectángulo dentro de la ventana gráfica; los cuatro argumentos representan los bordes del rectángulo. La cadena devuelta podría posteriormente suministrarse al comando putbit. 
La función getbit$ podría usarse para una animación simple (como en el ejemplo siguiente).
Ejemplo
open window 40,40
fill circle 20,20,18
circle$=getbit$(0,0,40,40)
close window

open window 200,200
for x=1 to 200
  putbit circle$,x,80
next x
          
Este ejemplo muestra un círculo moviéndose de izquierda a derecha de la ventana.
Ver también
putbit

Nombre
getscreen$() — devuelve una cadena de caracteres que representa una sección rectangular del terminal de texto
Sinopsis
a$=getscreen$(2,2,20,20)
Descripción
La función getscreen$ devuelve una cadena que representa el area de la ventana especificada por sus cuatro argumentos (los cuales especifican dos esquinas). Es decir, todo lo que se encuentre impreso dentro de este rectángulo se codifica en la cadena devuelta (incluyendo la información sobre el color).
Como otros comandos de salida de ventana de texto, getscreen$ requiere que se llame antes al comando clear screen.
Ejemplo
clear screen

for a=1 to 1000:
	print color("red") "1";
	print color("green") "2";
	print color("blue") "3";
next a  
screen$=getscreen$(10,10,40,10)
print at(10,10) " Por favor, pulse 's' o 'n' "
a$=inkey$
putscreen screen$,10,10
          
Este programa rellena la ventana con dígitos de colores y después pide que el usuario haga una elección ( Por favor, pulse 's' o 'n' ). Posteriormente, el area de la ventana sobreescrita por la pregunta se restaura con su contenido previo, que ha sido previamente guardado con getscreen$.
Ver también
putscreen$

Nombre
glob() — comprueba si una cadena de caracteres coincide con un patrón simple
Sinopsis
if (glob(string$,pattern$)) …
Descripción
La función glob toma dos argumentos, una cadena y un patrón, y comprueba si la cadena casa con el patrón. Sin embargo glob no emplea las poderosas reglas de las expresiones regulares, sino que sólo usa dos caracteres especiales: * (que casa cualquier número (incluso cero) de caracteres) y ? (que casa exactamente a un único caracter).
Ejemplo
for a=1 to 10
  read string$,pattern$
  if (glob(string$,pattern$)) then
    print string$," coincide con ",pattern$
  else
    print string$," no coincide con ",pattern$
  endif
next a

data "abc","a*"
data "abc","a?"
data "abc","a??"
data "abc","*b*"
data "abc","*"
data "abc","???"
data "abc","?"
data "abc","*c"
data "abc","A*"
data "abc","????"
          
Este programa compueba la cadena abc con varios patrones e imprime el resultado. La salida será:
abc coincide con a*
abc no coincide con a?
abc coincide con a??
abc coincide con *b*
abc coincide con *
abc coincide con ???
abc no coincide con ?
abc coincide con *c
abc no coincide con A*
abc no coincide con ????
Ver también
No existen comandos relacionados.

Nombre
gosub — continua la ejecución en otro punto del programa (y retorna luego)
Sinopsis
gosub foo

…

label foo
…
return
Descripción
gosub recuerda la actual posición dentro del programa y pasa el flujo de ejecución a otro punto (que está normalmente marcado con label). Después, al encontrar la sentencia return, la ejecución continúa en el punto en que se dejó anteriormente.
gosub es el comando tradicional para invocar código que necesita ser ejecutado desde varios puntos dentro del programa. Sin embargo, con las subrutinas Yabasic ofrece una via más flexible para conseguir esto (y más). Por lo tanto gosub debe considerarse obsoleto.
Ejemplo
print "Desea salir? "
gosub ask
if (r$="s") exit

label ask
input "Por favor, responda si o no escribiendo 's' o 'n': ",r$
return
          
Ver también
return, goto, sub, label, on gosub

Nombre
goto — continúa la ejecución en otro punto del programa (sin volver luego atrás)
Sinopsis
goto foo

…

label foo
Descripción
La sentencia goto pasa el flujo de ejecución a otro punto del programa (que normalmente está marcado con label).
goto es normalmente considerado obsoleto y problemático; sin embargo, en Yabasic puede hacérsele buen uso para abandonar prematuramente un bucle (como while o for). No obstante, no puede abandonarse una subrutina usando este comando.
Ejemplo
print "Por favor, pulse una tecla para continuar."
print "(el programa continuara por si mismo tras 10 segundos)"
for a=1 to 10
  if (inkey$(1)<>"") then goto done
next a
label done
print "Hola, Mundo !"
          
Aquí la sentencia goto se usa para abandonar prematuramente un bucle for.
Ver también
gosub, on goto

Nombre
hex$() — convierte un número a hexadecimal
Sinopsis
print hex$(foo)
Descripción
La función hex$ convierte un número en una cadena de caracteres con su representación en hexadecimal. hex$ es el inverso de la función dec.
Ejemplo
open 1,"foo"
while(!eof(1))
  print right$("0"+hex$(peek(1)),2)," ";
  i=i+1
  if (mod(i,10)=0) print
end while
print
          
Estre programa lee el fichero foo e imprime su contenido en hexadecimal usando la función hex.
Ver también
decbin

Nombre
if — evalua una condición y ejecuta ciertas sentencias o no, dependiendo del resultado
Sinopsis
if (…) then
  …
endif

if (…) …

if (…) then
  …
else
  …
endif

if (…) then
  …
elsif (…)
  …
elsif (…) then
  …
else
  …
endif
Descripción
La sentencia if se usa para evaluar una condición y actuar en consecuencia (como nota al margen, no existe una diferencia real entre condiciones y expresiones).
 Existen dos formas principales para la sentencia if :
·	La forma en una sola línea, sin la palabra clave then: 
if (…) …
Esta forma evalua la condición y si el resultado es true ejecuta todos los comandos (separados por dos puntos) hasta el final de la línea. No permite el uso de las palabras clave endif y else.
·	La forma multilínea con la palabra clave then: 
if (…) then … elsif (…) … else … endif
donse elsif y else son opcionales, pero no endif.
De acuerdo a los requerimientos del programa se podrá especificar:
o	elsif(…), que indica una condición que será evaluada solo si la condición del if o de otro elsif precedente no se cumple.
o	else, que introduce una secuencia de comandos que se ejecutarán si ningua de las condiciones anteriores se cumplen. 
o	endif es obligatorio para finalizar una sentencia if.
Ejemplo
input "Por favor, introduzca un numero entre 1 y 4: " a
if (a<=1 or a>=4) error "Mal, mal!"
if (a=1) then
  print "uno"
elsif (a=2)
  print "dos"
elsif (a=3)
  print "tres"
else
  print "cuatro"
endif
          
El número introducido (entre 1 y 4) simplemente se muestra como texto. El ejemplo demuestra ambas formas (la corta y la larga) de la sentencia if (note, sin embargo, que se podría haber realizado la anterior tarea de forma más apropiada y elegante con la sentencia switch. Tómese como lo que es: un ejemplo simple sobre el uso de la sentencia if).
Ver también
else, elsif, endif, conditions and expressions.

Nombre
import — importa una librería
Sinopsis
import foo
Descripción
La sentencia import importa una librería. Esta espera un único argumento: el nombre de la librería (sin el sufijo .yab). Esta librería es leida y analizada, y sus subrutinas (y variables) quedan disponibles dentro del programa principal.
Las librerías se buscan primero dentro del directorio actual (es decir, el directorio desde donde se invocó a Yabasic). Después, dentro de un directorio especial, cuya exacta localización depende de nuestro sistema; este suele ser /usr/lib en Unix o C:\yabasic\lib bajo Windows. Dicha ubicación puede obtenerse con yabasic -help-usage; y cambiarse usando la opción -library (tanto en Windows como en Unix).
Ejemplo
Digamos que tenemos un programa de nombre foo.yab, que importa una libraría lib.yab.
foo.yab poseería las siguientes instrucciones:
import lib

rem  Esto funciona ...
lib.x(0)

rem  Esto también funciona ..
x(1)

rem  Y esto.
lib.y(2)

rem  ¡Pero esto no!
y(3)
          
Ahora la librería lib.yab podría tener:
rem  Hace la subrutina x fácilmente accesible desde fuera de esta librería
export sub x(a)
  print a
  return
end sub

rem  sub y puede referenciarse con su nombre completo fuera de esta librería
sub y(a)
  print a
  return
end sub
Este programa produce un error:
0
1
2
---Error in foo.yab, line 13: can't find subroutine 'y'
---Dump: sub y() called in foo.yab,13
---Error: Program stopped due to an error
Como se puede ver en el mensaje de error, Yabasic es incapaz de encontrar la subrutina y sin especificar el nombre de la librería (en la forma lib.y). La razón de esto es que y, a diferencia de x, no ha sido exportada desde la librería lib.yab (usando la sentencia export). 
Ver también
export, sub

Nombre
inkey$ — espera hasta que se pulsa una tecla
Sinopsis
clear screen
foo$=inkey$
inkey$
foo$=inkey$(bar)
inkey$(bar)
Descripción
La función inkeys$ espera hasta que el usuario pulsa una tecla o un botón del ratón, y devuelve dicha tecla. Un argumento opcional especifica el número de segundos que debe esperar; si se omite, inkey$ aguarda indefinidamente.
inkey$ sólo puede usarse si se ha llamado previamente la instrucción clear screen.
Para las teclas normales, Yabasic simplemente devuelve dicha tecla, como a, 1 o !. Para las teclas de función se obtiene f1, f2 y así. Otras teclas especiales devuelven las siguientes cadenas de caracteres, respectivamente: enter, backspace, del, esc, scrnup (para pantalla arriba), scrndown y tab. Las teclas modificadoras (como ctrl, alt o shift) por sí mismas no pueden ser detectadas (sin embargo, si, por ejemplo, presiona shift y a simultáneamente, inkey$ devolverá la letra A en vez de a, por supuesto).
Si se ha abierto una ventana gráfica (via open window) cualquier pulsación de botón del ratón dentro de esta ventana será devuelta por inkey$. La cadena de caracteres devuelta (como MB1d+0:0028,0061, MB2u+0:0028,0061 o MB1d+1:0028,0061) está construida de la siguiente manera: 
·	Cualquier cadena asociada a la pulsación de un botón del ratón empezará con MB.
·	El siguiente dígito (1, 2 o 3) especifica el botón del ratón pulsado.
·	Una única letra, d o u, especifica si el botón ha sido presionado o soltado: d indica pulsado, y u soltado.
·	A continuación, el signo +.
·	El siguiente dígito (en el rango entre 0 y 7) codifica las teclas modificadoras pulsadas, donde 1 indica shift, 2 indica alt y 4 indica ctrl.
·	Los siguientes cuatro dígitos (por ejemplo, 0028) contiene la posición del eje x, donde el botón ha sido pulsado.
·	A continuación viene siempre una coma.
·	Los últimos cuatro dígitos (por ejemplo, 0061) contiene la posición del eje y.
Todos estos campos son de longitud fija, con lo que pueden extraerse con la función mid$. Sin embargo, las funciones especializadas mousex, mousey, mouseb y mousemod devuelven dicha información de forma más cómoda. Por último, cabe señalar que inkey$ sólo puede registrar las pulsaciones del ratón dentro de la ventana gráfica, no en la ventana de texto.
inkey$ acepta un argumento opcional que especifica una demora en segundos; si no se pulsa ninguna tecla en ese intervalo devuelve una cadena vacia. Si se omite dicho argumento, inkey$ aguarda indefinidamente.
Ejemplo
clear screen
open window 100,100
print "Pulse cualquier tecla o 'q' para parar."
repeat
  a$=inkey$
  print a$
until(a$="q")
          
Este programa simplemente devuleve la tecla pulsada. Puede usarse para averiguar qué cadenas devuelve al pulsar las teclas especiales, como por ejemplo las teclas de función.
Ver también
clear screen,mousex, mousey, mouseb, mousemod

Nombre
input — lee la entrada del usuario (o de un fichero) y lo asigna a una variable
Sinopsis
input a
input a,b,c
input a$
input "Hello" a
input #1 a$
Descripción
input lee los nuevos contenidos de una o varia variables (numéricas o de cadena de caracteres), ya sea del teclado o de un fichero. Un argumento de cadena opcional especifica un mensaje que se mostrará antes de leer cualquier contenido.
Si se desea que lea de un fichero abierto, se requiere el símbolo '#', seguido del número del fichero abierto.
Note que la entrada se separa con espacios. Es decir, que si se introduce una linea que contiene espacios separando palabras, la primera sentencia input sólo devolverá la primera palabra; las otras palabras sólo se devolverán mediante subsecuentes llamadas a input; lo mismo se aplica si input lee múltiples variables: la primera variable tomará la primera palabra, la segunda variable tomará la segunda palabra, y así sucesivamente. Si no se desea este comportamiento, deberá usarse line input, que devuelve una linea completa cada vez (incluidos los espacios).
Ejemplo
input "Introduzca el nombre del fichero a leer: " a$
open 1,a$
while(!eof(1))
  input #1 b$
  print b$
wend
          
Si este programa se almacena dentro de un fichero de nombre test.yab y se introduce este mismo nombre como fichero a leer, se producirá la siguiente salida:
Introduzca el nombre del fichero a leer: t.yab
input
"Introduzca
el
nombre
del
fichero
a
leer:
"
a$
open
1,a$
while(!eof(1))
input
#1
b$
print
b$
wend
Ver también
line input

Nombre
instr() — busca el segundo argumento dentro del primero; si lo encuentra, devuelve su posición
Sinopsis
print instr(a$,b$)
if (instr(a$,b$)) …
pos=instr(a$,b$,x)
Descripción
La función instr requiere dos argumentos de tipo cadena de caracteres, y busca el segundo argumento dentro del primero. Si se encuentra el segundo argumento dentro del primero, se devuelve su posición. Si no se encuentra, devuelve 0; esto permite usar la función dentro de una condición o una sentencia if (ver el ejemplo más abajo).
Si se indica un tercer argumento numérico, se usará como punto de inicio de la búsqueda. Así, instr("abcdeabcdeabcde","e",8) devolverá 10, dado que la búsqueda de "e" comienza en la posición 8 y encuentra "e" en la posición 10 (y no la situada en la posición 5).
Ejemplo
input "Por favor, introduzca un texto conteniendo la cadena 'bumf': " a$
if (instr(a$,"bumf")) then
  print "Bien hecho!"
else
  print "no tan bien ..."
endif
          
Ver también
rinstr

Nombre
int() — devuelve la parte entera del número suministrado como argumento
Sinopsis
print int(a)
Descripción
La función int devuelve sólo los dígitos anteriores a la coma decimal; int(2.5) devuelve 2 y int(-2.3) devuelve -2.
Ejemplo
input "Por favor, introduzca un numero entero entre 1 y 10: " a
if (a=int(a) and a>=1 and a<=10) then
  print "Gracias!"
else
  print "No importa ..."
endif
          
Ver también
frac

Nombre
label — marca una localización específica dentro del programa para ser usado por goto, gosub o restore
Sinopsis
label foo

…

goto foo
Descripción
El comando label se usa para dar nombre a un sitio específico dentro del programa. Dicha posición puede ser referenciada por los comandos goto, gosub y restore.
Pueden usarse nombres de etiquetas (label) dentro de las librerías con toda tranquilidad, ya que no entran en conflicto con otras etiquetas que hayan podido declararse en otras librerías o en el programa principal (es decir, que el mismo nombre de etiqueta puede usarse en distintas librerías sin problemas).
Pueden usarse números como etiquetas, pero esta práctica es obsoleta.
Ejemplo
for a=1 to 100
  if (rand(10)>5) goto done
next a
label done

10 for a=1 to 100
20   if (rand(10)>5) goto 40
30 next a
40
          
En el ejemplo, los bucles for podrían abandonarse prematuramente con la sentencia goto.
Ver también
gosub, goto.

Nombre
left$() — devuelve (o cambia) la parte izquierda de una cadena de caracteres
Sinopsis
print left$(a$,2)
left$(b$,3)="foobar"
Descripción
La función left$ toma dos argumentos (la cadena y un número) y devuelve la parte izquierda de dicha cadena, cuya longitud ha sido especificada por el segundo argumento. En otras palabras, devuelve un número de caracteres de la parte izquierda de la cadena.
Nótese que la función left$ puede usarse para asignación; es decir, que puede aparecer en la parte izquierda de una asignación. De este modo es posible modificar una parte de la cadena. No obstante, mediante este recurso no puede cambiarse la longitud total de la cadena; es decir, los caracteres son sobreescritos, pero no pueden ser añadidos o suprimidos.
Ejemplo
input "Por favor, responda si o no: " a$
l=len(a$):a$=lower$(a$):print "Su respuesta es ";
if (left$("si",l)=a$ and l>=1) then
  print "si"
elsif (left$("no",l)=a$ and l>=1) then
  print "no"
else
  print "?"
endif
          
Este ejemplo pide que se responda si/no a una pregunta, y permite aceptar una entrada incompleta, rechazando las entradas no válidas.
Este segundo ejemplo demuestra la capacidad de asignación de la función left$.
a$="Chao, Mundo!"
print a$
left$(a$,4)="Hola"
print a$
Ver también
right$, mid$

Nombre
len() — devuelve la longitud de una cadena
Sinopsis
x=len(a$)
Descripción
La función len devuelve la longitud de la cadena suministrada como argumento.
Ejemplo
input "Por favor, introduzca una contraseña: " a$
if (len(a$)<6) error "Contraseña demasiado corta!"
          
Este ejemplo comprueba la longitud de la contraseña que el usuario ha introducido.
Ver también
left$, right$ and mid$, 

Nombre
line — dibuja una línea
Sinopsis
open window 100,100
line 0,0,100,100
line 0,0 to 100,100
new curve
line 100,100
line to 100,100

open window 100,100
clear line 0,0,100,100
clear line 0,0 to 100,100
new curve
clear line 100,100
clear line to 100,100
Descripción
El comando line dibuja una línea. Tan simple como es esto, el comando line tiene una gran variedad de formas, como se muestra en la sinopsis. Veámoslo más detenidamente:
·	Una línea tiene un punto de inicio y otro de final; por lo tanto el comando line (normalmente) necesita cuatro números como argumentos, los cuales representan estos dos puntos. Esta es la primera forma que aparece en la sinopsis. 
·	Pueden separarse estos dos puntos con ',' o to, como muestra la segunda forma.
·	El comando line puede usarse para dibujar una secuencia de líneas conectadas, con una serie de comandos en la forma line x,y; cada comando dibuja una línea desde el punto final de la última línea dibujada al punto especificado en el argumento de la actual. Nótese que se necesita usar el comando new curve antes de comenzar una nueva línea en otras coordenadas (es decir, para romper la concatenación de líneas).
·	Puede usarse la palabra to a efectos de legibilidad o estética: line to x,y, es exactamente lo mismo que line x,y
·	Finalmente, puede elegir borrar la línea o líneas dibujadas; esto se consigue anteponiendo la palabra clear. Esto es aplicable para todas las formas del comando line.
Ejemplo
open window 200,200
line 10,10 to 10,190
line 10,190 to 190,190
new curve
for a=0 to 360
  line to 10+a*180/360,100+60*sin(a*pi/180)
next a
          
Este ejemplo dibuja una sinusoide (con un desplazamiento en las coordenadas x e y). Nótese que el primer comando line después de new curve no dibuja nada. Sólo establece las coordenadas. La segunda iteración del bucle usa dichas coordenadas como punto de inicio de la primera línea.
Ver también
new curve, close curve, open window

Nombre
line input — lee una línea completa de texto y la asigna a una variable
Sinopsis
line input a
line input a$
line input "Hello" a
line input #1 a$
Descripción
En la mayoría de los aspectos line input es parecido al comando input: lee el nuevo contenido de una variable, ya sea desde un fichero o desde el teclado. Sin embargo,  line input siempre lee la línea completa. line input no detiene la lectura por los espacios y es la mejor forma de leer una cadena de caracteres con espacios intercalados. El caracter de final de línea se omite.
Ejemplo
line input "Por favor, introduzca su nombre (ejemplo: Frodo Bolson): " a$
print "Hola, ",a$
          
Nótese que el uso de line input es esencial en este ejemplo; si se usara input la lectura se detendría al encontrar el primer espacio.
Ver también
input

Nombre
local — marca una variable como local a una subrutina
Sinopsis
sub foo()

  local a,b,c$,d(10),e$(5,5)

  …

end sub 
Descripción
El comando local marca una variable (o matriz) como local a la subrutina que la contiene. Esto significa que una variable local a una subrutina es totalmente diferente a otra variable con el mismo nombre situada en otro punto del programa. Las variables que son conocidas en cualquier punto del programa son denominadas globales.
Declarar variables dentro de las subrutinas como locales ayudan a evitar errores difíciles de localizar; por lo tanto deben usarse variables locales siempre que sea posible.
Téngase en cuenta que los parámetros de las subrutinas son siempre locales.
Como se puede ver en la sinopsis, las matrices locales se crean sin el uso de la palabra reservada dim (la cual se requiere sólo para las matrices globales).
Ejemplo
a=1
b=1
print a,b
foo()
print a,b

sub foo()
  local a
  a=2
  b=2
end sub
          
Este ejemplo demuestra la diferencia entre variables locales y globales, como puede observarse por el resultado de su ejecución:
1 1
1 2
Como puede verse, el contenido de la variable global a no es modificado después de ejecutarse la subrutina foo; esto es debido a que la asignación a=2 dentro de la subrutina afecta solo a la variable local a y no a la global. Sin embargo, la variable b no está declarada como local y por ello la subrutina cambia su contenido.
Ver también
sub, static, dim

Nombre
log() — calcula el logaritmo natural
Sinopsis
a=log(x)
a=log(x,base)
Descripción
La función log calcula el logaritmo de su primer argumento. El segundo argumento es opcional y establece la base para el logaritmo; si se omite el segundo argumento, se toma como base la constante de euler  2.71828...
Ejemplo
open window 200,200
for x=10 to 190 step 10:for y=10 to 190 step 10
  r=3*log(1+x,1+y)
  if (r>10) r=10
  if (r<1) r=1
  fill circle x,y,r
next y:next x
          
Este programa realiza un bonito gráfico.
Ver también
exp

Nombre
loop — señala el final de un bucle infinito
Sinopsis
do
  …
loop
Descripción
El comando loop marca el final de un bucle (empezado con do), donde se repiten indefinidamente las setencias incluidas en su interior. A este respecto el bucle do loop es infinito, y sólo se puede abandonar su ejecución mediante break o goto.
Ejemplo
print "Hola, voy a tirar los dados hasta que consiga un 2 ..."
do
  r=int(rand(6))+1
  print r
  if (r=2) break
loop
          
Ver también
do, for, repeat, while, break

Nombre
lower$() — convierte una cadena de caracteres a minúsculas
Sinopsis
l$=lower$(a$)
Descripción
La función lower$ acepta un argumento de tipo cadena de caracteres y convierte todo su contenido a minúsculas.
Ejemplo
input "Por favor, introduzca una contraseña: " a$
if (a$=lower$(a$)) error "Su contraseña NO se ha introducido en mayusculas!"
          
Este ejemplo pide una contraseña y comprueba si la ha introducido en minúsculas.
Ver también
upper$

Nombre
ltrim$() — elimina los espacios a la izquierda de una cadena de caracteres
Sinopsis
a$=ltrim$(b$)
Descripción
La función ltrim$ elimina todos los espacios en blanco situados a la izquierda de una cadena de caracteres y devuelve el resultado de esta operación.
Ejemplo
input "Por favor, responda 'si' o 'no': " a$
a$=lower$(ltrim$(rtrim$(a$)))
if (len(a$)>0 and a$=left$("yes",len(a$))) then
  print "Si ..."
else
  print "No ..."
endif
          
Este ejemplo pide una respuesta y elimina cualquier espacio que preceda a la misma.
Ver también
rtrim$, trim$

Nombre
max() — devuelve el mayor de dos argumentos numéricos
Sinopsis
print max(a,b)
Descripción
Devuelve el máximo de sus dos argumentos.
Ejemplo
dim m(10)
for a=1 to 1000
  m=0
  For b=1 to 10
    m=max(m,ran(10))
  next b
  m(m)=m(m)+1
next a

for a=1 to 9
  print a,": ",m(a)
next a
          
Dentro del bucle interno for (el que usa la variable b), calcula el máximo de 10 números aleatorios. El bucle exterior (el de la variable a) repite este proceso 1000 veces y selecciona los números máximos aparecidos. El último bucle muestra el resultado.
Ver también
min

Nombre
mid$() — devuelve (o cambia) caracteres dentro de una cadena
Sinopsis
print mid$(a$,2,1)
print mid$(a$,2)
mid$(a$,5,3)="foo"
mid$(a$,5)="foo"
Descripción
La función mid$ requiere tres argumentos: una cadena de caracteres y dos números, donde el primero especifica la posición dentro de la cadena y el segundo el número de caracteres a devolver; si se omite el segundo argumento, la función devuelve todos los caracteres desde el punto de inicio indicado al final de la cadena.
Nótese que se puede realizar una asignación con esta; es decir, mid$ puede aparecer a la izquierda de una asignación. De este modo es posible cambiar una parte de la variable usada en esta función. No obstante, la longitud total de la cadena no puede cambiar, es decir, los caracteres pueden ser sobreescritos, pero no añadidos o eliminados.
Ejemplo
input "Por favor, introduzca una cadena de caracteres: " a$
for a=1 to len(a$)
  if (instr("aeiou",lower$(mid$(a$,a,1)))) mid$(a$,a,1)="e"
next a
print "Cuando se pasa todo a minusculas y se reemplaza "
print "cada vocal con la 'e', su entrada se lee:"
print
print a$
          
Este ejemplo transforma la cadena introducida usando la función mid$.
Ver también
left$ and right$.

Nombre
min() — devuelve el menor de sus dos argumentos
Sinopsis
print min(a,b)
Descripción
Devuelve el número más pequeño de sus dos argumentos.
Ejemplo
dim m(10)
for a=1 to 1000
  m=min(ran(10),ran(10))
  m(m)=m(m)+1
next a

for a=1 to 9
  print a,": ",m(a)
next a
          
Para cada iteración del bucle, se guarda el menor de dos números. El resultado se imprime al final.
Ver también
max

Nombre
mod() — calcula el resto de una división
Sinopsis
print mod(a,b)
Descripción
La función mod divide sus dos argumentos y calcula el resto. Así, a/b-int(a/b) y mod(a,b) son equivalentes.
Ejemplo
clear screen
print at(10,10) "Espere por favor ";
p$="-\|/"
for a=1 to 100
  rem  ... aquí vendría una tarea muy larga, o simplemente una pausa
  pause(1)
  print at(22,10) mid$(p$,1+mod(a,4))
next a
          
Este ejemplo ejecuta una acción que consume tiempo dentro de un bucle (de hecho, simplemente realiza una pausa) y proporciona al usuario indicación sobre su progreso mostrando una barra rotante.
Ver también
int, frac

Nombre
mouseb — extrae el estado de los botones del ratón de la cadena devuelta por inkey$
Sinopsis
inkey$
print mouseb()
print mouseb
a$=inkey$
print mouseb(a$)
Descripción
La función mouseb decodifica parte de la (por otra parte complicada) cadena de caracteres devuelta por la función inkey$. Si se ha presionado un botón del ratón, la función mouseb devuelve el número del botón presionado (1,2 ó 3); y cuando es liberado, en negativo (-1,-2 ó -3).
La función mouseb puede aceptar un argumento, consistente en una cadena de caracteres devuelta por la función inkey$; si se llama mouseb sin argumentos, devuelve los valores de la última llamada a inkey$, que es almacenado internamente de forma implícita por Yabasic.
Note
Téngase en cuenta que el valor devuelto por mouseb no refleja el estado actual de los botones del ratón, sino el guardado en la cadena pasada como argumento (o la guardada tras la última llamada a la función inkey$, si no se le pasa argumento). Así, el valor devuelto por mouseb refleja el estado de los botones del ratón en el momento de la última vez que se invocó la función inkey$; no en el momento en que se llama a la función mouseb.
Ejemplo
open window 200,200
clear screen
print "Por favor, dibuje unas lineas; pulse (y mantenga pulsado) " 
print "el boton izquierdo del raton en el punto de inicio,"
print "y sueltelo para indicar el punto final."
do
  if (mouseb(release$)=1) press$=release$
  release$=inkey$
  if (mouseb(release$)=-1) then
    line mousex(press$),mousey(press$) to mousex(release$),mousey(release$)
  endif
loop
          
Este es seguramente el más simple programa de dibujo posible, el cual captura cuando se presiona o se libera el botón nº 1 del ratón.
Ver también
inkey$, mousex, mousey and mousemod

Nombre
mousemod — devuelve el estado de las teclas modificadoras durante la pulsación del ratón
Sinopsis
inkey$
print mousemod()
print mousemod
a$=inkey$
print mousemod(a$)
Descripción
La función mousemod decodifica la cadena de caracteres devuelta por la función inkey$ cuando se pulsa un botón del ratón. Devuelve el estado de las teclas modificadoras (shift, ctrl o alt): si se ha pulsado la tecla shift, mousemod devuelve 1; para la tecla alt, 2; y si es la tecla ctrl, 4. Si se ha pulsado más de una tecla a la vez, se devuelve la suma de sus valores. Por ejemplo, mousemod devolverá 5 si se han pulsado simultáneamente shift y ctrl.
La función mousemod puede recibir un argumento, consistente en la cadena devuelta por la función inkey$; pero si se llama a mousemod sin argumentos, devolverá el valor correspondiente a la última llamada a inkey$ (que se almacenó internamente de forma implícita por Yabasic).
Ejemplo
open window 200,200
clear screen
do
  a$=inkey$
  if (left$(a$,2)="MB") then
    x=mousex(a$)
    y=mousey(a$)
    if (mousemod(a$)=0) then
      circle x,y,20
    else
      fill circle x,y,20
    endif
  endif
loop
          
Este programa dibuja un círculo en donde se pulse un botón del ratón; los círculos serán rellenos si se pulsa cualquier modificador, o vacio si no.
Ver también
inkey$, mousex, mousey y mouseb

Nombre
mousex — devuelve la posición x de la pulsación del ratón
Sinopsis
inkey$
print mousex()
print mousex
a$=inkey$
print mousex(a$)
Descripción
La función mousex decodifica la cadena de caracteres devuelta por la función inkey$, devolviendo la posición en la coordenada x del ratón.
Esta función puede aceptar un argumento, consistente en la cadena de caracteres devuelta por la función inkey$. Si no se le suministra argumento, se toma el resultado de la última vez que se invocó la función inkey$ (el cual se almacena internamente de forma implícita por Yabasic).
Ejemplo
open window 200,200
clear screen
do
  a$=inkey$
  if (left$(a$,2)="MB") then
    line mousex,0 to mousex,200
  endif
loop
          
Este ejemplo dibuja líneas verticales en la posición donde se pulsa el botón.
Ver también
inkey$, mousemod, mousey y mouseb

Nombre
mousey — devuelve la posición y del ratón cuando se pulsa un botón
Sinopsis
inkey$
print mousey()
print mousey
a$=inkey$
print mousey(a$)
Descripción
La función mousey decodifica la cadena devuelta por la función inkey$, devolviendo la posición en el eje y del ratón al pulsar un botón.
La función mousey puede tener un argumento, consistente en la cadena de caracteres devuelta por la función inkey$. Si no se aporta dicho argumento, la función toma la cadena devuelta por la última vez que se invocó la función inkey$ (la cual es almacenada internamente de forma implícita por Yabasic).

Ejemplo
open window 200,200
clear screen
do
  a$=inkey$
  if (left$(a$,2)="MB") then
    line 0,mousey to 200,mousey
  endif
loop
          
Este ejemplo dibuja líneas horizontales en la posición donde se ha pulsado un botón del ratón.
Ver también
inkey$, mousemod, mousex y mouseb

Nombre
new curve — indica el comienzo de una nueva curva, que será dibujada con el comando line
Sinopsis
new curve
line to x,y
Descripción
La función new curve comienza una nueva secuencia de líneas que se dibujarán mediante el uso repetido del comando line to.
Ejemplo
open window 200,200
ellipse(100,50,30,60)
ellipse(150,100,60,30)
sub ellipse(x,y,xr,yr)
  new curve
  for a=0 to 2*pi step 0.2
    line to x+xr*cos(a),y+yr*sin(a)
  next a
  close curve
end sub

Este ejemplo define una subrutina ellipse que dibuja una elipse. Dentro de esta subrutina, la elipse es dibujada como una secuencia de lineas iniciada con el comando new curve y cerrada con close curve.
Ver también
line, close curve

Nombre
next — marca el final de un bucle for
Sinopsis
for a=1 to 10
next a
Descripción
La palabra clave next marca el final de un bucle for. Todas las sentencias anteriores a la palabra clave next e iniciadas por la cláusula for se repetiran un número determinado de veces. Nótese que el nombre de la variable de control es opcional; así, next a puede escribirse símplemente next.
Ejemplo
for a=1 to 300000
  for b=1 to 21+20*sin(pi*a/20)
    print "*";
  next b
  print
  sleep 0.1
next a
          
Este ejemplo dibuja una curva sinusoidal.
Ver también
for

Nombre
not — niega una expresión. También puede escribirse como !
Sinopsis
if (not a<b) then …
bad=!okay
Descripción
La palabra clave not (o ! de forma abreviada) es muy usado en condiciones (por ejemplo, dentro de sentencias if  o while). Se emplea para negar una condición o expresión (es decir, cambia TRUE a FALSE o viceversa).
Además, not puede usarse también dentro de cálculos aritméticos, porque no hay diferencia entre expresiones lógicas y aritméticas.
Ejemplo
input "Por favor, introduzca tres numeros en orden ascendente: " a,b,c
if (not (a<b and b<c)) error " Los numeros que ha introducido no son ascendentes ..."
          
Ver también
and,or

Nombre
numparams — devuelve el número de parámetros pasados a una subrutina
Sinopsis
sub foo(a,b,c)
  if (numparams=1) …
  …
end sub
Descripción
Dentro de una subrutina la variable local implícita numparam o numparams contiene el número de parámetros que se han pasado a una subrutina. Esta información es muy útil ya que una subrutina puede ser llamada con menos parámetros de los declarados.
Hay que tener en cuenta que a los argumentos declarados que no se suministren durante la llamada a la subrutina se les asignará 0 o "" (cadena vacia), según sea numérico o de cadena de caracteres. Además, sólo pueden omitirse los parámetros  a partir de los situados a la derecha de la declaración (es decir: dados dos parámetros declarados a y b, a no puede ser omitido si se suministra b)
Ejemplo
a$="123456789"
print part$(a$,4)
print part$(a$,3,7)

sub part$(a$,f,t)
  if (numparams=2) then
    return mid$(a$,f)
  else 
    return mid$(a$,f,t-f+1)
  end if
end sub
          
Cuando se ejecuta este ejemplo, imprime 456789 y 34567. Si además de la cadena se le suministran dos números, estos definen el inicio y el final de la subcadena a devolver. Si sólo se suministra un número, se devuelve el resto de la cadena partiendo de la posición indicada por dicho número. Cada uno de estos casos es reconocido con la ayuda de la variable implícita numparams.
Ver también
sub

Nombre
on gosub — salta a un punto determinado del programa, dependiendo de una condición, del que luego retorna
Sinopsis
on a gosub foo,bar,baz
  …
label foo
  …
return

label bar
  …
return

label baz
  …
return
Descripción
La sentencia on gosub usa un argumento numérico (indicado entre on y gosub) para seleccionar un elemento dentro de una lista de etiquetas que siguen a la palabra clave gosub: si el número es 1 se salta a la primera etiqueta indicada; si es 2, a la segunda, etc. Si el número es cero o menor, el programa continua en la posición de la primera etiqueta; si el número es mayor que el total de etiquetas listadas, la ejecución continua en la posición de la última etiqueta.
Téngase en cuenta que el comando on gosub se suele considerar obsoleto.
Ejemplo
do
  print "Por favor, introduzca un numero entre 1 y 3: "
  print
  input "Ha elegido " a
  on a gosub bad,one,two,three,bad
loop

label bad
  print "No. Por favor, entre 1 y 3"
return

label one
  print "uno"
return

label two
  print "dos"
return

label three
  print "tres"
return
          
Nótese que una entrada inválida (menor que 1 o mayor que 3) es automáticamente detectada.
Ver también
goto, on gosub/function>

Nombre
on goto — continua la ejecución en otro punto del programa, dependiendo de una condición
Sinopsis
on a goto foo,bar,baz
  …
label foo
  …
label bar
  …
label baz
  …
Descripción
La sentencia on goto usa un argumento numérico (ubicado entre on y goto) para seleccionar un elemento de una lista de etiquetas que viene a continuación de la palabra clave goto: si el número es 1, la ejecución continua en la primera etiqueta; si es 2, en la segunda, etc. Si el número es cero o menor, el programa continua en la posición indicada por la primera etiqueta; si es mayor que el total de etiquetas, la ejecución continua en la posición de la última etiqueta.
El comando on goto se suele considerar obsoleto.
Ejemplo
label over
print "Por favor, seleccione una de estas opciones: "
print
print "  1 -- muestra tiempo"
print "  2 -- muestra fecha"
print "  3 -- abandona"
print
input "Su seleccion " a
on a goto over,show_time,show_date,terminate,over

label show_time
  print time$()
goto over

label show_date
  print date$()
goto over

label terminate
exit
          
Nótese que una entrada inválida (menor que 1 o mayor que 3) es automáticamente detectada.
Ver también
goto, on gosub/function>

Nombre
on interrupt — cambia el comportamiento ante una interrupción por teclado
Sinopsis
on interrupt break
…
on interrupt continue
Descripción
El comando on interrupt cambia la forma en que Yabasic reacciona ante una interrupción por teclado. El comportamiento por defecto de Yabasic ante la pulsación de la combinación de teclas ctrl-C es que se producirá una interrupción en la ejecución del programa y la emisión de un mensaje de error. Sin embargo puede deshabilitarse la interrupción por teclado mediante on interrupt continue, por ejemplo, cuando nuestro programa esté realizando una tarea crítica y no deseemos que pueda interrumpirse (actualización de ficheros, etc.). Si se desea restaurar el comportamiento por defecto se usará la instrucción on interrupt break.
Ejemplo
print "Por favor, espere mientras se escribe un fichero con datos aleatorios ..."
on interrupt continue
open "random.data" for writing as #1
for a=1 to 100
  print #1 ran(100)
  print a," por ciento realizado."
  sleep 1
next a
close #1
on interrupt continue
          
Este programa escribe un fichero con 100 números aleatorios. El comando on interrupt continue asegura que el programa no podrá interrumpirse por teclado y que el fichero será escrito en cualquier caso. El comando sleep ralentiza la operación para dar tiempo al usuario a intentar pararlo con ctrl-C.
Ver también
No existen comandos relacionados.

Nombre
open — abre un fichero
Sinopsis
open a,"file","r"
open #a,"file","w"
open #a,printer
open "file" for reading as a
open "file" for writing as #a
a=open("file")
a=open("file","r")
if (open(a,"file")) …
if (open(a,"file","w")) …
Descripción
El comando open abre un fichero para lectura o escritura, o una impresora para imprimir texto. open posee un gran número de formas. Requiere los siguientes argumentos:
número-de-fichero
En la sinopsis está representado por a o #a. En Yabasic cada fichero está asociado con un número entre 1 y un valor máximo que depende del sistema operativo. Por razones históricas el número de fichero puede precederse por un signo de almohadilla ('#'). Nótese que la especificación de un número de fichero es opcional, ya que, si se omite, la función open puede devolver un número de fichero que es entonces almacenado en una variable para su posterior referencia. Este número de fichero puede ser un número o una expresión aritmética compleja arbitraria, en cuyo caso serán necesarios paréntesis para evitar que Yabasic se confunda.
nombre-de-fichero
En la sinopsis está representada por "file". Esta cadena especifica el nombre del fichero a abrir.
modo-de-acceso
En la sinopsis se representa por "r", "w", for reading o for writing. Esta cadena o cláusula especifica el modo en que se abre el fichero, que puede ser: 
"r" 
Abre el fichero para lectura (también puede escribirse como for reading). Si el fichero no existe el comando fallará. Este es el modo por defecto; es decir, si no se especifica otro modo, el fichero se abrirá en este.
"w" 
Abre el fichero para escritura (también puede escribirse como for writing). Si el fichero no existe se creará.
"a" 
Abre el fichero para añadir; es decir, lo que se escriba en el fichero se añadirá al final de lo ya existente.
"b" 
Esta letra no puede aparecer sola, sino que debe ir combinada con otras letras (por ejemplo, "rb") para abrir un fichero en modo binario (en oposición al modo texto).
Como puede verse en la sinopsis, el comando open puede ser llamado como un comando (sin paréntesis) o como una función (con paréntesis). Si es llamado como una función, devuelve el número de fichero; o cero, si la operación falla. Por tanto la función open puede usarse dentro de la condición de una sentencia if.
Si el comando open falla, puede usarse peek("error") para averiguar la naturaleza exacta del error.
Otro uso del comando open es cambiando el nombre del fichero por printer, con lo que se abre una impresora para imprimir texto. Con esto, todo texto (y sólo texto) que se imprima en este fichero virtual aparecerá en la impresora. Nótese que es muy diferente la forma de imprimir gráficos (ver open printer).
Finalmente, lea la descripción para peek("error") a fin de informarse de los errores producidos al ejecutar la llamada a open.
Ejemplo
open "foo.bar" for writing as #1
print #1 "Hola !"
close #1
if (not open(1,"foo.bar")) error "No se pudo abrir 'foo.bar' para lectura"
while(not eof(1)) 
  line input #1 a$
  print a$
wend
          
Este ejemplo símplemente abre el fichero foo.bar, escribe una única línea, lo reabre y lee otra vez su contenido.
Ver también
close, print, peek, peek("error") y open printer

Nombre
open printer — abre la impresora para imprimir gráficos
Sinopsis
open printer
open printer "file"
Descripción
El comando open printer abre una impresora para imprimir gráficos. Requiere que se halla abierto antes una ventana gráfica. Cada vez que se dibuje en la pantalla se imprimirá en la impresora también.
Se iniciará la impresión en una nueva página con el comando clear window; la página final (o única) aparecerá después de ejecutar el comando close printer.
Nótese que se puede especificar un nombre de fichero con open printer; en este caso la impresión se enviará al fichero en vez de a la impresora. El programa o el usuario serán los responsables de enviar posteriormente este fichero a la impresora.
Si se usa Unix, podría necesitar una impresora postscript (ya que Yabasic produce una salida postscript). Alternativamente puede usarse ghostscript para transformar el fichero postscript a una forma manejable por la impresora; pero eso va más allá de la responsabilidad de Yabasic.
Ejemplo
open window 200,200
open printer
line 0,0 to 200,200
text 100,100,"Hola"
close window
close printer
          
Este ejemplo abre una ventana, dibuja una línea y muestra un texto; todo lo que aparece en pantalla se imprime también.
Ver también
close printer

Nombre
open window — abre una ventana gráfica
Sinopsis
open window x,y
open window x,y,"font"
Descripción
El comando open window abre una ventana del tamaño indicado. Sólo puede abrirse una ventana al mismo tiempo.
Un tercer argumento opcional especifica una fuente a ser usada por el texto que se muestre en la ventana. Esta fuente puede ser cambiada con el comando text. 
Ejemplo
for a=200 to 400 step 10
  open window a,a
  for b=0 to a
    line 0,b to a,b
    line b,0 to b,a
  sleep 0.1
  close window
next a
          
Ver también
close window, text

Nombre
or — o lógico, usado en expresiones condicionales
Sinopsis
if (a or b) …
while (a or b) …
Descripción
Usada en condiciones (por ejemplo en if o while) para unir dos expresiones. Devuelve true, si alguno de los argumentos (o ambos) es true; en otro caso devuelve false.
Ejemplo
input "Por favor, introduzca un numero "
if (a>9 or a<1) print "a no esta entre 1 y 9"
          
Ver también
and,not

Nombre
or() —  o aritmético, usado en operaciones a nivel de bit
Sinopsis
x=or(a,b)
Descripción
Se usa para procesar la condición or de dos argumentos a nivel de bit. Ambos argumentos son tratados como números binarios (es decir, como series de 0 y 1); un bit del resultado será 1 si cualquiera de los correspondientes bits de ambos argumentos es 1.
Nótese que ambos argumentos son convertidos a valores enteros; y que los números negativos tienen su propia representación binaria y puede llevar a resultados inesperados al realizar esta operación or.
Ejemplo
print or(14,3)
          
Esto imprimirá 15. Este resultado es evidente si considera que la representación binaria de 14 y 3 son 1110 y 0011, respectivamente; lo cual dará como resultado 1111 en representación binaria; o sea, 15 en decimal.
Ver también
oand, eor y not

Nombre
pause — realiza una pausa durante el número de segundos especificado
Sinopsis
pause 5
Descripción
El comando pause tiene otros nombres: pause, sleep o wait , que pueden usarse indistintamente.
El comando pause simplemente espera el número de segundos especificado. Este número puede ser fraccional, con lo que se puede esperar menos de un segundo. El intervalo mínimo que puede esperar depende del sistema operativo usado (Unix, Windows).
El comando pause no puede ser interrumpido. Si se requiere una pausa que pueda ser interrumpida pulsando una tecla o un botón del ratón, es mejor usar la función inkey$, con un argumento que indique el tiempo máximo de espera.
Ejemplo
deg=0
do
  maxx=44+40*sin(deg)
  for x=1 to maxx
    print "*";
  next x
  pause 0.1+(maxx*maxx/(4*84*84))
  print
  deg=deg+0.1
loop
          
Este ejemplo dibuja una curva sinusoidal; gracias a la sentencia pause la velocidad de dibujado varia de la misma forma en que variaría la velocidad de una pelota que rodara por esta curva sujeta a la influencia de la gravedad.
Ver también
sleep, wait

Nombre
peek — recupera varias informaciones internas
Sinopsis
print peek("foo")
a=peek(#1)
Descripción
La función peek tiene muchos usos diferentes y no relacionados en su mayoría. Es una especie de cajón de sastre para recuperar todo tipo de información interna (numérica) de Yabasic. El significado de los números devueltos por la función peek depende de la cadena o número pasado como argumento.
peek siempre devuelve un número, que puede ser usado para recuperar información en modo cadena de caracteres sobre estados internos de Yabasic. Por último, señalar que algunos de los valores devueltos por la función peek pueden ser cambiados usando la función poke.
Existen dos variantes de la función peek: una que espera un número entero positivo y que es descrito en la primera entrada listada más abajo. La otra variante espera un conjunto bien definido de cadenas, como se describe en las demás entradas de la lista siguiente.
peek(a), peek(#a) 
Lee un caracter desde el fichero a (que, por supuesto, debe estar abierto).
peek("winheight") 
Devuelve la altura en píxeles de la ventana gráfica. Si no hay ninguna ventana abierta, devuelve la altura de la última ventana abierta; o 100, si aún no se ha abierto ninguna.
peek("winwidth") 
Devuelve el ancho en píxeles de la ventana gráfica. Si no hay ninguna ventana abierta, devuelve la anchura de la última ventana abierta; o 100, si aún no se ha abierto ninguna.
peek("fontheight") 
Devuelve la altura de la fuente usada en la ventana gráfica. Si no hay ninguna abierta, devuelve la altura de la última fuente usada; o 10, si aún no se ha abierto ninguna.
peek("screenheight") 
Devuelve la altura en caracteres de la ventana de consola donde se ejecuta Yabasic. Si no se ha llamado aún a clear screen, devuelve 0, independientemente del tamaño del terminal.
peek("screenwidth") 
Devuelve la anchura en caracteres de la ventana de consola donde se ejecuta Yabasic. Si no se ha llamado aún a clear screen, devuelve 0, independientemente del tamaño del terminal.
peek("argument") 
Devuelve el número de argumentos que se han pasado al programa. Por ejemplo: si se realiza la siguiente llamada: yabasic foo.yab bar baz, entonces peek("argument") devolverá 2. Esto es porque foo.yab se trata como el nombre del programa a ejecutar, mientras que bar y baz son considerados como los argumentos del programa pasados en la línea de comandos. Nótese que para los usuarios de Windows, al hacer click sobre el icono (en contraposición a invocar el programa desde la línea de comandos), se devolverá 0.
La función peek("argument") también puede escribirse como peek("arguments").
Puede usarse la función relacionada peek$("argument") para obtener los argumentos. Nótese que cada llamada a peek$("argument") reduce el número devuelto por peek("argument").
peek("isbound") 
Devuelve true, si el programa Yabasic ejecutado es parte de un programa independiente; véase la sección sobre crear un programa independiente para más detalles.
peek("version") 
Devuelve el número de versión de Yabasic (en la actualidad, 2.763).
peek("error") 
Devuelve un número que especifica la naturaleza del último error en una sentencia open o seek. Normalmente, un error en una sentencia open finaliza inmediatamente el programa con el correspondiente mensaje de error. Sin embargo, si se usa open en una condición (por ejemplo: if (open(#1,"foo")) …) el resultado (exitoso o fallido) de la operación open determinará si la condición se evalua como true o false. Ahora, si una operación falla el programa no finaliza y puede investigarse la razón del fallo. Esta causa es devuelta mediante peek("error") (como un número) o peek$("error") (como una cadena de caracteres).
La siguiente tabla muestra los diferentes códigos de error; el resultado de peek$("error") detalla la naturaleza del error. Nótese que los códigos 10,11 y 12 se refieren al comando seek.
Tabla 6.1. Códigos de error
peek("error")	peek$("error")	Explanation	
2	Stream already in use	Se está intentando abrir un fichero con un número de fichero actualmente en uso. Ciérrelo primero con close.	
3	'x' is not a valid filemode	El argumento de modo de fichero en la función open no es válido.	
4	could not open 'foo'	La función open falló por un motivo no determinado.	
5	reached maximum number of open files	Se ha alcanzado el máximo número de ficheros abiertos permitido por el sistema operativo.	
6	cannot open printer: already printing graphics	Se han usado al mismo tiempo los comandos open printer y open #1,printer para abrir una impresora (véanse las descripciones de estos comandos para entender la diferencia). No pueden usarse los dos al mismo tiempo.	
7	could not open line printer	No se ha podido abrir la impresora por un motivo no determinado.	
9	invalid stream number	Se ha intentado usar un número de canal no válido (por ejemplo, negativo); ejemplo: open(-1,"foo")	
10	could not position stream x to byte y	seek no ha podido situarse en la posición indicada.	
11	stream x not open	Se ha intentado usar seek en un canal no abierto.	
12	seek mode 'x' is none of begin,end,here	El argumento pasado a seek no es válido.	
Ejemplo
open "foo" for reading as #1
open "bar" for writing as #2
while(not eof(#1))
  poke #2,chr$(peek(#1));
wend
          
Este programa copia byte a byte el fichero foo en el fichero bar.
Ver también
peek$, poke, open

Nombre
peek$ — devuelve varias informaciones internas en forma de cadena de caracteres 
Sinopsis
print peek$("foo")
Descripción
La función peek$ tiene diferentes usos no relacionados. Es una especie de cajón de sastre que devuelve información interna de Yabasic en forma alfanumérica; la naturaleza exacta de las cadenas devueltas por la función peek$ depende de la cadena pasada como argumento.
peek$ siempre devuelve una cadena de caracteres, aunque existe una función relacionada ( peek ), que devuleve información en forma numérica. Finalmente, nótese que algunos valores devueltos por peek$ pueden ser cambiados mediante la función poke.
La siguiente lista muestra todos los posibles argumentos de peek$:
peek$("infolevel") 
Devuelve "debug", "note", "warning", "error" o "fatal", dependiendo del nivel de información vigente. Este valor puede ser especificado con una opción (tanto en windows como en unix) en la línea de comando, o cambiada durante la ejecución del programa con el correspondiente poke. Su valor por defecto es "warning".
peek$("textalign") 
Devuelve una de nueve posibles cadenas, especificando la alineación por defecto del texto en la ventana gráfica. La cadena de alineación devuelta por este peek describe cómo el comando text alinea sus argumentos de cadena con respecto a las coordenadas suministradas. Sin embargo, este valor no se aplica si el comando de texto especifica explícitamente una alineación. Cada una de estas cadenas tiene dos caracteres de longitud. El primer caracter especifica la alineación horizontal y puede ser l, r o c, que significa left, right o center (izquierda, derecha o centro). El segundo caracter especifica la alineación vertical y puede ser t, b o c, que significa top, bottom o center (arriba, abajo o centro) respectivamente.
Puede cambiarse este valor con el correspondiente comando poke "textalign",…; el valor inicial es lb (izquierda y abajo).
peek$("windoworigin") 
Este peek devuelve una cadena de dos caracteres, que especifica la posición del origen del sistema de coordenadas de la ventana gráfica. Esta cadena puede ser cambiada con el correspondiente comando poke "windoworigin",x,y o especificado como argumento del comando origin.
peek$("error") 
Devuelve una cadena que describe la naturaleza del último error producido en una sentencia open o seek. Véase peek("error") para una descripción detallada.
peek$("library") 
Devuelve el nombre de la librería donde se encuentre esta sentencia.
peek$("os") 
Devuelve el nombre del sistema operativo. Puede ser windows o unix.
peek$("font") 
Devuelve el nombre de la fuente que se usa para los textos en la ventana gráfica. Este valor puede especificarse como tercer argumento del comando open window.
peek$("env","NAME") 
Devuelve la variable de entorno especificada por NAME (que puede ser cualquier expresión de cadena). Los tipos de variable de entorno existentes dependen del sistema, así como su significado; sin embargo, escribiendo env en la línea de comandos puede producir una lista. Nótese que peek$("env",...) puede escribirse también como peek$("environment",...).
peek$("argument") 
Devuelve uno de los argumentos que se han pasado a Yabasic al invocar el programa (la segunda vez que se llame a este comando devolverá el segundo argumento, y así). Por ejemplo, si se ha llamado a Yabasic así: yabasic foo.yab bar baz, entonces la primera llamada a peek$("argument") devolverá bar. Esto es debido a que foo.yab es considerado como el nombre del programa a ejecutar, donde bar y baz serían los argumentos del programa pasados en la línea de comandos. La segunda llamada a peek$("argument") devolverá baz. Los usuarios de Windows deben tener en cuenta que al ejecutar un programa haciendo click en su icono, este peek devolverá una cadena vacía.
Nótese que peek$("argument") puede ser escrito como peek$("arguments").
Véase también la función peek("argument").
Ejemplo
print "Usted ha suministrado estos argumentos: "
while(peek("argument"))
  print peek("argument"),peek$("argument")
wend
          
Si se guarda este programa en un fichero foo.yab y se ejecuta via yabasic foo.yab a b c (los usuarios de Windows deberán usar la línea de comandos para esto), se obtendrá la siguiente salida:
3a
2b
1c
Ver también
peek, poke, open

Nombre
pi — una constante con el valor 3.14159
Sinopsis
print pi
Descripción
pi es 3.14159265359 (al menos para Yabasic).
Ejemplo
for a=0 to 180
  print "El seno de ",a," grados es ",sin(a*pi/180)
next a
          
Este programa usa pi para transformar un ángulo de grados a radianes.
Ver también
euler

Nombre
poke — cambia información interna de Yabasic
Sinopsis
poke "foo","bar"
poke "foo",baz
poke #a,"bar"
poke #a,baz
Descripción
El comando poke se usa para cambiar algunos detalles de comportamiento de Yabasic. Al igual que las función relacionada peek, poke se usa para varias cosas dependiendo del argumento suministrado.
Estas son las diferentes funcionalidades de poke:
poke "textalign","cc" 
Este poke cambia la alineación de texto por defecto respecto a las coordenadas suministradas con el comando text. Sin embargo, este valor no se aplica si el comando text especifica explícitamente un alineamiento. El segundo argumento ("cc" en el ejemplo) siempre tiene dos caracteres de longitud; el primer caracter puede ser l (left = izquierda), r (right = derecha) o c (center = centro); el segundo caracter puede ser t (top = arriba), b (bottom = abajo) o c (center = centro); véase peek$("textalign") para una descripción detallada de este argumento.
poke "windoworigin","lt" 
Este poke mueve el origen del sistema de coordenadas de la ventana gráfica a la posición especificada. El segundo argumento ("lt" en el ejemplo) debe ser de dos caracteres de longitud: el primer caracter debe ser l (left = izquierda), r (right = derecha) o c (center = centro); el segundo caracter debe ser t (top = arriba), b (bottom = abajo) o c (center = centro). Juntos, estos dos caracteres especifican la nueva posición del origen de coordenadas. Véase peek$("windoworigin") para una descripción más profunda de este argumento.
poke "infolevel","debug" 
Cambia la cantidad de información interna que muestra Yabasic durante su ejecución.
El segundo argumento puede ser "debug", "note", "warning", "error" o "fatal". El valor por defecto es "warning".
Véase tambien peek$("infolevel").
poke #1,a 
Escribe un byte (a en el ejemplo) en el canal especificado (#1 en el ejemplo).
Véase también la función peek(#1).
Ejemplo
print "Hola, ahora puede ver cuanto trabajo "
print "implica un simple bucle for ..."
input "Por favor, pulse return " a$
poke "infolevel","debug"
for a=1 to 10:next a
          
Este ejemplo sólo demuestra uno de los muchos usos de poke, de los descritos anteriormente: el programa cambia el nivel de información a debug, que hace que Yabasic produzca una cantidad de mensajes de depuración durante el siguiente bucle for.
Ver también
peek, peek$

Nombre
print — Escribe en el terminal o en un fichero
Sinopsis
print "foo",a$,b
print "foo","a$,b;
print #a "foo",a$
print #a "foo",a$;
print foo using "##.###"
print reverse "foo"
print at(10,10) a$,b
print @(10,10) a$,b
print color("red","blue") a$,b
print color("magenta") a$,b
print color("green","yellow") at(5,5) a$,b
Descripción
La sentencia print imprime números o cadenas de caracteres por el terminal (también conocido como consola) o en un fichero abierto.
Los distintos usos de la sentencia print son los siguientes:
print "foo",a$,b 
Imprime la cadena foo así como el contenido de las variables a$ y b en la pantalla, añadiendo un salto de línea.
print "foo",a$,b; 
(¡nótese el punto y coma final!) Esta sentencia es la misma que la anterior, solo que se elimina el salto de línea automático, con lo que la siguiente sentencia print imprimirá pegado al resultado de la actual.
print #a "foo",a$ 
Esta es la forma de escribir en un fichero. El fichero con el número a debe estar abierto previamente, y añade implícitamente un salto de línea. Nótese que el número de fichero #a, empieza con una cruceta ('#') y está separado del resto de la sentencia por un espacio en blanco. El número de fichero (contenido en la variable a) puede haber sido obtenido previamente por una sentencia open (por ejemplo,  a=open("bar")).
print #a "foo",a$; 
Lo mismo que lo anterior, pero sin el salto de línea implícito.
print foo using "##.###" 
Imprime el número foo con tantos dígitos anteriores y posteriores al punto decimal como indiquen los signos '#'. Véase las entradas para using y str$ para una descripción más detallada de este formato.
print reverse "foo" 
Como todas las variantes de print que vienen a continuación, esta forma de la sentencia print sólo puede ser usada después de llamar a clear screen. Los números y cadenas posteriores a la cláusula reverse se imprimirán en color inverso.
print at(10,10) a$,b 
Imprime en la posición especificada. Sólo puede usarse después de llamar a clear screen. Pueden usarse peek$("screenwidth") o peek$("screenheight") para averiguar el tamaño actual de la pantalla. Puede añadirse un punto y coma para suprimir el salto de línea implícito.
print @(10,10) a$,b 
Esta forma es exactamente igual que la anterior, pero, en vez de usar at, se escribe @.
print color("red","blue") a$,b 
Imprime con los colores de tinta ("red") y fondo ("blue") especificados. Los posibles valores son "black", "white", "red", "blue", "green", "yellow", "cyan" o "magenta". Una vez más, se necesita llamar previamente a clear screen, y añadir un punto y coma para suprimir el salto de línea implícito.
print color("magenta") a$,b 
Se especifica sólamente el color de tinta.
print color("green","yellow") at(5,5) a$,b 
Se especifica al mismo tiempo el color y la posición.
Ejemplo
clear screen
columns=peek("screenwidth")
lines=peek("screenheight")
dim col$(7)
for a=0 to 7:read col$(a):next a
data "black","white","red","blue","green","yellow","cyan","magenta"

for a=0 to 2*pi step 0.1
  print colour(col$(mod(i,8))) at(columns*(0.8*sin(a)+0.9)/2,lines*(0.8*cos(a)+0.9)/2) "*"
  i=i+1
next a
          
Este ejempo dibuja una elipse coloreada en la consola de texto.
Ver también
at, print color, input, clear screen, using, ;

Nombre
print colour — ver color
Sinopsis
print colour(fore$) text$
print colour(fore$,back$) text$
Ver también
color

Nombre
putbit — dibuja un rectángulo de pixeles codificados dentro de una cadena en la ventana gráfica
Sinopsis
open window 200,200
…
a$=getbit(20,20,50,50)
…
putbit a$,30,30
putbit a$ to 30,30
putbit a$,30,30,"transparent"
Descripción
El comando putbit es la contraparte de la función getbit. putbit requiere una cadena devuelta por la función getbit. La cadena almacenará el contenido de un rectángulo de la ventana gráfica.
Nótese que el comando putbit acepta un tercer argumento que indica cómo ha de volcarse el contenido de dicha cadena en pantalla.
Ejemplo

c$="rgb 21,21:0000000000000000000000000000000000000000000000000000000000000032c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c8c8ff000032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

open window 200,200

do
  x=ran(220)-10
  y=ran(220)-10
  putbit c$,x,y,"transparent"
loop
          
Este programa usa una cadena predefinida (conteniendo la imagen de un círculo azul con un centro amarillo) y la dibuja repetidamente en la ventana gráfica. El modo "transparent" asegura que no se borren los pixels.
Hay dos posibles valores para el tercer argumento de putbit. Ambos modos difieren en la forma que se reemplaza (o no) cualquier pixel de la ventana con los pixeles de la imagen que tengan el color de fondo.
transparent o t 
Con este modo los pixeles de la ventana permanecen inalterados si la imagen contiene pixeles con el color de fondo; es decir, la imagen tendría partes transparentes
solid o s 
Con este modo los pixeles de la ventana son sobreimpresos con los pixeles de la imagen; es decir, la imagen se tratará como un todo sólido
Si se omite este argumento, se aplica el modo transparent por defecto.
Ver también
getbit$, open window

Nombre
putscreen — dibuja un rectángulo de caracteres en el terminal de texto
Sinopsis
clear screen
…
a$=getscreen$(5,5,10,10)
…
putscreen a$,7,7
Descripción
El comando putscreen es la contraparte de la función getscreen$. putscreen requiere una cadena devuelta por la función getscreen. 
Nótese que ha de llamarse antes a clear screen.
Ejemplo
clear screen
for a=1 to 200
  print color("red") "Hola !"; 
  print color("blue") "Mundo !";
next a
r$=getscreen$(0,0,20,20)
for x=0 to 60
  putscreen r$,x,0
  sleep 0.1
next x
          
Este ejemplo imprime la cadena "Hola !Mundo !" por toda la pantalla y luego mueve un rectángulo de un lado a otro.
Ver también
getscreen$, clear screen

Nombre
ran() — devuelve un número aleatorio
Sinopsis
print ran()
x=ran(y)
Descripción
La función ran devuelve un número aleatorio. Si no se suministra un argumento, el número retornado se encontrará en el rango entre 0 y 1, donde no se puede alcanzar nunca el valor exacto de 1 (aunque sí el de 0). Si se suministra un argumento, el número devuelto estará en el rango entre 0 y dicho argumento (que no será nunca alcanzado).
Ejemplo
clear screen
c=peek("screenwidth")-1
l=peek("screenheight")

dim col$(8)
for a=0 to 7:read col$(a):next a
data "black","white","red","blue","green","yellow","cyan","magenta"

do
  x=ran(c)
  y=l-ran(l*exp(-32*((x/c-1/2)**2)))
  i=i+1
  print color(col$(mod(i,8))) at(x,y) "*";
loop
          
Este ejemplo imprime una colorida curva en forma de campana.
Ver también
int

Nombre
read — lee datos desde una sentencia data
Sinopsis
read a$,a
…
data "Hello !",7
Descripción
La sentencia read recupera datos literales que han sido almacenados en sentencias data en otra parte del programa.
Ejemplo
read num
dim col$(num)
for a=1 to num:read col$(a):next a
clear screen
print "Estos son los colores conocidos por Yabasic:\n"
for a=1 to num
  print colour(col$(a)) col$(a)
next a

data 8,"black","white","red","blue"
data "green","yellow","cyan","magenta"
          
Este programa imprime los nombres de los colores conocidos por Yabasic.
Ver también
data, restore

Nombre
rectangle — dibuja un rectángulo
Sinopsis
open window 100,100
rectangle 10,10 to 90,90
rectangle 20,20,80,80
rect 20,20,80,80
box 30,30,70,70
clear rectangle 30,30,70,70
fill rectangle 40,40,60,60
clear fill rectangle 60,60,40,40
Descripción
El comando rectangle (también conocido como box o rect, de forma abreviada) dibuja un rectángulo. Este acepta cuatro parámetros: las coordenadas x e y de las dos esquinas opuestas del rectángulo. Con las cláusulas opcionales clear y fill (las cuales pueden aparecer ambas y en cualquier orden) el rectángulo puede ser borrado o rellenado, respectivamente.
Ejemplo
open window 200,200
c=1
do 
  for phi=0 to pi step 0.1
    if (c) then 
      rectangle 100+100*sin(phi),100+100*cos(phi) to 100-100*sin(phi),100-100*cos(phi)
    else 
      clear rectangle 100+100*sin(phi),100+100*cos(phi) to 100-100*sin(phi),100-100*cos(phi)
    endif
    sleep 0.1
  next phi
  c=not c
loop
          
Este ejemplo dibuja un bonito patrón animado.
Ver también
open window, open printer, line, circle, triangle

Nombre
redim — crea una matriz antes de su primer uso. Es un sinónimo de dim
Sinopsis
Ver el comando dim.
Descripción
El comando redim actua exactamente igual que el comando dim, ya que es un sinónimo. redim ha existido en versiones angituas de BASIC durante muchos años, debido a lo cual se incluye por razones de compatibilidad.
Para más información véase el comando dim.

Nombre
rem — comienza un comentario
Sinopsis
rem  Hey, esto es un comentario
#    esto también es un comentario
//   al igual que esto
print "No es un comentario" #    Esto es erróneo !!
print "No es un comentario"://   Pero esto sí es un comentario valido
print "No es un comentario" //   al igual que esto.
print "No es un comentario" rem  Y esto !
Descripción
rem introduce un comentario (igual que # o //), que se extiende hasta el final de la línea.
Estos comentarios no necesitan el símbilo dos puntos (':') delante de ellos. Todos ellos (rem, # y //) se comportan igual, excepto #,  que sólo puede aparecer al principio de una línea. Por lo tanto, el cuarto ejemplo de la sinopsis (print "No es un comentario" # Esto es erróneo !!) es de hecho un error.
Obsérvese que rem es una abreviación de remark (comentario). remark , sin embargo, no es un comando válido en Yabasic.
Nótese finalmente, que un comentario introducido con '#' tiene un significado especial en Unix (véase la entrada de # para más detalles).
Ejemplo
#
rem   los comentarios en una estructura de datos
#     son más útiles que
//    los comentarios en algoritmos.
rem
          
Ver también
#, //

Nombre
repeat — inicia un bucle repeat
Sinopsis
repeat 
  …
until (…)
Descripción
El bucle repeat ejecuta todas las sentencias existentes entre ese punto y el señalado por la palabra clave until una y otra vez. El bucle es ejecutado hasta que se cumple la condición especificada en la cláusula until. Por diseño, las sentencias incluidas en el bucle se ejecutan al menos una vez.
Ejemplo
x=0
clear screen
print "Este programa imprime los numeros entre 1 y 10"
repeat
  x=x+1
  print x
  print "Pulse una tecla para el siguiente numero, o 'q' para terminar"
  if (inkey$="q") break
until(x=10)
          
Este programa es bastante inútil, pero se explica por sí mismo.
Ver también
until, break, while, do

Nombre
restore — reposiciona el puntero a las data
Sinopsis
read a,b,c,d,e,f
restore
read g,h,i
restore foo
data 1,2,3
label foo
data 4,5,6
Descripción
El comando restore se usa para reiniciar la lectura de las sentencias data, de forma que la siguiente sentencia read leerá los datos desde la primera sentencia data.
Se puede especificar una etiqueta (label) con el comando restore; en cuyo caso, la siguiente sentencia read lee datos empezando desde la etiqueta indicada. Si se omite la etiqueta, la lectura de datos comenzará desde la primera sentencia data del programa.
Ejemplo
input "Que idioma (castellano/ingles) ? " l$
if (instr("castellano",l$)>0) then
  restore castellano
else
  restore ingles
endif

for a=1 to 3
  read x,x$
  print x,"=",x$
next a

label ingles
data 1,"one",2,"two",3,"three"
label castellano
data 1,"uno",2,"dos",3,"tres"
          
Este programa pide que se seleccione un idioma (inglés o castellano) y entonces imprime los números 1, 2 y 3 en su equivalente de texto, en el idioma elegido.
Ver también
read, data, label

Nombre
return — retorna desde una subrutina o a un gosub
Sinopsis
gosub foo
…
label foo
…
return

sub bar(baz)
  …
  return quertz
end sub
Descripción
La sentencia return tiene dos usos distintos (aunque relacionados). El uso probablemente más importante de return es devolver el control desde una subrutina hasta el punto del programa desde donde se pasó el control a dicha subrutina. Si la subrutina se declara para devolver un valor, la sentencia return debe acompañarse con una cadena de caracteres o un número, el cual constituye el valor devuelto por la subrutina.
Sin embargo, aunque la rutina debe devolver un valor, la instrucción return no tiene por qué llevar un valor, en cuyo caso la subrutina devolverá 0 o la cadena vacía (en función del tipo de la subrutina). Por otra parte, no dude en colocar múltiples return dentro de la subrutina, ya que es una buena manera de controlar el flujo de ejecución.
El segundo (aunque históricamente es el primero) uso de return es para retornar al último gosub ejecutado. En este caso, return no debe llevar un valor.
Ejemplo
do
  read a$
  if (a$="") then
    print
    end
  endif
  print mark$(a$)," ";
loop

data "El","veloz","zorro","marron","salta"
data "sobre","el","perezoso","perro",""

sub mark$(a$)
  if (instr(lower$(a$),"q")) return upper$(a$)
  return a$
end sub
          
Este ejemplo usa una subrutina mark$, que devuelve su argumento en mayúsculas si este contiene la letra "q", o, en otro caso, sin cambios. En el texto de prueba la palabra quick se devolverá en mayúsculas.
Véase gosub para un ejemplo de uso de return en dicho contexto.
Ver también
sub, gosub

Nombre
reverse — imprime en modo inverso (los colores de texto y fondo se intercambian)
Sinopsis
clear screen
…
print reverse "foo"
Descripción
reverse se usa para imprimir texto en color inverso. reverse no es un comando separado, sino que forma parte del comando print; debe ser incluido justo después de print y sólo puede usarse si se ha ejecutado previamente el comando clear screen.
Ejemplo
clear screen

print "1 ";
c=3
do
  prim=true
  for a=2 to sqrt(c)
    if (frac(c/a)=0) then
      prim=false
      break
    endif
  next a
  if (prim) then
    print
    print reverse c;
  else
    print c;
  endif
  print " ";
  c=c+1
loop
          
Este programa imprime números desde el 1 y marca cada número primo en color inverso.
Ver también
at, print color, print, clear screen

Nombre
right$() — devuelve (o cambia) la parte derecha de una cadena de caracteres
Sinopsis
print right$(a$,2)
right$(b$,2)="baz"
Descripción
La función right$ requiere dos argumentos (una cadena y un número) y devuelve una parte de la derecha de la cadena, cuya longitud se especifica con el segundo argumento. Por tanto, right$ simplemente devuelve el número requerido de caracteres de la parte derecha de la cadena suministrada.
Nótese que la función right$ puede asignarse, es decir, puede aparecer en el lado izquierdo de una asignación. De este modo es posible cambiar una parte de la variable usada en la función right$. Téngase en cuenta que la longitud de la cadena no puede cambiar, es decir, los caracteres pueden sobreescribirse, pero no añadirse.
Ejemplo
print "Por favor, introduzca una longitud en pulgadas o centimetros "
print "indicando 'in' o 'cm' tras el numero."
input "Longitud: " a$
if (right$(a$,2)="in") then
   length=val(a$)*2.56
elsif (right$(a$,2)="cm") then
   length=val(a$)
else
   error "Entrada no valida: "+a$
endif
          
Este programa permite al usuario introducir una longitud en una unidad de medida especificada (pulgadas o centímetros).
En este otro ejemplo se demuestra la capacidad para asignar a la función right$.
a$="Hola chicos."
print a$
right$(a$,7)="enanos."
print a$
Ver también
right$ y mid$

Nombre
rinstr() — busca la presencia de una cadena dentro de otra, empezando por el lado derecho de la misma
Sinopsis
pos=rinstr("Elvelozzorromarron","zorro")
pos=rinstr(a$,b$,x)
Descripción
La función rinstr acepta dos argumentos de cadena e intenta encontrar la segunda dentro de la primera. Sin embargo, a diferencia de instr, la función rinstr busca por la derecha (o la última) ocurrencia de la cadena, mientras que la función instr busca por la izquierda (o la primera) ocurrencia. En cualquier caso, la posición es indicada contando desde la izquierda.
Si se provee un tercer argumento numérico a esta función, la búsqueda empieza a partir de la posición indicada. Por lo tanto, rinstr("abcdeabcdeabcde","e",8) devolverá 5, ya que la búsqueda de una "e" empieza en la posición 8 y encuentra la primera en la posición 5.
Ejemplo
print rinstr("foofoofoobar","foo")
          
Este ejemplo imprimirá 7, puesto que busca por la parte derecha. Si en vez de usar esta función se escribiera
print instr("foofoofoobar","foo")
imprimiría 1.
Ver también
instr

Nombre
rtrim$() — elimina los espacios en blanco que se encuentren a la derecha de una cadena
Sinopsis
a$=rtrim$(b$)
Descripción
La función rtrim$ elimina los espacios en blanco de la parte derecha de una cadena y devuelve la cadena resultante.
Ejemplo
open 1,"foo"
dim lines$(100)
l=1
while(not eof(1))
  input #1 a$
  a$=rtrim$(a$)
  if (right$(line$,1)="\\") then
    line$=line$+" "+a$
  else
    lines$(l)=line$
    l=l+1
    line$=a$
  endif
end while
print "Leidas ",l," lineas"
          
Este ejemplo lee el fichero foo permitiendo que los continuadores de línea, marcados con \, aparezcan como el último caracter en una línea. Por conveniencia, se elmininan los espacios en blanco de la derecha de la línea con rtrim.
Ver también
ltrim$, trim$

Nombre
screen — con clear screen borra la ventana de texto
Sinopsis
clear screen
Descripción
La palabra clave screen aparece sólo como parte del comando clear screen. Por favor, véase este para una descripción.
Ver también
clear screen

Nombre
seek() — cambia la posición dentro de un fichero abierto
Sinopsis
open 1,"foo"
seek #1,q
seek #1,x,"begin"
seek #1,y,"end"
seek #1,z,"here"
Descripción
El comando seek cambia la posición, dentro de un fichero abierto, donde la siguiente sentencia input (o peek) leerá. Usualmente los ficheros se leen secuencialmente desde el principio hasta el final. Sin embargo, algunas veces se deseará leer a partir de una posición determinada y/o en sentido contrario. Para esto se utiliza el comando seek, que permite cambiar la posición donde se leerá la siguiente porción de información del fichero.
seek acepta dos o tres argumentos: el primero es el número del fichero abierto de donde se quiere leer; el segundo es la posición dentro del fichero desde donde se quiere empezar a leer; el tercer argumento es opcional y especifica el punto desde donde el segundo argumento empezará a contar. Este último puede ser:
begin 
cuenta desde el principio del fichero.
end 
cuenta desde el final del fichero.
here 
cuenta desde la posición actual del fichero.
Ejemplo
open #1,"count.dat","w"
for a=1 to 10
  print #1,"00000000";
  if (a<10) print #1,";";
next a

dim count(10)
do
  x=int(ran(10))
  i=i+1
  if (mod(i,1000)=0) print ".";
  count(x)=count(x)+1
  curr$=right$("00000000"+str$(count(x)),8)
  seek #1,9*x,"begin"
  print #1,curr$;
loop
          
Este ejemplo incrementa aleatoriamente uno de diez contadores (en la matriz count()); sin embargo, el resultado siempre es mantenido en el fichero count.dat, por lo que incluso en el caso de una interrupción inesperada, el resultado no se perderá.
Ver también
tell, open, print, peek

Nombre
sig() — devuelve el signo de su argumento
Sinopsis
a=sig(b)
Descripción
Devuelve +1, -1 o 0, si el argumento es positivo, negativo o cero.
Ejemplo
clear screen
dim c$(3):c$(1)="red":c$(2)="white":c$(3)="green"
do
  num=ran(100)-50
  print color(c$(2+sig(num))) num
loop
          
Este programa imprime una secuencia infinita de números aleatorios. Los números positivos se imprimen en verde, los negativos en rojo, y los ceros se imprimen en blanco. 
Ver también
abs, int, frac

Nombre
sin() — devuelve el seno de su argumento
Sinopsis
y=sin(angle)
Descripción
La función sin recibe un ángulo en radianes (no en grados) y devuelve su seno.
Ejemplo
open window 200,200
new curve
for phi=0 to 2*pi step 0.1
  line to 100+90*sin(phi),100+90*cos(phi)
next phi
close curve
          
Este programa dibuja un círculo.
Ver también
asin, cos

Nombre
sleep — detiene la ejecución del programa el número de segundos especificado
Sinopsis
sleep 4
Descripción
El comando sleep tiene otros sinónimos: pause y wait. Para Yabasic son exactamente lo mismo.
Para más información véase la función pause.

Nombre
split() — divide una cadena en varias subcadenas
Sinopsis
dim w$(10)
…
num=split(a$,w$())
num=split(a$,w$(),s$)
Descripción
La función split requiere una cadena de caracteres (conteniendo el texto a dividir), una referencia a una matriz de caracteres (que recibirá las subcadenas resultantes, es decir, los tokens) y una cadena opcional (con un conjunto de caracteres que serán usados como delimitadores de las subcadenas).
La función split considera el primer argumento como una lista de tokens separados por delimitadores, y guarda la lista de tokens en la matriz referenciada. Nótese que la matriz que es pasada como referencia (w$() en la sinopsis), puede ser redimensionada en el proceso, ya que no puede saberse con antelación el número de tokens a extraer. El elemento de la posición cero (es decir, w$(0)) no se usa.
Si no se indica el tercer argumento (la lista de delimitadores) se considera como tales los espacios en blanco y los tabuladores. Si se indica la lista de delimitadores, los caracteres individuales contenidos en la cadena se tomarán cada uno de ellos como delimitadores. Por ejemplo, si se indica ":;" como tercer argumento, los dos puntos y el punto y coma se usarán como delimitadores de los tokens.
Obsérvese que, en el proceso de extraer los tokens, pueden producirse como resultado cadenas vacias. El mecanismo utilizado da como resultado que el número de tokens devueltos sea siempre uno más que el número de caracteres separadores contenidos en la cadena. Si no se desea este comportamiento, refiérase a la función relacionada token. En cierto modo, la función split se centra en los separadores (a diferencia de la función token, que se centra en las subcadenas).
El segundo argumento es una referencia a una matriz de cadenas donde se almacenarán los tokens. Esta matriz podrá expandirse (o reducirse) a fin de acomodarse al número de tokens extraidos.
El primer argumento contiene el texto del que se van a extraer los tokens. La función split devuelve el número de tokens encontrados.
Obsérvese el siguiente ejemplo para comprobar el comportamiento exacto de la función split y sus diferencias con la función token:
Ejemplo
print "Este programa le ayudara a entender como funciona "
print "exactamente la funcion split() y cual es su comportamiento"
print "en determinados casos especiales."
print
print " Por favor, introduzca una línea que contenga tokens separados"
print "por '=' o '-'"
dim t$(10)
do
  print 
  input "Por favor, introduzca una linea: " l$
  num=split(l$,t$(),"=-")
  print num," Tokens: ";
  for a=1 to num
    if (t$(a)="") then
      print "(VACIO)";
    else 
      print t$(a);
    endif
    if (a<num) print ","; 
  next a
  print
loop
          
Este programa imprime la siguiente salida:
Por favor, introduzca una linea: a
1 Tokens: a

Por favor, introduzca una linea:
0 Tokens:

Por favor, introduzca una linea: ab
1 Tokens: ab

Por favor, introduzca una linea: a=b
2 Tokens: a,b

Por favor, introduzca una linea: a-
2 Tokens: a,(VACIO)

Por favor, introduzca una linea: a-=
3 Tokens: a,(VACIO),(VACIO)

Por favor, introduzca una linea: =a-
3 Tokens: (VACIO),a,(VACIO)

Por favor, introduzca una linea: a=-b
3 Tokens: a,(VACIO),b

Por favor, introduzca una linea: a--b-
4 Tokens: a,(VACIO),b,(VACIO)

Por favor, introduzca una linea: -a==b-c==
7 Tokens: (VACIO),a,(VACIO),b,c,(VACIO),(VACIO)
Ver también
token

Nombre
sqr() — calcula el cuadrado de su argumento
Sinopsis
a=sqr(b)
Descripción
La función sqr calcula el cuadrado de su argumento numérico (o sea, que multiplica su argumento por sí mismo).
Ejemplo
for a=1 to 10
  print a,sqr(a),a**2
next a
          
Como se puede ver en el resultado, sqr puede escribirse también como **2 (o ^2).
Ver también
sqrt, **, ^

Nombre
sqrt() — calcula la raiz cuadrada de su argumento
Sinopsis
n = sqrt(m)
Descripción
La función sqrt calcula la raiz cuadrada de su argumento numérico.
Ejemplo
for a=1 to 5
  print a,sqrt(a),a**(1/2)
next a
          
Como puede verse en el resultado, sqrt puede escribirse también como **(1/2) (o ^(1/2)).
Ver también
sqr, **, ^

Nombre
static — preserva el valor de una variable entre llamadas a una subrutina
Sinopsis
sub foo()

  static a

  …

end sub 
Descripción
La palabra clave static se usa dentro de las subrutinas para marcar una variable como estática. Esto tiene dos consecuencias: primero, la variable será local a la subrutina; es decir, su valor no podrá ser conocido fuera de la subrutina (este es el efecto de la palabra clave local); segundo, la palabra clave static mantiene el valor de la variable entre las diversas llamadas a la subrutina (en esto se diferencia de la palabra clave local).
Ejemplo
foo()
foo()
foo()

sub foo()
  static a
  local b
  a=a+1
  b=b+1
  print a,b
end sub
          
Este programa muestra la diferencia entre variables del tipo static y local dentro de una subrutina, produciendo la siguiente salida:
1 1
2 1
3 1
La salida muestra que la variable estática a mantiene su valor entre llamadas a la subrutina, mientras que b es inicializada a 0 cada vez que se llama a la subrutina foo.
Ver también
sub, local

Nombre
step — especifica el incremento en un bucle for
Sinopsis
for a=1 to 10 step 3
  …
next a
Descripción
Especifica en cuánto se incrementará la variable de un bucle for en cada ciclo.
El paso (step), así como los límites inferior y superior, se calculan de nuevo en cada ciclo; no es lo común, pero sí posible, como se demuestra en el siguiente ejemplo.
Ejemplo
for x=1 to 1000 step y
  y=x+y
  print x," ",y," ";
next x
print
          
Este programa calcula los números de Fibonacci entre 1 y 1000.
Ver también
for

Nombre
str$() — convierte un número en una cadena
Sinopsis
a$=str$(a)
b$=str$(x,"##.###")
b$=str$(x,"###,###.##")
b$=str$(x,"###,###.##","_.")
Descripción
La función str$ acepta un argumento numérico y lo devuelve como una cadena de caracteres. Esta conversión entre número y cadena se puede controlar con un tercer argumento opcional (el argumento formato). Véase la siguiente tabla de ejemplos para averiguar los valores válidos de este argumento. Nótese que dichos ejemplos caen en una de dos categorías: estilo C y estilo BASIC; los primeros cuatro ejemplos en la tabla inferior son de estilo C, y el resto de ejemplos de estilo BASIC. Los formatos de estilo BASIC son mucho más simples, marcando los dígitos con '#'; grupos de dígitos (habitualmente tres) se separan con comas (','), y el punto decimal con '.'. Además, estos caracteres (coma y punto) pueden ser reemplazados por otros caracteres para satisfacer las necesidades de idiomas distintos del inglés.
Nótese que, por claridad, cada espacio en el resultado se ha reemplazado por la letra 'x'.
Table 6.2. Ejemplos del argumento de formato
Cadena de ejemplo	Resultado de la conversión de 1000*pi	Descripción	
%2.5f	3141.59265	El '2' determina la longitud mínima de la salida; pero, si es necesario, la salida puede ser más larga (como en el ejemplo). El '5' es el número de dígitos después del punto decimal.	
%12.5f	xx3141.59265	Se añaden dos espacios (que aparecen como 'x') para rellenar la salida a la longitud requerida de 12 caracteres.	
%012.5g	0000003141.6	Determina la precisión especificada para la totalidad del número de dígitos (antes y después del punto decimal).	
%-12.5f	3141.59265xx	El signo '-' especifica que la salida se centre hacia la izquierda (para ello los espacios de relleno aparecen a la derecha).	
#####.##	x3141.59	Cada '#' especifica un dígito (tanto antes como después del punto decimal), el '.' especifica la posición del punto decimal. Como 1000*pi no tiene suficientes dígitos, los 5 dígitos requeridos antes del punto se llenan con un espacio (que se muestra con una 'x').	
##,###.##	x3,141.59	Casi lo mismo que el anterior, pero la coma del formato aparece en el resultado.	
##,###.## y un argumento adicional de ".,"	x3.141,59	Similar al anterior, pero se intercambian los símbolos de punto decimal y coma de millar (sistema universal).	
##,###.## y un argumento adicional de "_,"	x3_141,59	Similar al anterior, pero usando otros símbolos para la coma de millar y el punto decimal.	
#####	x3142	La cadena de formato no incluye un punto, luego el resultado no muestra la parte decimal.	
##.###	##.###	Como 1000*pi tiene 4 dígitos delante del punto decimal y el formato sólo especifica 2, Yabasic no sabe qué hacer, por lo que sólo muestra la cadena de formato.	
Ejemplo
do
  input "Por favor, introduzca una cadena de formato: " f$
  a$=str$(1000*pi,f$)
  for a=1 to len(a$)
    if (mid$(a$,a,1)=" ") mid$(a$,a,1)="x"
  next a
  print a$
loop
          
Este es el programa usado para obtener los resultados mostrados en la anterior tabla.
Ver también
print, using

Nombre
sub — declara una subrutina definida por el usuario
Sinopsis
foo(2,"hello")

…

sub foo(bar,baz$)
  …
  return qux
  …
end sub
Descripción
La palabra clave sub comienza la definición de una subrutina definida por el usuario. Con el uso de subrutinas definidas por el usuario se puede extender Yabasic con comandos o funciones propias. Una subrutina acepta argumentos (números o cadenas) y devuelve un número o una cadena (sin embargo, no se requiere la asignación del valor devuelto a una variable).
El nombre de la subrutina se precede de la palabra clave sub. Si el nombre (en la sinopsis: foo) finaliza con '$', la subrutina debería devolver una cadena (con la sentencia return); en otro caso, devuelve un número.
Después del nombre de la subrutina, Yabasic requiere un par de paréntesis; dentro de estos paréntesis se especificará una lista de parámetros, cuyos valores pueden (aunque no necesariamente) incluirse cuando se llama a la subrutina. Si se omite uno de los parámetros al llamar a la subrutina, se asume que el valor es cero (para parámetros numéricos) o una cadena vacia (para parámetros de cadenas de caracteres). No obstante, puede averiguarse el número de argumentos pasados al llamar a la subrutina gracias a la variable especial numparams.
Los parámetros de una subrutina son siempre variables locales (véase la palabra clave local para mayor explicación).
Se puede regresar de una subrutina el cualquier momento con la palabra clave return. Junto con la palabra clave return puede especificarse el valor a retornar. Nótese que puede usarse más de una sentencia return dentro de la subrutina.
Finalmente, la palabra clave end sub finaliza la definición de la subrutina. Obsérvese que la definición de una subrutina no necesita aparecer dentro del programa antes de la primera llamada a la subrutina.
Nota
Los paréntesis tienen dos usos en Yabasic; a saber: para suministrar argumentos a una subrutina y también para indicar los índices de una matriz. Yabasic no puede distringuir entre una subrutina y una matriz con el mismo nombre. Por lo tanto, no se puede definir una subrutina con el mismo nombre de una matriz.
Ejemplo
p=2
do 
  if (is_prime(p)) print p
  p=p+1
loop

sub is_prime(a)
  local b
  for b=2 to sqrt(a)
    if (frac(a/b)=0) return false
  next b
  return true
end sub
          
Este programa no es la forma recomendada de calcular números primos. Sin embargo supone una bonita demostración del uso de una subrutina.
Ver también
local, static, peek

Nombre
switch — selecciona una de varias alternativas dependiendo de un valor
Sinopsis
switch a
  case 1
  case 2
  …
end switch

…

switch a$
  case "a"
  case "b"
end switch
Descripción
La sentencia switch selecciona una de varias secuencias de código dependiendo de una expresión numérica o de cadena. Es decir, toma una expresión (numérica o de cadena) y la compara con una serie de valores, cada una dentro de una cláusula case. Si la expresión se iguala al valor de una cláusula case dada, las secuencias siguientes se ejecutan.
La cláusula default permite especificar comandos que se ejecutarán si no existe ninguna cláusula case que coincida.
Nótese que varias cláusulas case pueden ser agrupadas (por ejemplo, case "a":case "b":case "c"). O dicho de otra forma: se necesita una sentencia break al final de una ramificación case, si no se desea que continue la ejecución por el siguiente case.
Ejemplo
input "Por favor, introduzca un unico digito: " n
switch n
  case 0:print "cero":break
  case 1:print "uno":break
  case 2:print "dos":break
  case 3:print "tres":break
  case 4:print "cuatro":break
  case 5:case 6: case 7:case 8:case 9
    print "Mucho!":break
  default:print "Hey! Hay mas de un digito!"
end switch 
          
Este ejemplo traduce un número en una cadena de texto. Obsérvese como los casos 5 a 9 están agrupados.
Ver también
switch, case, break

Nombre
system$() — lanza una orden al sistema operativo y devuelve su salida
Sinopsis
print system$("dir")
Descripción
El comando system$ acepta un argumento de cadena especificando un comando, que se envia para su ejecución al sistema operativo. Devuelve la salida de dicho comando como una cadena (a veces, de gran tamaño).
Ejemplo
input "Por favor, introduzca el nombre de un directorio: " d$
print
print "Este es el contenido de '"+d$+"':"
print system$("dir "+d$)
          
El ejemplo lista el contenido de un directorio, empleando el comando "dir".
Ver también
system

Nombre
system() — lanza una orden al sistema operativo y devuelve su código de retorno
Sinopsis
ret=system("foo")
system("bar")
Descripción
El comando system acepta un argumento de cadena, que especifica el comando a ejecutarse. La función devuelve el código de salida del comando (esta salida puede ser ignorada).
Ejemplo
print "Por favor, introduzca el nombre de un fichero a borrar."
input f$
if (system("rm "+f$+" >/dev/null 2>&1")) then
  print "Error!"
else
  print "O.K."
endif
          
Este programa es específico de Unix: usa el comando rm para borrar un fichero.
Ver también
system$

Nombre
tan() — devuelve la tangente de su argumento
Sinopsis
foo=tan(bar)
Descripción
La función tan calcula la tangente de su argumento, que ha de ser especificado en radianes.
Ejemplo
for a=0 to 45
  print tan(a*pi/180)
next a
          
Este ejemplo símplemente imprime la tangente de todos los ángulos entre 0 y 45 grados.
Ver también
atan, sin

Nombre
tell — obtiene la posición actual dentro de un fichero abierto
Sinopsis
open #1,"foo"
  …
position=tell(#1)
Descripción
La función tell requiere el número de un fichero abierto como argumento. Devuelve la posición (contado en bytes, empezando por el principio del fichero) donde comenzará la siguiente lectura.
Ejemplo
open #1,"foo","w"
print #1 "Hola mundo!"
close #1

open #1,"foo"
seek #1,0,"end"
print tell(#1)
close 1
          
Este ejemplo usa tell para obtener el tamaño del fichero. Con seek ubica el puntero del fichero al final del mismo, por lo que la llamada a tell devuelve la longitud total del fichero.
Ver también
tell, open

Nombre
text — escribe texto en la ventana gráfica
Sinopsis
text x,y,"foo"
text x,y,"foo","lb"
text x,y,"foo","cc","font"
text x,y,"foo","font","rt"
Descripción
El comando text muestra una cadena de texto (el tercer argumento) en la posición indicada (los primeros dos argumentos) en la ventana gráfica abierta. La fuente a ser utilizada se puede especificar opcionalmente como el cuarto o quinto argumento ("font" en el ejemplo anterior). Una fuente especificada por esta via se usará para cualquier subsecuente comando text, mientras no se especifique otra fuente.
El cuarto o quinto argumento opcional ("lb" en el ejemplo anterior) se usará para especificar la alineación del texto con respecto a la posición especificada. Este argumento siempre tiene dos caracteres de longitud: el primer caracter especifica la alineación horizontal y puede ser l, r o c, que indican left, right o center (izquierda, derecha o centro). El segundo caracter especifica la alineación vertical y puede ser t, b o c, que indican top, bottom o center (arriba, abajo o centro) respectivamente. Si se omite la alineación, esta será por defecto "lb"; sin embargo, esta alineación por defecto puede cambiarse con poke "textalign","xx"
Ejemplo
open window 500,200
clear screen
data "lt","lc","lb","ct","cc","cb","rt","rc","rb"
for a=1 to 9
  read align$	
  print "Alineacion: ",align$
  line 50*a-15,100,50*a+15,100
  line 50*a,85,50*a,115
  text 50*a,100,"Test",align$
  inkey$ 
next a
          
Este programa dibuja nueve cruces y escribe el mismo texto en cada una de ellas; sin embargo, se escribirá en cada una de las nueve alineaciones posibles, mostrando su efecto.
Ver también
open window, peek, poke

Nombre
then — distingue la forma larga de la forma corta de la sentencia if
Sinopsis
if (a<b) then
  …
endif
Descripción
La palabra clave then es parte de la sentencia if (véase la referencia de esta para más explicación). Sin embargo, no toda sentencia if requiere la palabra clave then: si la palabra clave then está presente, la cláusula if puede extenderse a más de una línea, y se requiere la palabra clave endif para indicar su final. Si la palabra clave then no está presente, la sentencia if se extiende hasta el final de la línea, y no debe usarse endif (de hacerlo daría un error).
Ejemplo
if (1<2) then 
  print "Hola ";
endif

if (2<3) print "mundo"
if (2<1)
  print "!"
          
Este ejemplo imprime Hola mundo. Nótese que no se imprime el signo de exclamación (!).
Ver también
if

Nombre
time$ — devuelve una cadena conteniendo la hora actual
Sinopsis
print time$
print time$()
Descripción
La función time$ devuelve la hora actual en cuatro campos separados por guiones '-'. Los campos son:
·	La hora actual en el rango de 0 a 23, completado con ceros (por ejemplo, 00 o 04) hasta una longitud de dos caracteres.
·	El número de minutos, completado con ceros.
·	El número de segundos, completado con ceros.
·	El número de segundos que han pasado desde que arrancó el programa. Este valor se incrementa mientras el programa se está ejecutando, y no se completa con ceros.
Nótese que los primeros tres campos devueltos por time$ tienen una longitud fija; por lo tanto es fácil extraer su contenido con, por ejemplo, la función mid$.
Ejemplo
print "Hola, son las ",time$
print "Un bucle vacio for-loop con diez millones de iteraciones toma ";
s=val(mid$(time$,10))
for a=1 to 10000000:next a
e=val(mid$(time$,10))
print e-s," segundos"
          
Este programa controla el tiempo consumido por un bucle for y usa los cuatro campos de la cadena devuelta por time$.
Ver también
date

Nombre
to — esta palabra aparece como parte de otras sentencias
Sinopsis
for a=1 to 100 step 2
  …
next a

line x,y to a,b
Descripción
La palabra clave to tiene dos usos:
·	dentro de sentencias for, para especificar el límite superior de un bucle.
·	dentro de cualquier comando gráfico que requiera dos puntos como argumentos (por ejemplo, line), una coma ',' puede ser reemplazada con la palabra clave to. Es decir, en vez de 100,100,200,200 puede escribirse 100,100 to 200,200.
Ejemplo
Véanse los ejemplos de los comandos relacionados listados en "Ver también".
Ver también
for, line, rectangle

Nombre
token() — divide una cadena en varias subcadenas
Sinopsis
dim w$(10)
…
num=token(a$,w$())
num=token(a$,w$(),s$)
Descripción
La función token acepta una cadena (conteniendo el texto a dividir), una referencia a una matriz de cadena (que recibirá las cadenas resultantes, es decir, los tokens) y una cadena opcional (con un conjunto de caracteres que servirán para discernir los límites de las subcadenas; es decir, los delimitadores).
La función token contempla su primer argumento como una lista de tokens separados por delimitadores y puede almacenar la lista de tokens en la matriz referenciada que se le suministra. Nótese, que la matriz, que es pasada como una referencia (w$() en la sinopsis), puede cambiar su tamaño de forma acorde, de manera que no necesita suministrarse el número de elementos que esta almacenará. El elemento en la posición cero (o sea, w$(0)) no se usa.
Normalmente (es decir, si se omite el tercer argumento) la función toma los caracteres de espacio en blanco y tabulador como delimitadores para los tokens. Sin embargo, suministrando el tercer argumento, se puede usar cualquier caracter como delimitador. Por ejemplo, si se le suministra ":;" como tercer argumento, entonces los caracteres de dos puntos (:) y punto y coma (;) se usarán como delimitadores de tokens.
Nótese que token no produce nunca tokens vacios si se da el caso de hallarse varios delimitadores seguidos. Véase la función relacionada split si no se comprende esta característica. En cierto modo, la función token se centra en los tokens, y no en los delimitadores (a diferencia de la función split, que se centra en los delimitadores).
El segundo argumento es una referencia a una matriz de cadena, en la que se almacenarán los tokens resultantes. Esta matriz puede expandirse (o contraerse) como sea necesario para poder almacenar todos los tokens.
Finalmente, el primer argumento contiene el texto a descomponer en tokens. La función token devuelve el número de tokens encontrados.
En el ejemplo siguiente se ejemplifica el comportamiento exacto de la función token y cómo se diferencia de la función split:
Ejemplo
print "Este programa le ayudara a comprender como trabaja exactamente"
print "la funcion token() y como se comporta en ciertos casos especiales."
print
print "Por favor, introduzca una linea conteniendo cadenas separadas "
print "mediante '=' o '-'"
dim t$(10)
do
  print 
  input "Por favor, introduzca una linea: " l$
  num=token(l$,t$(),"=-")
  print num," Tokens: ";
  for a=1 to num
    if (t$(a)="") then
      print "(VACIO)";
    else 
      print t$(a);
    endif
    if (a<num) print ","; 
  next a
  print
loop
          
Este programa imprime la siguiente salida: 

Por vafor, introduzca una linea: a
1 Tokens: a

Por vafor, introduzca una linea:
0 Tokens:

Por vafor, introduzca una linea: ab
1 Tokens: ab

Por vafor, introduzca una linea: a=b
2 Tokens: a,b

Por vafor, introduzca una linea: a-
1 Tokens: a

Por vafor, introduzca una linea: a-=
1 Tokens: a

Por vafor, introduzca una linea: =a-
1 Tokens: a

Por vafor, introduzca una linea: a=-b
2 Tokens: a,b

Por vafor, introduzca una linea: a--b-
2 Tokens: a,b

Por vafor, introduzca una linea: -a==b-c==
3 Tokens: a,b,c
Ver también
split

Nombre
triangle — dibuja un triángulo
Sinopsis
open window 100,100
triangle 100,100,50,50,100,50
fill triangle 50,100,100,50,200,200
clear fill triangle 20,20,10,10,200,200
Descripción
El comando triangle dibuja un triángulo. Requiere 6 parámetros: las coordenadas x e y de los tres puntos que conforman el triángulo. Con las palabras clave clear y fill (los cuales pueden aparecer al mismo tiempo y en cualquier orden) el triángulo puede ser borrado o rellenado, respectivamente.
Ejemplo
open window 200,200
do 
  phi=phi+0.2
  i=i+2
  color mod(i,255),mod(85+2*i,255),mod(170+3*i,255)
  dx=100*sin(phi):dy=20*cos(phi)
  fill triangle 100+20*sin(phi),100+20*cos(phi),100-20*sin(phi),100-20*cos(phi),100-80*cos(phi),100+80*sin(phi)
  sleep 0.1
loop
          
Este ejemplo dibuja coloridos triángulos hasta el hartazgo.
Ver también
open window, open printer, line, circle, rectangle

Nombre
trim$() — elimina los espacios al principio y al final de la cadena suministrada como argumento
Sinopsis
a$=trim$(b$)
Descripción
La función trim$ elimina todos los espacios en blanco a la izquierda y a la derecha de una cadena de caracteres y devuelve el resultado. Invocar trim$ es equivalente a ejecutar rtrim$(ltrim$()).
Ejemplo
do
  input "Continuar? Por favor, responda si o no: " a$
  a$=lower$(trim$(a$))
  if (len(a$)>0 and a$=left$("no",len(a$)) exit
loop
          
Este ejemplo pregunta por una respuesta (si o no) y elimina los espacios con trim$ para hacer la comparación con la cadena "no" más segura.
Ver también
ltrim$, rtrim$

Nombre
true — una constante con el valor de 1
Sinopsis
okay=true
Descripción
La constante true puede asignarse a variables que se usen luego en condiciones (por ejemplo, en una sentencia if).
true puede escribirse también como TRUE o, incluso, TrUe.
Ejemplo
input "Por favor, introduzca una cadena con todas las letras en mayusculas: " a$
if (is_upper(a$)) print "O.K."

sub is_upper(a$)
  if (a$=upper$(a$)) return true
  return false
end sub
          
Ver también
false

Nombre
until — finaliza un bucle repeat
Sinopsis
repeat 
  …
until (…)
Descripción
La palabra clave until finaliza un bucle que se ha introducido con la palabra clave repeat. until requiere una condición (o una expresión) entre paréntesis como argumento. El bucle continúa hasta (until) que la condición se evalua como cierta.
Ejemplo
c=1
s=1
repeat
  l=c
  s=-(s+sig(s))
  c=c+1/s
  print c
until(abs(l-c)<0.000001)
          
Este programa calcula la secuencia 1/1-1/2+1/3-1/4+1/5-1/6+1/7-1/8+ …
Ver también
repeat

Nombre
upper$() — convierte una cadena a mayúsculas
Sinopsis
u$=upper$(a$)
Descripción
La función upper$ acepta una cadena de caracteres como argumento y la convierte en su totalidad a mayúscula.
Ejemplo
line input "Por favor, introduzca una sentencia sin la letra 'e': " l$
p=instr(upper$(l$),"E")
if (p) then
  l$=lower$(l$)
  mid$(l$,p,1)="E"
  print "Oye, te has equivocado. Mira!"
  print l$
else
  print "Gracias."
endif
          
Este programa pide una frase y marca la primera ocurrencia (si la hay) de la letra 'e' convirtiéndola a mayúscula (en contraste con el resto de la frase, que es convertida a minúsculas).
Ver también
lower$

Nombre
using — especifica el formato en el que se imprimirá un número
Sinopsis
print a using "##.###"
print a using("##.###",",.")
Descripción
La palabra clave using puede aparecer como parte de la sentencia print y especifica el formato (es decir, el número de dígitos antes y después del punto decimal), que se usará para imprimir el número.
Los posibles valores para el argumento format ("##.###" en la sinopsis anterior) son descritos en la entrada para la función str$. Especialmente la segunda línea de la sinopsis (print a using("##.###",",.")) será más clara después de repasar str$. De hecho, la cláusula using está muy relacionada con la función str$; el primero siempre  se puede volver a escribir mediante este último; es decir, print foo using bar$ es siempre equivalente a print str$(foo,bar$). Véase str$ para ver más.
Ejemplo
for a=1 to 10
  print sqrt(ran(10000*a)) using "#########.#####"
next a
          
Este ejemplo imprime una columna de raices cuadradas de números aleatorios, alineados sobre el punto decimal.
Ver también
print, str$

Nombre
val() — convierte una cadena a número
Sinopsis
x=val(x$)
Descripción
La función val comprueba si el principio de la cadena pasada como argumento es un número en punto flotante y devuelve dicho número. La cadena debe empezar con dígitos (sólo se permiten espacios antes). En caso contrario, la función val devuelve cero.
Ejemplo
input "Por favor, introduzca una longitud, ya sea en pulgadas (in) o en centimetros (cm) " l$
if (right$(l$,2)="in") then
  l=val(l$)*2.51
else
  l=val(l$)
print "Usted ha introducido ",l,"cm."
          
Este ejemplo pregunta una longitud y comprueba si se ha especificado en pulgadas o centímetros. La longitud se convierte entonces a centímetros.
Ver también
str$

Nombre
wait — detiene el programa un número especificado de segundos
Sinopsis
wait 4
Descripción
El comando wait tiene otros nombres: puede escribirse pause, sleep o wait indistintamente, ya que Yabasic entiende que se trata del mismo comando.
Para mayor información, ver la función pause.

Nombre
wend — finaliza un bucle while
Sinopsis
while(a<b)
  …
wend
Descripción
La palabra clave wend marca el final de un bucle while. Véase la palabra clave while para más detalles.
wend puede ser escrito como end while o también end-while.
Ejemplo
line input "Por favor, introduzca una sentencia: " a$
p=instr(a$,"e")
while(p)
  mid$(a$,p,1)="E"
  p=instr(a$,"e")
wend
print a$
          
Este ejemplo lee una frase y convierte cada ocurrencia de la letra e a mayúscula (E).
Ver también
while 

Nombre
while — comienza un bucle while
Sinopsis
while(…)
  …
wend
Descripción
La palabra clave while comienza un bucle while, es decir, un bucle que se ejecuta mientras que la condición (especificada entre paréntesis tras la palabra clave while) se evalue como true.
Nótese que el cuerpo del bucle while puede que no se ejecute ninguna vez si la condición que sigue a la palabra clave while no es cierta desde el principio.
Si se desea abandonar el bucle de forma prematura puede usarse la sentencia break.
Ejemplo
open #1,"foo"
while(!eof(1))
  line input #1 a$
  print a$
wend
          
Este programa lee el fichero foo e imprime su contenido línea a línea.
Ver también
until, break, wend, do

Nombre
origin — establece el origen de las coordenadas de la ventana gráfica
Sinopsis
open window 200,200
origin "cc"
Descripción
El comando origin se aplica a la ventana gráfica y establece el origen del sistema de coordenadas a uno de nueve puntos. La posición normal del origen es en la esquina superior izquierda de la ventana. Sin embargo, en algunos casos puede ser conveniente situar el origen en otro punto para evitar tener que sumar un desplazamiento a las coordenadas utilizadas.
No obstante, no se puede establecer dicho origen en cualquier sitio. En la coordenada horizontal existen tres posiciones: izquierda, centro y derecha, que se codifican con las letras l, c y r. En vertical, las posiciones son arriba, centro y abajo, codificadas con las letras t, c y b. Con dichas letras puede formarse una cadena de dos caracteres, que establece la posición del origen de coordenadas en horizontal y vertical; como, por ejemplo: "cc" o "rt".
Ejemplo
100,100 
open window 200,200
window origin "cc"
circle 0,0,60
          
Este ejemplo dibuja un círculo en el centro de la ventana.
Ver también
open window

Nombre
xor() — calcula el 'o' exclusivo
Sinopsis
x=xor(a,b)
Descripción
xor calcula el o exclusivo a nivel de bit de sus dos argumentos numéricos. Para entender el resultado, ambos argumentos deben contemplarse como números binarios (es decir, como series de unos y ceros); un bit del resultado será 1 si (y sólo si) el bit correspondiente de un argumento es 1 y el del otro (en la misma posición) es 0.
Nótese que ambos argumentos se convierten a valores enteros y que los números negativos tienen su propia representación binaria, lo que puede producir resultados inesperados.
Ejemplo
print xor(7,4)
          
Esto imprimirá 3. El resultado será obvio si observa que la representación binaria de 7 y 4 es, respectivamente, 111 y 100; esto produce como resultado 011 en representación binaria, que es 3 en forma decimal.
La función eor es la misma que xor; ambas son sinónimos.
Ver también
and, or, eor, not

Nombre
# — un comentario o un marcador para un número de fichero
Sinopsis
# Esto es un comentario. Pero la linea de abajo no!
open #1,"foo"
Descripción
La cruceta ('#') tiene dos usos totalmente distintos:
·	La cruceta puede aparecer en comandos relacionados con ficheros. Yabasic usa números enteros para referirse a ficheros abiertos (dentro de input, print, peek o eof). En dichos comandos la cruceta precede al número que especifica el fichero. Véase estos comandos para mayor información y ejemplos. El resto de esta entrada es sobre su segundo uso (como comentario).
·	Como el primer caracter dentro de una línea, la cruceta introduce un comentario (similar a rem).
'#' como comentario es común en muchos lenguajes de script y tiene un uso especial en Unix: si la primerísima línea de un programa Unix comienza con la secuencia de caracteres '#!' ("she-bang", no se permiten espacios), el resto de la línea es tomada como el programa usado para ejecutar el script. Es decir, si un programa Yabasic empieza con '#!/usr/local/bin/yabasic', el programa /usr/local/bin/yabasic es llamado para ejecutar el resto del programa. Así se asegura que se use Yabasic para ejecutar el programa, ya que Unix ignora el final del nombre del fichero (es decir, .yab).
Ejemplo
# Esta linea es un comentario valido
print "Hola " : # Pero esto es un error de sintaxis, porque
print "mundo!" : # la cruceta no es el primer caracter!
          
Nótese que este ejemplo produce un error de sintaxis y que no es un programa válido.
Ver también
input, print, peek or eof, //, rem

Nombre
// — comienza un comentario
Sinopsis
//  Esto es un comentario!
Descripción
La doble barra ('//') es (además de REM y '#') la tercera forma de empezar un comentario.
Ejemplo
// Otro comentario.
print "Hola mundo!" // Otro comentario
          
A diferencia del ejemplo mostrado en '#' , este ejemplo es sintácticamente correcto y no produce error.
Ver también
#, rem

Nombre
@ — sinónimo de at
Sinopsis
clear screen
…
print @(a,b)
Descripción
Como '@' es símplemente un sinónimo de at, véase at para más información.
Ver también
at

Nombre
: — separa comandos unos de otros
Sinopsis
print "Hola ":print "mundo"
Descripción
Los dos puntos (':') separa múltiples comandos en una sola línea.
Los dos puntos y el caracter de salto de línea tienen el mismo efecto, solo que el último da comienzo a una nueva línea. La única otra diferencia es su efecto dentro de los if cortos, que es una sentencia if sin la palabra clave then. Véase la entrada de if para más detalles.
Ejemplo
if (a<10) print "Hola ":print "mundo!"
          
Este ejemplo demuestra la diferencia entre dos puntos y nueva línea, tal como se describe más arriba.
Ver también
if

Nombre
; — suprime el salto de línea implícito después de la sentencia print
Sinopsis
print "foo",bar;
Descripción
El punto y coma (';') puede aparecer sólamente al final de una sentencia print. Esto suprime el salto de línea implícito que normalmente añade Yabasic tras una sentencia print.
Dicho de otra manera: normalmente, la salida de cada sentencia print aparece en una línea. Si se desea que la salida de las sentencias print aparezca en una sola línea contigua, debe finalizarse la sentencia print con un punto y coma.
Ejemplo
print "Hola ";:print "mundo!"
          
Este ejemplo imprime Hola mundo! en una sola línea.
Ver también
print

Nombre
** or ^ — eleva el primer argumento a la potencia del segundo
Sinopsis
print 2**b
print 3^4
Descripción
** (o ^, que es un sinónimo), es el operador aritmético de la exponenciaón. Requiere un número a la izquierda y otro a la derecha; ** entonces eleva el primer argumento a la potencia del segundo y devuelve el resultado. El resultado sólo puede calcularse si los números son reales (no complejos), lo que significa que la potencia no puede ser calculada si el primer argumento es negativo y el segundo argumento es fraccional. Por otro lado, el segundo argumento puede ser fraccional si el primero es positivo, lo que significa que ** puede usarse para calcular raices arbitrarias: por ejemplo, x**0.5 calcula la raiz cuadrada de x.
Ejemplo
print 2**0.5
          
Ver también
sqrt
Palabras reservadas
Esta es una lista de todas las palabras reservadas en Yabasic. Asegúrese que no intenta usar una de estas palabras como nombre de variable o subrutina. O, dicho de otro modo: si obtiene un misterioso error y no consigue encontrarlo, compruebe que no está utilizando una de estas palabras reservadas sin saberlo. 
ABS	ACOS	AND	ARRAYDIM	ARRAYDIMENSION	
ARRAYSIZE	AS	ASC	ASIN	AT	
ATAN	BEEP	BELL	BIN$	BIND	
BITBLIT	BITBLIT$	BITBLT	BITBLT$	BOX	
BREAK	CASE	CHR$	CIRCLE	CLEAR	
CLOSE	COLOR	COLOUR	COMPILE	CONTINUE	
COS	CURVE	DATA	DATE$	DEC	
DEFAULT	DIM	DO	DOT	ELSE	
ELSEIF	ELSIF	END	ENDIF	EOF	
EOR	ERROR	EXECUTE	EXECUTE$	EXIT	
EXP	EXPORT	FI	FILL	FILLED	
FOR	FRAC	GETBIT$	GETSCREEN$	GLOB	
GOSUB	GOTO	HEX$	IF	INKEY$	
INPUT	INSTR	INT	INTERRUPT	LABEL	
LEFT$	LEN	LET	LINE	LOCAL	
LOG	LOOP	LOWER$	LTRIM$	MAX	
MID$	MIN	MOD	MOUSEB	MOUSEBUTTON	
MOUSEMOD	MOUSEMODIFIER	MOUSEX	MOUSEY	NEW	
NEXT	NOT	NUMPARAM	ON	OPEN	
OR	ORIGIN	PAUSE	PEEK	PEEK$	
POKE	PRINT	PRINTER	PUTBIT	PUTSCREEN	
RAN	READ	READING	RECT	RECTANGLE	
REDIM	REPEAT	RESTORE	RETURN	REVERSE	
RIGHT$	RINSTR	RTRIM$	SCREEN	SEEK	
SIG	SIN	SLEEP	SPLIT	SPLIT$	
SQR	SQRT	STATIC	STEP	STR$	
SUB	SUBROUTINE	SWITCH	SYSTEM	SYSTEM$	
TAN	TELL	TEXT	THEN	TIME$	
TO	TOKEN	TOKEN$	TRIANGLE	TRIM$	
UNTIL	UPPER$	USING	VAL	WAIT	
WEND	WHILE	WINDOW	WRITING	XOR	
 
Algunos conceptos y términos generales
Cortocircuitos lógicos
Los cortocircuitos lógicos no son un constructo especial del lenguaje y no tiene una palabra clave para ello; es simplemente una forma de evaluar expresiones lógicas. Las expresiones lógicas (esto es, una serie de condiciones o comparaciones unidas mediante and u or) se evalúan sólo hasta que el resultado final de la expresión se determine. Un ejemplo:
if (a<>0 and b/a>2) print "b es al menos dos veces mas grande que a"
La expresión lógica a<>0 and b/a>2 consiste en dos comparaciones que deben ser ciertas para que se ejecute la sentencia print. Ahora, si la primera comparación (a<>0) es false, la totalidad de la expresión lógica nunca podrá ser true y la segunda comparación (b/a>2) no necesitará ser evaluada. 
Así es exactamente como Yabasic se comporta: la evaluación de una expresión lógica compuesta finaliza inmediatamente, tan pronto como el resultado final se puede deducir de las partes ya evaluadas.
En la práctica, esto tiene las siguientes consecuencias:
·	Si dos o más comparaciones se unen con and y una comparación da como resultado false, no se continua evaluando la expresión y el resultado completo es false.
·	Si dos o más comparaciones se unen con or y una comparación da como resultado true, no se continua evaluando la expresión lógica y el resultado es true.
Vuélvase a considerar el ejemplo, especialmente la segunda comparación (b/a>2); dividir b entre a es potencialmente peligroso: si a es igual a cero, la expresión causaría un error que daría por finalizado el programa. Para evitar esto, la primera parte de la comparación (a<>0) comprueba si la segunda puede evaluarse sin riesgo. Esta comprobación previa es de uso muy común y la primera motivación para los cortocircuitos lógicos (y la razón porque muchos lenguajes de programación lo implementan).
Condiciones y expresiones
Hay que subrayar que no existe ninguna diferencia o distinción entre las condiciones y expresiones, al menos en lo que Yabasic se refiere. Así que se puede asignar el resultado de las comparaciones a variables o usar una expresión aritmética o una simple variable dentro de una condición (por ejemplo, dentro de una sentencia if). Así que las construcciones que se muestran en el ejemplo a continuación son totalmente válidas:
input "Por favor, introduzca un numero entre 1 y 10: " a
rem   Asignar el resultado de una comparación a una variable
okay=a>=1 and a<=10

rem   Utilice una variable dentro de una sentencia if
if (not okay) error "Mal, mal!"
Los términos condición y expresión pueden usarse de modo intercambiable, al menos en teoría. En realidad, el témino condición se usa en relación a setencias tipo if o while, mientras que el término expresión tiende a usarse más en el contexto de las operaciones aritméticas.
Referencias a matrices
Las referencias a matrices son el único modo de referirse a una matriz como un todo y de pasarla a subrutinas o funciones como arraydim o arraysize. Mientras (por ejemplo) a(2) designa al segundo elemento de la matriz a, a() (con paréntesis vacios) se refiere a la matriz misma a. a() es denominada una referencia a matriz.
Si se pasa una referencia a matriz a una subrutina, hay que tener en cuenta que dicha matriz podrá ser modificada dentro de la misma. Al pasar una referencia a matriz no se realiza una copia de la matriz, lo que tiene una serie de consecuencias interesantes:
·	Velocidad y espacio: Crear una copia de una matriz consume tiempo (y recursos). Pasar una referencia, en cambio, es rápido y apenas consume recursos.
·	Devolución de múltiples valores: una subrutina que necesite devolver más de un valor, requerirá una referencia a matriz entre sus argumentos para luego almacenar sus muchos valores de retorno dentro de esta matriz. Esta es la única manera de devolver más de un valor desde una subrutina.
Especificando nómbres de fichero bajo Windows
En Windows, el caracter '\' separa los directorios dentro del nombre de ruta; un ejemplo puede ser C:\yabasic\yabasic.exe (la ubicación habitual del ejecutable de Yabasic). Sin embargo, el mismo caracter '\' se usa para construir secuencias de escape, no sólo en Yabasic sino en muchos otros lenguajes de programación.
Por lo tanto la cadena "C:\t.dat" no especifica el fichero t.dat dentro del directorio C:; esto es debido a que la secuencia '\t' se traduce como el caracter de tabulador. Para especificar un nombre de fichero tal, se necesita usar la cadena "C:\\t.dat" (nótese la doble contrabarra '\\').
Secuencias de escape
Las secuencias de escape es la via preferente para especificar caracteres especiales. Se introducen con el caracter '\' seguido de una o varias letras, como por ejemplo '\n' o '\r' (ver la tabla siguiente).
Las secuencias de escape pueden encontrarse dentro de una cadena en cualquier posición, siendo reemplazadas en tiempo de traducción (no en tiempo de ejecución) por su correspondiente caracter especial. Como consecuencia de esto, len("\a") devuelve 1, ya que Yabasic reemplaza "\a" (2 caracteres) por un único caracter especial antes de que el programa se ejecute.
Tabla de secuencias de escape
Secuencia de escape	Caracter especial	
\n	nueva línea	
\t	tabulador	
\v	tabulador vertical	
\b	retroceso	
\r	retorno de carro	
\f	alimentación de página	
\a	alerta (sonido bip)	
\\	barra invertida	
\'	comilla simple	
\"	comilla doble	
\xHEX	chr$(HEX) (ver a continuación)	
Nótese que una secuencia de escape en la forma \xHEX permite codificar caracteres arbitrarios (sabiendo su posición, en formato hexadecimal, dentro de la tabla de caracteres ASCII): por ejemplo, \x012 se transforma en el caracter chr$(18) (o chr$(dec("12",16)). Obsérvese que \x requiere un número hexadecimal (y el número hexadecimal de la cadena "12" corresponde con el número decimal 18).
Crear un programa independientemente ejecutable a partir de un listado fuente Yabasic
A veces se deseará entregar uno de nuestros programas Yabasic a otra gente. Pero, ¿qué pasa si esa otra gente no tiene instalado Yabasic? En ese caso se puede crear un programa autoejecutable; es decir, que puede ejecutarse por si mismo sin necesidad de de que esté instalado Yabasic. 
Este programa independiente se crea de forma simple, mediante la unión del intérprete y el programa en un único fichero ejecutable que tiene el mismo nombre que el del programa. Existen dos formas de crear un programa independientemente ejecutable:
·	Con el comando bind, ejecutado dentro de nuestro programa.
·	Con la opción de línea de comando -bind, que realiza la misma función pero desde la línea de comandos.
Además, la instrucción especial peek("isbound"), permite comprobar si el programa (en su actual estado) ya se ha convertido en un fichero ejecutable independiente.
Crear un programa ejecutable desde la línea de comandos
Considérese el siguiente programa (muy simple) guardado en el fichero foo.yab:
print "Hola mundo!"
Normalmente se ejecutaría este programa escribiendo yabasic foo.yab y el resultado (la cadena Hola mundo!) aparecería en la pantalla. Para crear un programa independiente de foo.yab se escribiría:
yabasic -bind foo.exe foo.yab
Este comando no ejecuta el programa foo.yab , sino que crea el fichero foo.exe. Nótese que en Unix probablemente el fichero se llamará foo, omitiendo la extensión (propia de Windows) .exe. 
Yabasic confirma la realización de esta tarea mediante la impresión del siguiente mensaje: ---Info: Successfully bound 'yabasic' and 'foo.yab' into 'foo.exe'.
Después de obtener el fichero foo.exe (o, en Unix, después de hacerlo ejecutable con el comando chmod), al ejecutar dicho programa producirá la salida Hola mundo!.
Este nuevo programa foo.exe ya podrá ser transferido a cualquier ordenador, donde podrá ejecutarse sin necesidad de que esté instalado Yabasic.
Crear un programa ejecutable desde dentro de nuestro programa
Es posible confeccionar un programa que, al ejecutarse, cree por sí mismo su versión autoejecutable. He aquí un ejemplo:
if (!peek("isbound")) then
  bind "foo"
  print "Se ha creado con exito el programa autoejecutable 'foo'!"
  exit
endif

print "Hola mundo!"
Al ejecutarse este programa (guardado con el nombre foo.yab) via yabasic foo.yab, la instrucción peek("isbound") en la primera línea comprueba si el programa ya forma parte de un programa autoejecutable. Si no es así, el comando bind lo crea. Como resultado del proceso se obtiene la salida Se ha creado con exito el programa autoejecutable 'foo'!.
Ahora, si se ejecuta el programa foo.exe, se ejecutará de igual manera el mismo programa. Sin embargo, en esta ocasión peek("isbound") devolverá TRUE con lo que el resultado de la sentencia if será false y las tres líneas siguientes al then no se ejecutarán. En vez de eso, se ejecutará la última sentencia print, y podrá verse la salida Hola mundo!.
Con este método un programa Yabasic puede convertirse en un programa autónomo por sí mismo.
Desventajas de la creación de un programa independientemente ejecutable
El crear programas independientemente ejecutables tiene una serie de desventajas que es conveniente considerar. A saber:
·	El nuevo programa autónomo será igual de grande (al menos) que el mismo intérprete, ya que se incluye este en el programa creado.
·	No es fácil extraer el programa Yabasic del programa autónomo: si se desea poder modificarlo, mejor tenerlo separado.
·	Si se libera una nueva versión de Yabasic, se necesita volver a procesar los programas autónomos creados a fin de beneficiarse de las nuevas características y la corrección de errores.
Por lo tanto, crear un programa autónomo puede ser la opción ideal en algunos casos, pero no en todos.
Ver también
El comando bind, la función peek y las opciones de línea de comando para Unix Windows.
Unos cuantos programas de ejemplo
Un programa muy simple
repeat
  input "Por favor, introduzca el primer número a sumar " a
  input "Por favor, introduzca el segundo número a sumar " b
  print a+b
until(a=0 and b=0)
Este programa pide dos números a sumar. Este proceso se repite hasta que se introduce cero (o nada) en ambos.
El programa de demostración de Yabasic
A continuación se muestra el listado del programa de demostración que se acompaña con Yabasic. Fíjese que el código se escribió antes de que se incluyeran algunas características avanzadas (como, por ejemplo, las subrutinas). Así que no tome este programa como un ejemplo particularmente bueno de código Yabasic.
//
//      This program demos yabasic
//

//      Check, if screen is large enough
clear screen
sw=peek("screenwidth"):sh=peek("screenheight")
if (sw<78 or sh<24) then
  print
  print "  Sorry, but your screen is to small to run this demo !"
  print
  end
endif
sw=78:sh=24

//  Initialize everything
restore mmdata
read mmnum:dim mmtext$(mmnum)
for a=1 to mmnum:read mmtext$(a):next a

//  Main loop selection of demo
ysel=1
label mainloop
clear screen
print colour("cyan","magenta") at(7,2) "################################"
print colour("cyan","magenta") at(7,3) "################################"
print colour("cyan","magenta") at(7,4) "################################"
print colour("yellow","blue") at(8,3) " This is the demo for yabasic "
yoff=7
for a=1 to mmnum
  if (a=mmnum) then ydisp=1:else ydisp=0:fi
  if (a=ysel) then
    print colour("blue","green") at(5,yoff+ydisp+a) mmtext$(a);
  else
    print at(5,yoff+ydisp+a) mmtext$(a);
  endif
next a
print at(3,sh-3) "Move selection with CURSOR KEYS (or u and d),"
print at(3,sh-2) "Press RETURN or SPACE to choose, ESC to quit."

do    // loop for keys pressed
  rev=1
  do    // loop for blinking
    k$=inkey$(0.4)
    if (k$="") then
      if (ysel=mmnum) then
        if (rev=1) then 
          print colour("blue","green") at(5,yoff+mmnum+1) mmtext$(mmnum);
          rev=0
        else
          print colour("yellow","red") at(5,yoff+mmnum+1) mmtext$(mmnum);
          rev=1
        endif
      endif
    else    // key has been pressed, leave loop
      break
    endif
  loop    // loop for blinking

  yalt=ysel
  if (k$="up" or k$="u") then 
    if (ysel=1) then ysel=mmnum else ysel=ysel-1 fi
    redraw():heal():continue
  fi
  if (k$="down" or k$="d") then 
    if (ysel=mmnum) then ysel=1 else ysel=ysel+1 fi
    redraw():heal():continue
  fi
  if (k$=" " or k$="enter" or k$="right") then 
    on ysel gosub overview,bitmap,tetraeder,endit
    goto mainloop
  fi
  if (k$="esc") then
    endit()
  fi
  beep
  print at(3,sh-5) "Invalid key: ",k$,"         "
loop    // loop for keys pressed

//  redraw line
sub redraw()
  if (yalt=mmnum) then ydisp=1:else ydisp=0:fi
  print at(5,yoff+yalt+ydisp) mmtext$(yalt);
  if (ysel=mmnum) then ydisp=1:else ydisp=0:fi
  print colour("blue","green") at(5,yoff+ysel+ydisp) mmtext$(ysel);
  return
end sub

//  erase a line
sub heal()
  print at(3,sh-5) "                                                       "
  return
end sub

//  Go here to exit
label endit
  print at(3,sh-8) "Hope you liked it ...\n   ";
  exit
return

//  Present a short overview
label overview
  clear screen
  print
  print "  Yabasic is a quite traditional basic: It comes with"
  print "  print, input, for-next-loops, goto, gosub, while and"
  print "  repeat. It has user defined procedures and libraries,"
  print "  however, it is not object oriented.\n"
  print "  Yabasic makes it easy to open a window, draw lines"
  print "  and print the resulting picture.\n"
  print "  Yabasic programs are interpreted and run under Unix"
  print "  and Windows. The Yabasic interpreter (around 200K)"
  print "  and any Yabasic program can be glued together to"
  print "  form a standalone executable.\n" 
  print "  Yabasic is free software, i.e. subject to the"
  print "  GNU copyright.\n"
  print "\n\n\n  While you read this, I am calculating prime numbers,\n"
  print "  Press any key to return to main menu ..."
  can=1
  print at(6,17) "This is a prime number: "
  label nextcan
  can=can+2
  for i=2 to sqrt(can):if (frac(can/i)=0) then goto notprime:fi:next i
  print at(32,17) can;
  label notprime
  if (lower$(inkey$(0))<>"") then 
    print at(10,sh) "Wrapping around once ...";
    for x=1 to sw
      a$=getscreen$(0,0,1,sh-2)
      b$=getscreen$(1,0,sw-1,sh-2)
      putscreen b$,0,0
      putscreen a$,sw-1,0
    next x
    sleep 2
    return
  fi
goto nextcan

//  Show some animated bitmaps
label bitmap
  clear screen
  print 
  print "Yabasic offers some commands for drawing simple graphics."
  print reverse at(5,12) " Press any key to return to main menu ... "

  n=20
  open window 400,400

  for b=20 to 0 step -1
    color 255-b*12,0,b*12
    fill circle 200,200,b
  next b
  c$=getbit$(179,179,221,221)
  for a=1 to 2000
    color ran(255),ran(255),ran(255)
    x=ran(500)-100:y=ran(500)-100
    fill rectangle ran(500)-100,ran(500)-100,ran(500)-100,ran(500)-100
  next a

  x=200:y=200:phi=ran(2*pi):dx=2*sin(phi):dy=2*cos(phi)
  o$=""
  count=0
  label pong
    count=count+1
    if (o$<>"") putbit o$,xo-2,yo-2
    if (count>1000) then
      phi=ran(2*pi):dx=2*sin(phi):dy=2*cos(phi)
      sleep 2
      count=0
    endif
    xo=x:yo=y
    x=x+dx:y=y+dy
    o$=getbit$(x-2,y-2,x+46,y+46)
    putbit c$,x,y,"t"
    if (x<0 or x>360) dx=-dx
    if (y<0 or y>360) dy=-dy
    if (inkey$(0)<>"") then
      close window
      return
    endif
  goto pong
return

label tetraeder

open window 400,400
clear window
clear screen
print reverse at(5,12) " Press any key to return to main menu ... "	

dim opoints(4,3)
restore points
for n=1 to 4:for p=1 to 3:read opoints(n,p):next p:next n

dim triangles(4,3)
restore triangles
for n=1 to 4:for p=1 to 3:read triangles(n,p):next p:next n

phi=0:dphi=0.1:psi=0:dpsi=0.05
dim points(4,3)

r=60:g=20
dr=0.5:dg=1.2:db=3
label main

  phi=phi+dphi
  psi=psi+dpsi
  for n=1 to 4
    points(n,1)=opoints(n,1)*cos(phi)-opoints(n,2)*sin(phi)
    points(n,2)=opoints(n,2)*cos(phi)+opoints(n,1)*sin(phi)
    p2=          points(n,2)*cos(psi)-opoints(n,3)*sin(psi)
    points(n,3)=opoints(n,3)*cos(psi)+ points(n,2)*sin(psi)
    points(n,2)=p2
  next n

  r=r+dr:if (r<0 or r>60) dr=-dr
  g=g+dg:if (g<0 or g>60) dg=-dg
  b=b+db:if (b<0 or b>60) db=-db
  dm=dm+0.01
  m=120-80*sin(dm)
  for n=1 to 4
    p1=triangles(n,1)
    p2=triangles(n,2)
    p3=triangles(n,3)
    n1=points(p1,1)+points(p2,1)+points(p3,1)
    n2=points(p1,2)+points(p2,2)+points(p3,2)
    n3=points(p1,3)+points(p2,3)+points(p3,3)
    if (n3>0) then
      sp=n1*0.5-n2*0.7-n3*0.6
      color 60+r+30*sp,60+g+30*sp,60+b+30*sp
      fill triangle 200+m*points(p1,1),200+m*points(p1,2),200+m*points(p2,1),200+m*points(p2,2),200+m*points(p3,1),200+m*points(p3,2)
    endif
  next n
  if (inkey$(0.1)<>"") close window:return
  clear window
goto main

label points
data  -1,-1,+1,  +1,-1,-1,  +1,+1,+1,  -1,+1,-1
label triangles
data  1,2,4,  2,3,4,  1,3,4,  1,2,3

//  Data section ...
label mmdata
//  Data for main menu: Number and text of entries in main menu
data 4
data "   Yabasic in a nutshell   "
data "   Some graphics           "
data "   A rotating Tetraeder    "
data "   Exit this demo          "

El Copyright de Yabasic
Yabasic puede ser copiado sólo bajo los términos de la Artistic License o de la GNU General Public License (GPL).
Esta es una lista de cosas que son posibles en virtud de los términos de la Licencia Artística:
·	Incluir Yabasic en su página personal o CD e, incluso, cobrar por el servicio de distribución de Yabasic.
·	Escribir sus propios programas, empaquetarlos con Yabasic y venderlo todo.
·	Modificar Yabasic añadiendo o quitando características, y vender la versión modificada.