yabasic(1)
yet another Basic
Description
yabasic
NAME
yabasic - yet another Basic
SYNOPSIS
yabasic [OPTIONS] [FILENAME [ARGUMENTS]]
DESCRIPTION
Yabasic implements the most common and simple elements of the basic language. It comes with goto/gosub, with various loops, with user defined subroutines and libraries. Yabasic does simple graphics and printing. Yabasic runs under Unix and Windows, it is small, open source and free.
This man-page is derived from yabasic.htm, which too should be installed on your system; per default in
/usr/local/share/applications/yabasic/yabasic.htm.
The same information can also be found on www.yabasic.de
Here is its content:
\h’\n[lss]u’Yabasic
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Table of Contents
\h’\n[lss]u’1. Introduction
\h’\n[lss]u’About
this document
\h’\n[lss]u’About yabasic
\h’\n[lss]u’2. The yabasic-program under Windows
\h’\n[lss]u’Starting
yabasic
\h’\n[lss]u’Options
\h’\n[lss]u’The context Menu
\h’\n[lss]u’3. The yabasic-program under Unix
\h’\n[lss]u’Starting
yabasic
\h’\n[lss]u’Options
\h’\n[lss]u’Setting defaults
\h’\n[lss]u’4.
Command line options of yabasic
\h’\n[lss]u’5. Some features of yabasic,
explained by topic
\h’\n[lss]u’print,
input and others
\h’\n[lss]u’Control statements: loops, if and
switch
\h’\n[lss]u’Drawing and painting
\h’\n[lss]u’Reading from and writing to files
\h’\n[lss]u’Subroutines and Libraries
\h’\n[lss]u’String processing
\h’\n[lss]u’Arithmetic and numbers
\h’\n[lss]u’Data and such
\h’\n[lss]u’Other interesting commands.
\h’\n[lss]u’6. All commands and functions of yabasic listed by topic
\h’\n[lss]u’Number
processing and conversion
\h’\n[lss]u’Conditions and control structures
\h’\n[lss]u’Data keeping and processing
\h’\n[lss]u’String processing
\h’\n[lss]u’File operations and printing
\h’\n[lss]u’Subroutines and libraries
\h’\n[lss]u’Other commands
\h’\n[lss]u’Graphics and printing
\h’\n[lss]u’7. All commands and functions of yabasic grouped alphabetically
\h’\n[lss]u’A
\h’\n[lss]u’B
\h’\n[lss]u’C
\h’\n[lss]u’D
\h’\n[lss]u’E
\h’\n[lss]u’F
\h’\n[lss]u’G
\h’\n[lss]u’H
\h’\n[lss]u’I
\h’\n[lss]u’L
\h’\n[lss]u’M
\h’\n[lss]u’N
\h’\n[lss]u’O
\h’\n[lss]u’P
\h’\n[lss]u’R
\h’\n[lss]u’S
\h’\n[lss]u’T
\h’\n[lss]u’U
\h’\n[lss]u’V
\h’\n[lss]u’W
\h’\n[lss]u’X
\h’\n[lss]u’Special characters
\h’\n[lss]u’Reserved Words
\h’\n[lss]u’8. Some general concepts and terms
\h’\n[lss]u’Logical
shortcuts
\h’\n[lss]u’Conditions and expressions
\h’\n[lss]u’References on arrays
\h’\n[lss]u’Specifying Filenames under Windows
\h’\n[lss]u’Escape-sequences
\h’\n[lss]u’Creating a standalone program from
your yabasic-program
\h’\n[lss]u’9. A few example programs
\h’\n[lss]u’A
very simple program
\h’\n[lss]u’The demo of yabasic
\h’\n[lss]u’10. The Copyright of yabasic
\h’\n[lss]u’Chapter 1. Introduction
\h’\n[lss]u’About
this document
\h’\n[lss]u’About yabasic
\h’\n[lss]u’About this document
\h’\n[lss]u’This
document describes yabasic. You will find information about
the yabasic
\h’\n[lss]u’interpreter (the program yabasic
under Unix or yabasic.exe under Windows) as
\h’\n[lss]u’well as the language (which is, of
course, a sort of basic) itself.
\h’\n[lss]u’This document applies to version 2.82 of yabasic
\h’\n[lss]u’However,
this document does not contain the latest news about yabasic
or a FAQ.
\h’\n[lss]u’As such information tends to change
rapidly, it is presented online only at
\h’\n[lss]u’www.yabasic.de.
\h’\n[lss]u’Although
basic has its reputation as a language for beginning
programmers, this
\h’\n[lss]u’is not an introduction to
programming at large. Rather this text assumes, that
\h’\n[lss]u’the reader has some (moderate)
experience with writing and starting computer
\h’\n[lss]u’programs.
\h’\n[lss]u’About yabasic
\h’\n[lss]u’yabasic
is a traditional basic interpreter. It understands most of
the typical
\h’\n[lss]u’basic-constructs, like goto, gosub,
line numbers, read, data or
\h’\n[lss]u’string-variables with a trailing
’$’. But on the other hand, yabasic implements
\h’\n[lss]u’some more advanced
programming-constructs like subroutines or libraries (but
\h’\n[lss]u’not objects). yabasic works much the
same under Unix and Windows.
\h’\n[lss]u’yabasic
puts emphasis on giving results quickly and easily;
therefore simple
\h’\n[lss]u’commands are provided to open a
graphic window, print the graphics or control
\h’\n[lss]u’the console screen and get keyboard
or mouse information. The example below
\h’\n[lss]u’opens a window, draws a circle and
prints the graphic:
\h’\n[lss]u’open
window 100,100
\h’\n[lss]u’open printer
\h’\n[lss]u’circle 50,50,40
\h’\n[lss]u’text 10,50,"Press any key to
get a printout"
\h’\n[lss]u’clear screen
\h’\n[lss]u’inkey$
\h’\n[lss]u’close printer
\h’\n[lss]u’close window
\h’\n[lss]u’This
example has fewer lines, than it would have in many other
programming
\h’\n[lss]u’languages. In the end however
yabasic lacks behind more advanced and modern
\h’\n[lss]u’programming languages like C++ or
Java. But as far as it goes it tends to give
\h’\n[lss]u’you results more quickly and
easily.
\h’\n[lss]u’Chapter 2. The yabasic-program under Windows
\h’\n[lss]u’Starting
yabasic
\h’\n[lss]u’Options
\h’\n[lss]u’The context Menu
\h’\n[lss]u’Starting yabasic
\h’\n[lss]u’Once, yabasic has been set up correctly, there are three ways to start it:
\h’\n[lss]u’1.
Right click on your desktop: The desktop menu appears with a
submenu named
\h’\n[lss]u’new. From this submenu choose
yabasic. This will create a new icon on your
\h’\n[lss]u’desktop. If you right click on this
icon, its context menu will appear;
\h’\n[lss]u’choose Execute to execute the
program.
\h’\n[lss]u’2.
As a variant of the way described above, you may simply
create a file with
\h’\n[lss]u’the ending .yab (e.g. with your
favorite editor). Everything else then
\h’\n[lss]u’works as described above.
\h’\n[lss]u’3.
From the start-menu: Choose yabasic from your start-menu. A
console-window
\h’\n[lss]u’will open and you will be asked to
type in your program. Once you are
\h’\n[lss]u’finished, you need to type return
twice, and yabasic will parse and execute
\h’\n[lss]u’your program.
\h’\n[lss]u’Note
\h’\n[lss]u’This
is not the preferred way of starting yabasic ! Simply
because the
\h’\n[lss]u’program, that you have typed, can
not be saved and will be lost inevitably
\h’\n[lss]u’! There is no such thing as a
save-command and therefore no way to conserve
\h’\n[lss]u’the program, that you have typed.
This mode is only intended for quick
\h’\n[lss]u’hacks, and short programs.
\h’\n[lss]u’Options
\h’\n[lss]u’Under
Windows yabasic will mostly be invoked by double-clicking on
an
\h’\n[lss]u’appropriate icon; this way you do
not have a chance to specify any of the
\h’\n[lss]u’command line options below. However,
advanced users may change the librarypath
\h’\n[lss]u’in the registry, which has the same
effect as specifying it as an option on the
\h’\n[lss]u’command line.
\h’\n[lss]u’See
the chapter on options for a complete list of all options,
either on Unix
\h’\n[lss]u’or Windows.
\h’\n[lss]u’The context Menu
\h’\n[lss]u’Like
every other icon under Windows, the icon of every
yabasic-program has a
\h’\n[lss]u’context menu offering the most
frequent operations, that may be applied to a
\h’\n[lss]u’yabasic-program.
\h’\n[lss]u’Execute
\h’\n[lss]u’This
will invoke yabasic to execute your program. The same
happens, if you
\h’\n[lss]u’double click on the icon.
\h’\n[lss]u’Edit
\h’\n[lss]u’notepad will be invoked, allowing you to edit your program.
\h’\n[lss]u’View docu
\h’\n[lss]u’This
will present the embedded documentation of your program.
Embedded
\h’\n[lss]u’documentation is created with the
special comment doc.
\h’\n[lss]u’Chapter 3. The yabasic-program under Unix
\h’\n[lss]u’Starting
yabasic
\h’\n[lss]u’Options
\h’\n[lss]u’Setting defaults
\h’\n[lss]u’Starting yabasic
\h’\n[lss]u’If
your system administrator (vulgo root) has installed yabasic
correctly,
\h’\n[lss]u’there are three ways to start
it:
\h’\n[lss]u’1.
You may use your favorite editor (emacs, vi ?) to put your
program into a
\h’\n[lss]u’file (e.g. foo). Make sure that the
very first line starts with the
\h’\n[lss]u’characters ’#!’ followed
by the full pathname of yabasic (e.g. ’#!/usr/
\h’\n[lss]u’local/bin/yabasic’). This
she-bang-line ensures, that your Unix will invoke
\h’\n[lss]u’yabasic to execute your program (see
also the entry for the hash
\h’\n[lss]u’-character). Moreover, you will need
to change the permissions of your
\h’\n[lss]u’yabasic-program foo, e.g. chmod u+x
foo. After that you may invoke yabasic
\h’\n[lss]u’to invoke your program by simply
typing foo (without even mentioning
\h’\n[lss]u’yabasic). However, if your
PATH-variable does not contain a single dot
\h’\n[lss]u’(’.’) you will have to
type the full pathname of your program: e.g. /home/
\h’\n[lss]u’ihm/foo (or at least ./foo).
\h’\n[lss]u’2.
Save your program into a file (e.g. foo) and type yabasic
foo. This
\h’\n[lss]u’assumes, that the directory, where
yabasic resides, is contained within
\h’\n[lss]u’your PATH-variable.
\h’\n[lss]u’3.
Finally your may simply type yabasic (maybe it will be
necessary to include
\h’\n[lss]u’its full pathname). This will make
yabasic come up and you will be asked to
\h’\n[lss]u’type in your program. Once you are
finished, you need to type return twice,
\h’\n[lss]u’and yabasic will parse and execute
your program.
\h’\n[lss]u’Note
\h’\n[lss]u’This
is not the preferred way of starting yabasic ! Simply
because the
\h’\n[lss]u’program, that you have typed, can
not be saved and will be lost inevitably
\h’\n[lss]u’! There is no such thing as a
save-command and therefore no way to conserve
\h’\n[lss]u’the program, that you have typed.
This mode is only intended for quick
\h’\n[lss]u’hacks, and short programs, i.e. for
using yabasic as some sort of fancy
\h’\n[lss]u’desktop calculator.
\h’\n[lss]u’Options
\h’\n[lss]u’yabasic accepts a number of options on the command line.
\h’\n[lss]u’See
chapter on options for a complete list of all options,
either on Unix or
\h’\n[lss]u’Windows.
\h’\n[lss]u’Setting defaults
\h’\n[lss]u’If
you want to set some options once for all, you may put them
into your
\h’\n[lss]u’X-Windows resource file. This is
usually the file .Xresources or some such
\h’\n[lss]u’within your home directory (type man
X for details).
\h’\n[lss]u’Here is a sample section, which may appear within this file:
\h’\n[lss]u’yabasic*foreground:
blue
\h’\n[lss]u’yabasic*background: gold
\h’\n[lss]u’yabasic*geometry: +10+10
\h’\n[lss]u’yabasic*font: 9x15
\h’\n[lss]u’This
will set the foreground color of the graphic-window to blue
and the
\h’\n[lss]u’background color to gold. The window
will appear at position 10,10 and the text
\h’\n[lss]u’font will be 9x15.
\h’\n[lss]u’Chapter 4. Command line options of yabasic
\h’\n[lss]u’Here
are the options, that yabasic accepts on the command line
(both under Unix
\h’\n[lss]u’and Windows).
\h’\n[lss]u’All
the options below may be abbreviated (and one hyphen may be
dropped), as
\h’\n[lss]u’long as the abbreviation does not
become ambiguous. For example, you may write
\h’\n[lss]u’-e instead of --execute.
\h’\n[lss]u’--help or -?
\h’\n[lss]u’Prints
a short help message, which itself describes two further
\h’\n[lss]u’help-options.
\h’\n[lss]u’--version
\h’\n[lss]u’Prints the version of yabasic.
\h’\n[lss]u’--infolevel INFOLEVEL
\h’\n[lss]u’Change
the infolevel of yabasic, where INFOLEVEL can be one of
debug, note,
\h’\n[lss]u’warning, error, fatal and bison (the
default is warning). This option
\h’\n[lss]u’changes the amount of
debugging-information yabasic produces. However,
\h’\n[lss]u’normally only the author of yabasic
(me !) would want to change this.
\h’\n[lss]u’--execute A-PROGRAM-AS-A-SINGLE-STRING
\h’\n[lss]u’With
this option you may specify some yabasic-code to be executed
right
\h’\n[lss]u’away. This is useful for very short
programs, which you do not want to save
\h’\n[lss]u’to a file. If this option is given,
yabasic will not read any code from a
\h’\n[lss]u’file. E.g.
\h’\n[lss]u’yabasic -e ’for a=1 to 10:print a*a:next a’
\h’\n[lss]u’prints the square numbers from 1 to 10.
\h’\n[lss]u’--bind NAME-OF-STANDALONE-PROGRAM
\h’\n[lss]u’Create
a standalone program (whose name is specified by
\h’\n[lss]u’NAME-OF-STANDALONE-PROGRAM) from the
yabasic-program, that is specified on
\h’\n[lss]u’the command line. See the section
about creating a standalone-program for
\h’\n[lss]u’details.
\h’\n[lss]u’--geometry +X-POSITION+Y-POSITION
\h’\n[lss]u’Sets
the position of the graphic window, that is opened by open
window (the
\h’\n[lss]u’size of this window, of course, is
specified within the open
\h’\n[lss]u’window-command). An example would be
-geometry +20+10, which would place
\h’\n[lss]u’the graphic window 10 pixels below
the upper border and 20 pixels right of
\h’\n[lss]u’the left border of the screen. This
value cannot be changed, once yabasic
\h’\n[lss]u’has been started.
\h’\n[lss]u’-fg FOREGROUND-COLOR or --foreground FOREGROUND-COLOR
\h’\n[lss]u’Unix
only. Define the foreground color for the graphics-window
(that will
\h’\n[lss]u’be opened with open window). The
usual X11 color names, like red, green, ?
\h’\n[lss]u’are accepted. This value cannot be
changed, once yabasic has been started.
\h’\n[lss]u’-bg BACKGROUND-COLOR or --background BACKGROUND-COLOR
\h’\n[lss]u’Unix
only. Define the background color for the graphics-window.
The usual
\h’\n[lss]u’X11 color names are accepted. This
value cannot be changed, once yabasic
\h’\n[lss]u’has been started.
\h’\n[lss]u’--display X11-DISPLAY-SPECIFICATION
\h’\n[lss]u’Unix
only. Specify the display, where the graphics window of
yabasic should
\h’\n[lss]u’appear. Normally this value will be
already present within the environment
\h’\n[lss]u’variable DISPLAY.
\h’\n[lss]u’--font NAME-OF-FONT
\h’\n[lss]u’Under
Unix. Name of the font, which will be used for text within
the
\h’\n[lss]u’graphics window.
\h’\n[lss]u’--font NAME-OF-FONT
\h’\n[lss]u’Under
Windows. Name of the font, which will be used for
graphic-text; can
\h’\n[lss]u’be any of decorative, dontcare,
modern, roman, script, swiss. You may
\h’\n[lss]u’append a fontsize (measured in
pixels) to any of those fontnames; for
\h’\n[lss]u’example -font swiss30 chooses a
swiss-type font with a size of 30 pixels.
\h’\n[lss]u’--docu NAME-OF-A-PROGRAM
\h’\n[lss]u’Print
the embedded documentation of the named program. The
embedded
\h’\n[lss]u’documentation of a program consists
of all the comments within the program,
\h’\n[lss]u’which start with the special keyword
doc. This documentation can also be
\h’\n[lss]u’seen by choosing the corresponding
entry from the context-menu of any
\h’\n[lss]u’yabasic-program.
\h’\n[lss]u’--check
\h’\n[lss]u’Check
for possible compatibility problems within your
yabasic-program. E.g.
\h’\n[lss]u’this option reports, if you are
using a function, that has recently
\h’\n[lss]u’changed.
\h’\n[lss]u’--librarypath DIRECTORY-WITH-LIBRARIES
\h’\n[lss]u’Change
the directory, wherein libraries will be searched and
imported (with
\h’\n[lss]u’the import-command). See also import
for more information about the way,
\h’\n[lss]u’libraries are searched.
\h’\n[lss]u’--
\h’\n[lss]u’Do
not try to parse any further options; rather pass the
subsequent words
\h’\n[lss]u’from the commandline to yabasic.
\h’\n[lss]u’Chapter 5. Some features of yabasic, explained by topic
\h’\n[lss]u’print,
input and others
\h’\n[lss]u’Control statements: loops, if and
switch
\h’\n[lss]u’Drawing and painting
\h’\n[lss]u’Reading from and writing to files
\h’\n[lss]u’Subroutines and Libraries
\h’\n[lss]u’String processing
\h’\n[lss]u’Arithmetic and numbers
\h’\n[lss]u’Data and such
\h’\n[lss]u’Other interesting commands.
\h’\n[lss]u’This
chapter has sections for some of the major features of
yabasic and names a
\h’\n[lss]u’few commands related with each area.
So, depending on your interest, you find
\h’\n[lss]u’the most important commands of this
area named; the other commands from this
\h’\n[lss]u’area may then be discovered through
the links in the see also-section.
\h’\n[lss]u’print, input and others
\h’\n[lss]u’The
print-command is used to put text on the text screen. Here,
the term text
\h’\n[lss]u’screen stands for your terminal
(under Unix) or the console window (under
\h’\n[lss]u’Windows).
\h’\n[lss]u’At
the bottom line, print simply outputs its argument to the
text window.
\h’\n[lss]u’However, once you have called clear
screen you may use advanced features like
\h’\n[lss]u’printing colors or copying areas of
text with getscreen$ or putscreen.
\h’\n[lss]u’You
may ask the user for input with the input-command; use
inkey$ to get each
\h’\n[lss]u’key as soon as it is pressed.
\h’\n[lss]u’Control statements: loops, if and switch
\h’\n[lss]u’Of
course, yabasic has the goto- and gosub-statements; you may
go to a label or
\h’\n[lss]u’a line number (which is just a
special kind of label). goto, despite its bad
\h’\n[lss]u’reputation ([goto considered
harmful]), has still its good uses; however in
\h’\n[lss]u’many cases you are probably better
off with loops like repeat-until, while-wend
\h’\n[lss]u’or do-loop; you may leave any of
these loops with the break-statement or start
\h’\n[lss]u’the next iteration immediately with
continue.
\h’\n[lss]u’Decisions
can be made with the if-statement, which comes either in a
short and
\h’\n[lss]u’a long form. The short form has no
then-keyword and extends up to the end of
\h’\n[lss]u’the line. The long form extends up
to the final endif and may use some of the
\h’\n[lss]u’keywords then (which introduces the
long form), else or elsif.
\h’\n[lss]u’If
you want to test the result of an expression against many
different values,
\h’\n[lss]u’you should probably use the
switch-statement.
\h’\n[lss]u’Drawing and painting
\h’\n[lss]u’You
need to call open window before you may draw anything with
either line,
\h’\n[lss]u’circle, rectangle or triangle; all
of these statements may be decorated with
\h’\n[lss]u’clear or fill. If you want to change
the colour for drawing, use colour. Note
\h’\n[lss]u’however, that there can only be a
single window open at any given moment in
\h’\n[lss]u’time.
\h’\n[lss]u’Everything
you have drawn can be send to your printer too, if you use
the open
\h’\n[lss]u’printer command.
\h’\n[lss]u’To
allow for some (very) limited version of animated graphics,
yabasic offers
\h’\n[lss]u’the commands getbit$ and putbit,
which retrieve rectangular regions from the
\h’\n[lss]u’graphics-window into a string or
vice versa.
\h’\n[lss]u’If you want to sense mouse-clicks, you may use the inkey$-function.
\h’\n[lss]u’Reading from and writing to files
\h’\n[lss]u’Before
you may read or write a file, you need to open it; once you
are done,
\h’\n[lss]u’you should close it. Each open file
is designated by a simple number, which
\h’\n[lss]u’might be stored within a variable
and must be supplied if you want to access
\h’\n[lss]u’the file. This is simply done by
putting a hash (’#’) followed by the number of
\h’\n[lss]u’the file after the keyword input
(for reading from) or print (for writing to a
\h’\n[lss]u’file) respectively.
\h’\n[lss]u’If
you need more control, you may consider reading and writing
one byte at a
\h’\n[lss]u’time, using the multi-purpose
commands peek and poke.
\h’\n[lss]u’Subroutines and Libraries
\h’\n[lss]u’The
best way to break any yabasic-program into smaller, more
manageable chunks
\h’\n[lss]u’are subroutines and libraries. They
are yabasic’s most advanced means of
\h’\n[lss]u’structuring a program.
\h’\n[lss]u’Subroutines
are created with the command sub. they accept parameters and
may
\h’\n[lss]u’return a value. Subroutines can be
called much like any builtin function of
\h’\n[lss]u’yabasic; therefore they allow one to
extend the language itself.
\h’\n[lss]u’Once
you have created a set of related subroutines and you feel
that they could
\h’\n[lss]u’be useful in other programs too, you
may collect them into a library. Such a
\h’\n[lss]u’library is contained within a
separate file and may be included in any of your
\h’\n[lss]u’programs, using the keyword import,
which see.
\h’\n[lss]u’String processing
\h’\n[lss]u’yabasic
has a set of functions to extract parts from a string:
left$, mid$ and
\h’\n[lss]u’right$. Note, that all of them can
be assigned to, i.e. they may change part of
\h’\n[lss]u’a string.
\h’\n[lss]u’If
you want to split a string into tokens you should use the
functions token or
\h’\n[lss]u’split.
\h’\n[lss]u’Some
functions are handy for normalizing a string: upper$ and
lower$ convert a
\h’\n[lss]u’string to all upper or lower case
respectively, whereas chomp$ cuts of any
\h’\n[lss]u’trailing newline character, but only
if present.
\h’\n[lss]u’chr$ and str$ convert a string into a number, both in different ways.
\h’\n[lss]u’To
analyze a string use instr (finding one string within the
other) or glob
\h’\n[lss]u’(testing a string against a simple
pattern).
\h’\n[lss]u’To concatenate strings use the operator + like in a$ + b$.
\h’\n[lss]u’You may also see the complete list of a string processing functions.
\h’\n[lss]u’Arithmetic and numbers
\h’\n[lss]u’Yabasic
handles numbers and arithmetic: You may calculate
trigonometric
\h’\n[lss]u’functions like sin or atan, or
logarithms (with log). Bitwise operations, like
\h’\n[lss]u’and or or are available as well min
or max (calculate the minimum or maximum of
\h’\n[lss]u’its argument) or mod or int
(reminder of a division or integer part or a
\h’\n[lss]u’number).
\h’\n[lss]u’Conversion
between numerical bases can be done with hex$ and dec. And
you may
\h’\n[lss]u’write hexadecimal constants in the
usual way, e.g.
\h’\n[lss]u’print 0xff
\h’\n[lss]u’. All calculations in yabasic are done with double precision.
\h’\n[lss]u’Data and such
\h’\n[lss]u’You
may store data within your program within data-statements;
during execution
\h’\n[lss]u’you will probably want to read it
into arrays, which must have been dimed
\h’\n[lss]u’before.
\h’\n[lss]u’Other interesting commands.
\h’\n[lss]u’*
Yabasic programs may start other programs with the commands
system and
\h’\n[lss]u’system$.
\h’\n[lss]u’*
peek and poke allow one to get and set internal information;
either for the
\h’\n[lss]u’operating system (i.e. Unix or
Windows) or yabasic itself.
\h’\n[lss]u’*
The current time or date can be retrieved with (guess what
!) time$ and
\h’\n[lss]u’date$.
\h’\n[lss]u’Chapter 6. All commands and functions of yabasic listed by topic
\h’\n[lss]u’Number
processing and conversion
\h’\n[lss]u’Conditions and control structures
\h’\n[lss]u’Data keeping and processing
\h’\n[lss]u’String processing
\h’\n[lss]u’File operations and printing
\h’\n[lss]u’Subroutines and libraries
\h’\n[lss]u’Other commands
\h’\n[lss]u’Graphics and printing
\h’\n[lss]u’Number processing and conversion
\h’\n[lss]u’abs()
\h’\n[lss]u’returns the absolute value of its
numeric argument
\h’\n[lss]u’acos()
\h’\n[lss]u’returns the arcus cosine of its
numeric argument
\h’\n[lss]u’and()
\h’\n[lss]u’the bitwise arithmetic and
\h’\n[lss]u’asin()
\h’\n[lss]u’returns the arcus sine of its
numeric argument
\h’\n[lss]u’atan()
\h’\n[lss]u’returns the arctangent of its
numeric argument
\h’\n[lss]u’bin$()
\h’\n[lss]u’converts a number into a sequence of
binary digits
\h’\n[lss]u’cos()
\h’\n[lss]u’return the cosine of its single
argument
\h’\n[lss]u’dec()
\h’\n[lss]u’convert a base 2 or base 16 number
into decimal form
\h’\n[lss]u’eor()
\h’\n[lss]u’compute the bitwise exclusive or of
its two arguments
\h’\n[lss]u’euler
\h’\n[lss]u’another name for the constant
2.71828182864
\h’\n[lss]u’exp()
\h’\n[lss]u’compute the exponential function of
its single argument
\h’\n[lss]u’frac()
\h’\n[lss]u’return the fractional part of its
numeric argument
\h’\n[lss]u’int()
\h’\n[lss]u’return the integer part of its
single numeric argument
\h’\n[lss]u’ceil()
\h’\n[lss]u’return the smallest integral number,
that is greater or equal than its
\h’\n[lss]u’argument
\h’\n[lss]u’floor()
\h’\n[lss]u’return the largest integral number,
that is smaller or equal than its
\h’\n[lss]u’argument
\h’\n[lss]u’log()
\h’\n[lss]u’compute the natural logarithm
\h’\n[lss]u’max()
\h’\n[lss]u’return the larger of its two
arguments
\h’\n[lss]u’min()
\h’\n[lss]u’return the smaller of its two
arguments
\h’\n[lss]u’mod
\h’\n[lss]u’compute the remainder of a division
\h’\n[lss]u’or()
\h’\n[lss]u’arithmetic or, used for
bit-operations
\h’\n[lss]u’pi
\h’\n[lss]u’a constant with the value 3.14159
\h’\n[lss]u’ran()
\h’\n[lss]u’return a random number
\h’\n[lss]u’sig()
\h’\n[lss]u’return the sign of its argument
\h’\n[lss]u’sin()
\h’\n[lss]u’return the sine of its single
argument
\h’\n[lss]u’sqr()
\h’\n[lss]u’compute the square of its argument
\h’\n[lss]u’sqrt()
\h’\n[lss]u’compute the square root of its
argument
\h’\n[lss]u’tan()
\h’\n[lss]u’return the tangent of its argument
\h’\n[lss]u’xor()
\h’\n[lss]u’compute the exclusive or
\h’\n[lss]u’** or ˆ
\h’\n[lss]u’raise its first argument to the
power of its second
\h’\n[lss]u’Conditions and control structures
\h’\n[lss]u’and
\h’\n[lss]u’logical and, used in conditions
\h’\n[lss]u’break
\h’\n[lss]u’breaks out of a switch statement or
a loop
\h’\n[lss]u’case
\h’\n[lss]u’mark the different cases within a
switch-statement
\h’\n[lss]u’continue
\h’\n[lss]u’start the next iteration of a for-,
do-, repeat- or while-loop
\h’\n[lss]u’default
\h’\n[lss]u’mark the default-branch within a
switch-statement
\h’\n[lss]u’do
\h’\n[lss]u’start a (conditionless) do-loop
\h’\n[lss]u’else
\h’\n[lss]u’mark an alternative within an
if-statement
\h’\n[lss]u’elsif
\h’\n[lss]u’starts an alternate condition within
an if-statement
\h’\n[lss]u’end
\h’\n[lss]u’terminate your program
\h’\n[lss]u’endif
\h’\n[lss]u’ends an if-statement
\h’\n[lss]u’false
\h’\n[lss]u’a constant with the value of 0
\h’\n[lss]u’fi
\h’\n[lss]u’another name for endif
\h’\n[lss]u’for
\h’\n[lss]u’starts a for-loop
\h’\n[lss]u’gosub
\h’\n[lss]u’continue execution at another point
within your program (and return later)
\h’\n[lss]u’goto
\h’\n[lss]u’continue execution at another point
within your program (and never come
\h’\n[lss]u’back)
\h’\n[lss]u’if
\h’\n[lss]u’evaluate a condition and execute
statements or not, depending on the result
\h’\n[lss]u’label
\h’\n[lss]u’mark a specific location within your
program for goto, gosub or restore
\h’\n[lss]u’loop
\h’\n[lss]u’marks the end of an infinite loop
\h’\n[lss]u’next
\h’\n[lss]u’mark the end of a for loop
\h’\n[lss]u’not
\h’\n[lss]u’negate an expression; can be written
as !
\h’\n[lss]u’on gosub
\h’\n[lss]u’jump to one of multiple
gosub-targets
\h’\n[lss]u’on goto
\h’\n[lss]u’jump to one of many goto-targets
\h’\n[lss]u’on interrupt
\h’\n[lss]u’change reaction on keyboard
interrupts
\h’\n[lss]u’logical or
\h’\n[lss]u’logical or, used in conditions
\h’\n[lss]u’pause
\h’\n[lss]u’pause, sleep, wait for the specified
number of seconds
\h’\n[lss]u’repeat
\h’\n[lss]u’start a repeat-loop
\h’\n[lss]u’return
\h’\n[lss]u’return from a subroutine or a gosub
\h’\n[lss]u’sleep
\h’\n[lss]u’pause, sleep, wait for the specified
number of seconds
\h’\n[lss]u’switch
\h’\n[lss]u’select one of many alternatives
depending on a value
\h’\n[lss]u’then
\h’\n[lss]u’tell the long from the short form of
the if-statement
\h’\n[lss]u’true
\h’\n[lss]u’a constant with the value of 1
\h’\n[lss]u’until
\h’\n[lss]u’end a repeat-loop
\h’\n[lss]u’wait
\h’\n[lss]u’pause, sleep, wait for the specified
number of seconds
\h’\n[lss]u’wend
\h’\n[lss]u’end a while-loop
\h’\n[lss]u’while
\h’\n[lss]u’start a while-loop
\h’\n[lss]u’:
\h’\n[lss]u’separate commands from each
other
\h’\n[lss]u’Data keeping and processing
\h’\n[lss]u’arraydim()
\h’\n[lss]u’returns the dimension of the array,
which is passed as an array reference
\h’\n[lss]u’arraysize()
\h’\n[lss]u’returns the size of a dimension of
an array
\h’\n[lss]u’data
\h’\n[lss]u’introduces a list of data-items
\h’\n[lss]u’dim
\h’\n[lss]u’create an array prior to its first
use
\h’\n[lss]u’read
\h’\n[lss]u’read data from data-statements
\h’\n[lss]u’redim
\h’\n[lss]u’create an array prior to its first
use. A synonym for dim
\h’\n[lss]u’restore
\h’\n[lss]u’reposition the data-pointer
\h’\n[lss]u’String processing
\h’\n[lss]u’asc()
\h’\n[lss]u’accepts a string and returns the
position of its first character within the
\h’\n[lss]u’ascii charset
\h’\n[lss]u’chomp$()
\h’\n[lss]u’Chop of the trailing newline of its
string-argument; if the string does not
\h’\n[lss]u’end in a newline, the string is
returned unchanged
\h’\n[lss]u’chr$()
\h’\n[lss]u’accepts a number and returns the
character at this position within the
\h’\n[lss]u’ascii charset
\h’\n[lss]u’glob()
\h’\n[lss]u’check if a string matches a simple
pattern
\h’\n[lss]u’hex$()
\h’\n[lss]u’convert a number into hexadecimal
\h’\n[lss]u’instr()
\h’\n[lss]u’searches its second argument within
the first; returns its position if
\h’\n[lss]u’found
\h’\n[lss]u’left$()
\h’\n[lss]u’return (or change) left end of a
string
\h’\n[lss]u’len()
\h’\n[lss]u’return the length of a string
\h’\n[lss]u’lower$()
\h’\n[lss]u’convert a string to lower case
\h’\n[lss]u’ltrim$()
\h’\n[lss]u’trim spaces at the left end of a
string
\h’\n[lss]u’mid$()
\h’\n[lss]u’return (or change) characters from
within a string
\h’\n[lss]u’right$()
\h’\n[lss]u’return (or change) the right end of
a string
\h’\n[lss]u’split()
\h’\n[lss]u’split a string into many strings
\h’\n[lss]u’str$()
\h’\n[lss]u’convert a number into a string
\h’\n[lss]u’token()
\h’\n[lss]u’split a string into multiple strings
\h’\n[lss]u’trim$()
\h’\n[lss]u’remove leading and trailing spaces
from its argument
\h’\n[lss]u’upper$()
\h’\n[lss]u’convert a string to upper case
\h’\n[lss]u’val()
\h’\n[lss]u’converts a string to a number
\h’\n[lss]u’File operations and printing
\h’\n[lss]u’at()
\h’\n[lss]u’can be used in the print-command to
place the output at a specified
\h’\n[lss]u’position
\h’\n[lss]u’beep
\h’\n[lss]u’ring the bell within your computer;
a synonym for bell
\h’\n[lss]u’bell
\h’\n[lss]u’ring the bell within your computer
(just as beep)
\h’\n[lss]u’clear screen
\h’\n[lss]u’erases the text window
\h’\n[lss]u’close
\h’\n[lss]u’close a file, which has been opened
before
\h’\n[lss]u’close printer
\h’\n[lss]u’stops printing of graphics
\h’\n[lss]u’print color
\h’\n[lss]u’print with color
\h’\n[lss]u’print colour
\h’\n[lss]u’see print color
\h’\n[lss]u’eof
\h’\n[lss]u’check, if an open file contains data
\h’\n[lss]u’getscreen$()
\h’\n[lss]u’returns a string representing a
rectangular section of the text terminal
\h’\n[lss]u’inkey$
\h’\n[lss]u’wait, until a key is pressed
\h’\n[lss]u’input
\h’\n[lss]u’read input from the user (or from a
file) and assign it to a variable
\h’\n[lss]u’line input
\h’\n[lss]u’read in a whole line of text and
assign it to a variable
\h’\n[lss]u’open
\h’\n[lss]u’open a file
\h’\n[lss]u’open printer
\h’\n[lss]u’open printer for printing graphics
\h’\n[lss]u’print
\h’\n[lss]u’Write to terminal or file
\h’\n[lss]u’putscreen
\h’\n[lss]u’draw a rectangle of characters into
the text terminal
\h’\n[lss]u’reverse
\h’\n[lss]u’print reverse (background and
foreground colors exchanged)
\h’\n[lss]u’screen
\h’\n[lss]u’as clear screen clears the text
window
\h’\n[lss]u’seek()
\h’\n[lss]u’change the position within an open
file
\h’\n[lss]u’tell
\h’\n[lss]u’get the current position within an
open file
\h’\n[lss]u’using
\h’\n[lss]u’Specify the format for printing a
number
\h’\n[lss]u’#
\h’\n[lss]u’either a comment or a marker for a
file-number
\h’\n[lss]u’@
\h’\n[lss]u’synonymous to at
\h’\n[lss]u’;
\h’\n[lss]u’suppress the implicit newline after
a print-statement
\h’\n[lss]u’Subroutines and libraries
\h’\n[lss]u’end
sub
\h’\n[lss]u’ends a subroutine definition
\h’\n[lss]u’export
\h’\n[lss]u’mark a function as globally visible
\h’\n[lss]u’import
\h’\n[lss]u’import a library
\h’\n[lss]u’local
\h’\n[lss]u’mark a variable as local to a
subroutine
\h’\n[lss]u’numparams
\h’\n[lss]u’return the number of parameters,
that have been passed to a subroutine
\h’\n[lss]u’return
\h’\n[lss]u’return from a subroutine or a gosub
\h’\n[lss]u’static
\h’\n[lss]u’preserves the value of a variable
between calls to a subroutine
\h’\n[lss]u’step
\h’\n[lss]u’specifies the increment step in a
for-loop
\h’\n[lss]u’sub
\h’\n[lss]u’declare a user defined
subroutine
\h’\n[lss]u’Other commands
\h’\n[lss]u’bind()
\h’\n[lss]u’Binds a yabasic-program and the
yabasic-interpreter together into a
\h’\n[lss]u’standalone program.
\h’\n[lss]u’compile
\h’\n[lss]u’compile a string with yabasic-code
on the fly
\h’\n[lss]u’date$
\h’\n[lss]u’returns a string with various
components of the current date
\h’\n[lss]u’doc
\h’\n[lss]u’special comment, which might be
retrieved by the program itself
\h’\n[lss]u’docu$
\h’\n[lss]u’special array, containing the
contents of all docu-statement within the
\h’\n[lss]u’program
\h’\n[lss]u’error
\h’\n[lss]u’raise an error and terminate your
program
\h’\n[lss]u’execute$()
\h’\n[lss]u’execute a user defined subroutine,
which must return a string
\h’\n[lss]u’execute()
\h’\n[lss]u’execute a user defined subroutine,
which must return a number
\h’\n[lss]u’exit
\h’\n[lss]u’terminate your program
\h’\n[lss]u’pause
\h’\n[lss]u’pause, sleep, wait for the specified
number of seconds
\h’\n[lss]u’peek
\h’\n[lss]u’retrieve various internal
information
\h’\n[lss]u’peek$
\h’\n[lss]u’retrieve various internal
string-information
\h’\n[lss]u’poke
\h’\n[lss]u’change selected internals of yabasic
\h’\n[lss]u’rem
\h’\n[lss]u’start a comment
\h’\n[lss]u’sleep
\h’\n[lss]u’pause, sleep, wait for the specified
number of seconds
\h’\n[lss]u’system()
\h’\n[lss]u’hand a statement over to your
operating system and return its exitcode
\h’\n[lss]u’system$()
\h’\n[lss]u’hand a statement over to your
operating system and return its output
\h’\n[lss]u’time$
\h’\n[lss]u’return a string containing the
current time
\h’\n[lss]u’to
\h’\n[lss]u’this keyword appears as part of
other statements
\h’\n[lss]u’wait
\h’\n[lss]u’pause, sleep, wait for the specified
number of seconds
\h’\n[lss]u’//
\h’\n[lss]u’starts a comment
\h’\n[lss]u’:
\h’\n[lss]u’separate commands from each
other
\h’\n[lss]u’Graphics and printing
\h’\n[lss]u’backcolor
\h’\n[lss]u’specify the colour for subsequent
drawing of the background
\h’\n[lss]u’box
\h’\n[lss]u’draw a rectangle. A synonym for
rectangle
\h’\n[lss]u’circle
\h’\n[lss]u’draws a circle in the graphic-window
\h’\n[lss]u’clear
\h’\n[lss]u’Erase circles, rectangles or
triangless
\h’\n[lss]u’clear window
\h’\n[lss]u’clear the graphic window and begin a
new page, if printing is under way
\h’\n[lss]u’close curve
\h’\n[lss]u’close a curve, that has been drawn
by the line-command
\h’\n[lss]u’close window
\h’\n[lss]u’close the graphics-window
\h’\n[lss]u’colour
\h’\n[lss]u’specify the colour for subsequent
drawing
\h’\n[lss]u’dot
\h’\n[lss]u’draw a dot in the graphic-window
\h’\n[lss]u’fill
\h’\n[lss]u’draw a filled circles, rectangles or
triangles
\h’\n[lss]u’getbit$()
\h’\n[lss]u’return a string representing the bit
pattern of a rectangle within the
\h’\n[lss]u’graphic window
\h’\n[lss]u’line
\h’\n[lss]u’draw a line
\h’\n[lss]u’mouseb
\h’\n[lss]u’extract the state of the
mousebuttons from a string returned by inkey$
\h’\n[lss]u’mousemod
\h’\n[lss]u’return the state of the modifier
keys during a mouseclick
\h’\n[lss]u’mousex
\h’\n[lss]u’return the x-position of a
mouseclick
\h’\n[lss]u’mousey
\h’\n[lss]u’return the y-position of a
mouseclick
\h’\n[lss]u’new curve
\h’\n[lss]u’start a new curve, that will be
drawn with the line-command
\h’\n[lss]u’open window
\h’\n[lss]u’open a graphic window
\h’\n[lss]u’putbit
\h’\n[lss]u’draw a rectangle of pixels into the
graphic window
\h’\n[lss]u’rectangle
\h’\n[lss]u’draw a rectangle
\h’\n[lss]u’triangle
\h’\n[lss]u’draw a triangle
\h’\n[lss]u’text
\h’\n[lss]u’write text into your graphic-window
\h’\n[lss]u’window origin
\h’\n[lss]u’move the origin of a window
\h’\n[lss]u’Chapter 7. All commands and functions of yabasic grouped alphabetically
\h’\n[lss]u’A
\h’\n[lss]u’B
\h’\n[lss]u’C
\h’\n[lss]u’D
\h’\n[lss]u’E
\h’\n[lss]u’F
\h’\n[lss]u’G
\h’\n[lss]u’H
\h’\n[lss]u’I
\h’\n[lss]u’L
\h’\n[lss]u’M
\h’\n[lss]u’N
\h’\n[lss]u’O
\h’\n[lss]u’P
\h’\n[lss]u’R
\h’\n[lss]u’S
\h’\n[lss]u’T
\h’\n[lss]u’U
\h’\n[lss]u’V
\h’\n[lss]u’W
\h’\n[lss]u’X
\h’\n[lss]u’Special characters
\h’\n[lss]u’Reserved Words
\h’\n[lss]u’A
\h’\n[lss]u’abs()
? returns the absolute value of its numeric argument
\h’\n[lss]u’acos() ? returns the arcus cosine of
its numeric argument
\h’\n[lss]u’and ? logical and, used in
conditions
\h’\n[lss]u’and() ? the bitwise arithmetic and
\h’\n[lss]u’arraydim() ? returns the dimension
of the array, which is passed as an array
\h’\n[lss]u’reference
\h’\n[lss]u’arraysize() ? returns the size of a
dimension of an array
\h’\n[lss]u’asc() ? accepts a string and returns
the position of its first character within
\h’\n[lss]u’the ascii charset
\h’\n[lss]u’asin() ? returns the arcus sine of
its numeric argument
\h’\n[lss]u’at() ? can be used in the
print-command to place the output at a specified
\h’\n[lss]u’position
\h’\n[lss]u’atan() ? returns the arctangent of
its numeric argument
\h’\n[lss]u’Name
\h’\n[lss]u’abs() ? returns the absolute value of its numeric argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’y=abs(x)
\h’\n[lss]u’Description
\h’\n[lss]u’If
the argument of the abs-function is positive (e.g. 2) it is
returned
\h’\n[lss]u’unchanged, if the argument is
negative (e.g. -1) it is returned as a positive
\h’\n[lss]u’value (e.g. 1).
\h’\n[lss]u’Example
\h’\n[lss]u’print abs(-2),abs(2)
\h’\n[lss]u’This example will print 2 2
\h’\n[lss]u’See also
\h’\n[lss]u’sig
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’acos() ? returns the arcus cosine of its numeric argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=acos(angle)
\h’\n[lss]u’Description
\h’\n[lss]u’acos
is the arcus cosine-function, i.e. the inverse of the
cos-function. Or,
\h’\n[lss]u’more elaborate: It Returns the angle
(in radians, not degrees !), which, fed to
\h’\n[lss]u’the cosine-function will produce the
argument passed to the acos-function.
\h’\n[lss]u’Example
\h’\n[lss]u’print acos(0.5),acos(cos(pi))
\h’\n[lss]u’This example will print 1.0472 3.14159 which are ?/3 and ? respectively.
\h’\n[lss]u’See also
\h’\n[lss]u’cos, asin
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’and ? logical and, used in conditions
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(a and b) ?
\h’\n[lss]u’while (a and b) ?
\h’\n[lss]u’Description
\h’\n[lss]u’Used
in conditions (e.g within if, while or until) to join two
expressions.
\h’\n[lss]u’Returns true, if and only if its
left and right argument are both true and
\h’\n[lss]u’false otherwise.
\h’\n[lss]u’Note, that logical shortcuts may take place.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a number" a
\h’\n[lss]u’if (a>=1 and a<=9) print
"your input is between 1 and 9"
\h’\n[lss]u’See also
\h’\n[lss]u’or,not
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’and() ? the bitwise arithmetic and
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=and(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’Used
to compute the bitwise and of both its argument. Both
arguments are
\h’\n[lss]u’treated as binary numbers (i.e. a
series of 0 and 1); a bit of the resulting
\h’\n[lss]u’value will then be 1, if both
arguments have a 1 at this position in their
\h’\n[lss]u’binary representation.
\h’\n[lss]u’Note,
that both arguments are silently converted to integer values
and that
\h’\n[lss]u’negative numbers have their own
binary representation and may lead to
\h’\n[lss]u’unexpected results when passed to
and.
\h’\n[lss]u’Example
\h’\n[lss]u’print and(6,3)
\h’\n[lss]u’This
will print 2. This result is clear, if you note, that the
binary
\h’\n[lss]u’representation of 6 and 3 are 110
and 011 respectively; this will yield 010 in
\h’\n[lss]u’binary representation or 2 as
decimal.
\h’\n[lss]u’See also
\h’\n[lss]u’or, eor and not
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’arraydim()
? returns the dimension of the array, which is passed as an
array
\h’\n[lss]u’reference
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a=arraydim(b())
\h’\n[lss]u’Description
\h’\n[lss]u’If
you apply the arraydim()-function on a one-dimensional array
(i.e. a vector)
\h’\n[lss]u’it will return 1, on a
two-dimensional array (i.e. a matrix) it will return 2,
\h’\n[lss]u’and so on.
\h’\n[lss]u’This
is mostly used within subroutines, which expect an array
among their
\h’\n[lss]u’parameters. Such subroutines tend to
use the arraydim-function to check, if the
\h’\n[lss]u’array which has been passed, has the
right dimension. E.g. a subroutine to
\h’\n[lss]u’multiply two matrices may want to
check, if it really is invoked with two
\h’\n[lss]u’2-dimensional arrays.
\h’\n[lss]u’Example
\h’\n[lss]u’dim
a(10,10),b(10)
\h’\n[lss]u’print
arraydim(a()),arraydim(b())
\h’\n[lss]u’This
will print 2 1, which are the dimension of the arrays a()
and b(). You may
\h’\n[lss]u’check out the function arraysize for
a full-fledged example.
\h’\n[lss]u’See also
\h’\n[lss]u’arraysize and dim.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’arraysize() ? returns the size of a dimension of an array
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=arraysize(a(),b)
\h’\n[lss]u’Description
\h’\n[lss]u’The
arraysize-function computes the size of a specified
dimension of a
\h’\n[lss]u’specified array. Here, size stands
for the maximum number, that may be used as
\h’\n[lss]u’an index for this array. The first
argument to this function must be an
\h’\n[lss]u’reference to an array, the second
one specifies, which of the multiple
\h’\n[lss]u’dimensions of the array should be
taken to calculate the size.
\h’\n[lss]u’An
Example involving subroutines: Let’s say, an array has
been declared as dim
\h’\n[lss]u’a(10,20) (that is a two-dimensional
array or a matrix). If this array is passed
\h’\n[lss]u’as an array reference to a
subroutine, this sub will not know, what sort of
\h’\n[lss]u’array has been passed. With the
arraydim-function the sub will be able to find
\h’\n[lss]u’the dimension of the array, with the
arraysize-function it will be able to find
\h’\n[lss]u’out the size of this array in its
two dimensions, which will be 10 and 20
\h’\n[lss]u’respectively.
\h’\n[lss]u’Our
sample array is two dimensional; if you envision it as a
matrix this matrix
\h’\n[lss]u’has 10 lines and 20 columns (see the
dim-statement above. To state it more
\h’\n[lss]u’formally: The first dimension
(lines) has a size of 10, the second dimension
\h’\n[lss]u’(columns) has a size of 20; these
numbers are those returned by arraysize(a
\h’\n[lss]u’(),1) and arraysize(a(),2)
respectively. Refer to the example below for a
\h’\n[lss]u’typical usage.
\h’\n[lss]u’Example
\h’\n[lss]u’rem
\h’\n[lss]u’rem This program adds two matrices
elementwise.
\h’\n[lss]u’rem
\h’\n[lss]u’dim a(10,20),b(10,20),c(10,20)
\h’\n[lss]u’rem
initialization of the arrays a() and b()
\h’\n[lss]u’for y=1 to 10:for x=1 to 20
\h’\n[lss]u’a(y,x)=int(ran(4)):b(y,x)=int(ran(4))
\h’\n[lss]u’next x:next y
\h’\n[lss]u’matadd(a(),b(),c())
\h’\n[lss]u’print
"Result:"
\h’\n[lss]u’for x=1 to 20
\h’\n[lss]u’for y=10 to 1 step -1
\h’\n[lss]u’print c(y,x)," ";
\h’\n[lss]u’next y
\h’\n[lss]u’print
\h’\n[lss]u’next x
\h’\n[lss]u’sub matadd(m1(),m2(),r())
\h’\n[lss]u’rem
This sub will add the matrices m1() and m2()
\h’\n[lss]u’rem elementwise and store the result
within r()
\h’\n[lss]u’rem This is not very useful but easy
to implement.
\h’\n[lss]u’rem However, this sub excels in
checking its arguments
\h’\n[lss]u’rem with arraydim() and
arraysize()
\h’\n[lss]u’local x:local y
\h’\n[lss]u’if
(arraydim(m1())<>2 or arraydim(m2())<>2 or
arraydim(r())<>2) then
\h’\n[lss]u’error "Need two dimensional
arrays as input"
\h’\n[lss]u’endif
\h’\n[lss]u’y=arraysize(m1(),1):x=arraysize(m1(),2)
\h’\n[lss]u’if (arraysize(m2(),1)<>y or
arraysize(m2(),2)<>x) then
\h’\n[lss]u’error "The two matrices cannot
be added elementwise"
\h’\n[lss]u’endif
\h’\n[lss]u’if
(arraysize(r(),1)<>y or arraysize(r(),2)<>x)
then
\h’\n[lss]u’error "The result cannot be
stored in the third argument"
\h’\n[lss]u’endif
\h’\n[lss]u’local
xx:local yy
\h’\n[lss]u’for xx=1 to x
\h’\n[lss]u’for yy=1 to y
\h’\n[lss]u’r(yy,xx)=m1(yy,xx)+m2(yy,xx)
\h’\n[lss]u’next yy
\h’\n[lss]u’next xx
\h’\n[lss]u’end sub
\h’\n[lss]u’See also
\h’\n[lss]u’arraydim and dim.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’asc()
? accepts a string and returns the position of its first
character within
\h’\n[lss]u’the ascii charset
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a=asc(char$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
asc-function accepts a string, takes its first character and
looks it up
\h’\n[lss]u’within the ascii-charset; this
position will be returned. The asc-function is
\h’\n[lss]u’the opposite of the chr$-function.
There are valid uses for asc, however,
\h’\n[lss]u’comparing strings (i.e. to bring
them into alphabetical sequence) is not among
\h’\n[lss]u’them; in such many cases you might
consider to compare strings directly with <,
\h’\n[lss]u’= and > (rather than converting a
string to a number and comparing this
\h’\n[lss]u’number).
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a letter between ’a’ and
’y’: " a$
\h’\n[lss]u’if (a$<"a" or
a$>"y") print a$," is not in the proper
range":end
\h’\n[lss]u’print "The letter after
",a$," is ",chr$(asc(a$)+1)
\h’\n[lss]u’See also
\h’\n[lss]u’chr$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’asin() ? returns the arcus sine of its numeric argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’angle=asin(x)
\h’\n[lss]u’Description
\h’\n[lss]u’acos
is the arcus sine-function, i.e. the inverse of the
sin-function. Or, more
\h’\n[lss]u’elaborate: It Returns the angle (in
radians, not degrees !), which, fed to the
\h’\n[lss]u’sine-function will produce the
argument passed to the asin-function.
\h’\n[lss]u’Example
\h’\n[lss]u’print asin(0.5),asin(sin(pi))
\h’\n[lss]u’This will print 0.523599 -2.06823e-13 which is ? and almost 0 respectively.
\h’\n[lss]u’See also
\h’\n[lss]u’sin, acos
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’at()
? can be used in the print-command to place the output at a
specified
\h’\n[lss]u’position
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear
screen
\h’\n[lss]u’?
\h’\n[lss]u’print at(a,b)
\h’\n[lss]u’print @(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’The
at-clause takes two numeric arguments (e.g. at(2,3)) and can
be inserted
\h’\n[lss]u’after the print-keyword. at() can be
used only if clear screen has been
\h’\n[lss]u’executed at least once within the
program (otherwise you will get an error).
\h’\n[lss]u’The
two numeric arguments of the at-function may range from 0 to
the width of
\h’\n[lss]u’your terminal minus 1, and from 0 to
the height of your terminal minus 1; if
\h’\n[lss]u’any argument exceeds these values,
it will be truncated accordingly. However,
\h’\n[lss]u’yabasic has no influence on the size
of your terminal (80x25 is a common, but
\h’\n[lss]u’not mandatory), the size of your
terminal and the maximum values acceptable
\h’\n[lss]u’within the at-clause may vary. To
get the size of your terminal you may use the
\h’\n[lss]u’peek-function:
peek("screenwidth") returns the width of your
terminal and peek
\h’\n[lss]u’("screenheight") its
height.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’maxx=peek("screenwidth")-1:maxy=peek("screenheight")-1
\h’\n[lss]u’for x=0 to maxx
\h’\n[lss]u’print
at(x,maxy*(0.5+sin(2*pi*x/maxx)/2)) "*"
\h’\n[lss]u’next x
\h’\n[lss]u’This example plots a full period of the sine-function across the screen.
\h’\n[lss]u’See also
\h’\n[lss]u’print, clear screen, color
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’atan() ? returns the arctangent of its numeric argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’angle=atan(a,b)
\h’\n[lss]u’angle=atan(a)
\h’\n[lss]u’Description
\h’\n[lss]u’atan
is the arctangent-function, i.e. the inverse of the
tan-function. Or, more
\h’\n[lss]u’elaborate: It Returns the angle (in
radians, not degrees !), which, fed to the
\h’\n[lss]u’tan-function will produce the
argument passed to the atan-function.
\h’\n[lss]u’The
atan-function has a second form, which accepts two
arguments: atan(a,b)
\h’\n[lss]u’which is (mostly) equivalent to
atan(a/b) except for the fact, that the
\h’\n[lss]u’two-argument-form returns an angle
in the range -? to ?, whereas the
\h’\n[lss]u’one-argument-form returns an angle
in the range -?/2 to ?/2. To understand this
\h’\n[lss]u’you have to be good at math.
\h’\n[lss]u’Example
\h’\n[lss]u’print atan(1),atan(tan(pi)),atan(-0,-1),atan(-0,1)
\h’\n[lss]u’This
will print 0.463648 2.06823e-13 -3.14159 3.14159 which is
?/4, almost 0,
\h’\n[lss]u’-? and ? respectively.
\h’\n[lss]u’See also
\h’\n[lss]u’tan, sin
\h’\n[lss]u’B
\h’\n[lss]u’backcolor
? change color for background of graphic window
\h’\n[lss]u’backcolour ? see backcolor
\h’\n[lss]u’beep ? ring the bell within your
computer; a synonym for bell
\h’\n[lss]u’bell ? ring the bell within your
computer (just as beep)
\h’\n[lss]u’bin$() ? converts a number into a
sequence of binary digits
\h’\n[lss]u’bind() ? Binds a yabasic-program and
the yabasic-interpreter together into a
\h’\n[lss]u’standalone program.
\h’\n[lss]u’box ? draw a rectangle. A synonym
for rectangle
\h’\n[lss]u’break ? breaks out of one or more
loops or switch statements
\h’\n[lss]u’Name
\h’\n[lss]u’color ? change color for background of graphic window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’backcolour
red,green,blue
\h’\n[lss]u’backcolour
"red,green,blue"
\h’\n[lss]u’Description
\h’\n[lss]u’Change
the color, that becomes visible, if any portion of the
window is erased,
\h’\n[lss]u’e.g. after clear window or clear
line. Note however, that parts of the window,
\h’\n[lss]u’that display the old background
color will not change.
\h’\n[lss]u’As
with the color-command, the new background color can either
be specified as
\h’\n[lss]u’a triple of three numbers or as a
single string, that contains those three
\h’\n[lss]u’numbers separated by commas.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 255,255
\h’\n[lss]u’for x=10 to 235 step 10:for y=10 to
235 step 10
\h’\n[lss]u’backcolour x,y,0
\h’\n[lss]u’clear window
\h’\n[lss]u’sleep 1
\h’\n[lss]u’next y:next x
\h’\n[lss]u’This
changes the background colour of the graphic window
repeatedly and clears
\h’\n[lss]u’it every time, so that it is filled
with the new background colour.
\h’\n[lss]u’See also
\h’\n[lss]u’open window, color, line, rectangle, triangle, circle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’backcolour ? see backcolor
\h’\n[lss]u’Synopsis
\h’\n[lss]u’backcolour
red,green,blue
\h’\n[lss]u’backcolour
"red,green,blue"
\h’\n[lss]u’See also
\h’\n[lss]u’color
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’beep ? ring the bell within your computer; a synonym for bell
\h’\n[lss]u’Synopsis
\h’\n[lss]u’beep
\h’\n[lss]u’Description
\h’\n[lss]u’The
bell-command rings the bell within your computer once. This
command is not
\h’\n[lss]u’a sound-interface, so you can
neither vary the length or the height of the
\h’\n[lss]u’sound (technically, it just prints
\a). bell is exactly the same as beep.
\h’\n[lss]u’Example
\h’\n[lss]u’beep:print "This is a problem ..."
\h’\n[lss]u’See also
\h’\n[lss]u’beep
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’bell ? ring the bell within your computer (just as beep)
\h’\n[lss]u’Synopsis
\h’\n[lss]u’bell
\h’\n[lss]u’Description
\h’\n[lss]u’The
beep-command rings the bell within your computer once. beep
is a synonym
\h’\n[lss]u’for bell.
\h’\n[lss]u’Example
\h’\n[lss]u’print "This is a problem ...":beep
\h’\n[lss]u’See also
\h’\n[lss]u’bell
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’bin$() ? converts a number into a sequence of binary digits
\h’\n[lss]u’Synopsis
\h’\n[lss]u’hexadecimal$=bin$(decimal)
\h’\n[lss]u’Description
\h’\n[lss]u’The
bin$-function takes a single numeric argument an converts it
into a string
\h’\n[lss]u’of binary digits (i.e. zeroes and
ones). If you pass a negative number to bin$,
\h’\n[lss]u’the resulting string will be
preceded by a ’-’.
\h’\n[lss]u’If
you want to convert the other way around (i.e. from binary
to decimal) you
\h’\n[lss]u’may use the dec-function.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 100
\h’\n[lss]u’print bin$(a)
\h’\n[lss]u’next a
\h’\n[lss]u’This example prints the binary representation of all digits between 1 and 100.
\h’\n[lss]u’See also
\h’\n[lss]u’hex$, dec
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’bind()
? Binds a yabasic-program and the yabasic-interpreter
together into a
\h’\n[lss]u’standalone program.
\h’\n[lss]u’Synopsis
\h’\n[lss]u’bind("foo.exe")
\h’\n[lss]u’Description
\h’\n[lss]u’The
bind-command combines your own yabasic-program (plus all the
libraries it
\h’\n[lss]u’does import) and the interpreter by
copying them into a new file, whose name is
\h’\n[lss]u’passed as an argument. This new
program may then be executed on any computer,
\h’\n[lss]u’even if it does not have yabasic
installed.
\h’\n[lss]u’Please see the section about creating a standalone-program for details.
\h’\n[lss]u’Example
\h’\n[lss]u’if
(!peek("isbound")) then
\h’\n[lss]u’bind "foo"
\h’\n[lss]u’print "Successfully created the
standalone executable ’foo’ !"
\h’\n[lss]u’exit
\h’\n[lss]u’endif
\h’\n[lss]u’print "Hello World !"
\h’\n[lss]u’This example creates a standalone program foo from itself.
\h’\n[lss]u’See also
\h’\n[lss]u’The
section about creating a standalone-program, the
peek-function and the
\h’\n[lss]u’command line options.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’box ? draw a rectangle. A synonym for rectangle
\h’\n[lss]u’Synopsis
\h’\n[lss]u’See the rectangle-command.
\h’\n[lss]u’Description
\h’\n[lss]u’The
box-command does exactly the same as the rectangle-command;
it is just a
\h’\n[lss]u’synonym. Therefore you should refer
to the entry for the rectangle-command for
\h’\n[lss]u’further information.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’break ? breaks out of one or more loops or switch statements
\h’\n[lss]u’Synopsis
\h’\n[lss]u’break
\h’\n[lss]u’break 2
\h’\n[lss]u’Description
\h’\n[lss]u’break
transfers control immediately outside the enclosing loop or
switch
\h’\n[lss]u’statement. This is the preferred way
of leaving a such a statement (rather than
\h’\n[lss]u’goto, which is still possible in
most cases). An optional digit allows one to
\h’\n[lss]u’break out of multiple levels, e.g.
to leave a loop from within a switch
\h’\n[lss]u’statement. Please note, that only a
literal (e.g. 2) is allowed at this
\h’\n[lss]u’location.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 10
\h’\n[lss]u’break
\h’\n[lss]u’print "Hi"
\h’\n[lss]u’next a
\h’\n[lss]u’while(1)
\h’\n[lss]u’break
\h’\n[lss]u’print "Hi"
\h’\n[lss]u’wend
\h’\n[lss]u’repeat
\h’\n[lss]u’break
\h’\n[lss]u’print "Hi"
\h’\n[lss]u’until(0)
\h’\n[lss]u’switch
1
\h’\n[lss]u’case 1:break
\h’\n[lss]u’case 2:case 3:print "Hi"
\h’\n[lss]u’end switch
\h’\n[lss]u’This
example prints nothing at all, because each of the loops
(and the
\h’\n[lss]u’switch-statement) does an immediate
break (before it could print any "Hi").
\h’\n[lss]u’See also
\h’\n[lss]u’for, while, repeat and switch.
\h’\n[lss]u’C
\h’\n[lss]u’case
? mark the different cases within a switch-statement
\h’\n[lss]u’ceil() ? compute the ceiling for its
(float) argument.
\h’\n[lss]u’chomp$() ? Remove a single trailing
newline from its string-argument; if the
\h’\n[lss]u’string does not end in a newline,
the string is returned unchanged.
\h’\n[lss]u’chr$() ? accepts a number and
returns the character at this position within the
\h’\n[lss]u’ascii charset
\h’\n[lss]u’circle ? draws a circle in the
graphic-window
\h’\n[lss]u’clear ? Erase circles, rectangles or
triangles
\h’\n[lss]u’clear screen ? erases the text
window
\h’\n[lss]u’clear window ? clear the graphic
window and begin a new page, if printing is
\h’\n[lss]u’under way
\h’\n[lss]u’close ? close a file, which has been
opened before
\h’\n[lss]u’close curve ? close a curve, that
has been drawn by the line-command
\h’\n[lss]u’close printer ? stops printing of
graphics
\h’\n[lss]u’close window ? close the
graphics-window
\h’\n[lss]u’color ? change color for any
subsequent drawing-command
\h’\n[lss]u’colour ? see color
\h’\n[lss]u’compile ? compile a string with
yabasic-code on the fly
\h’\n[lss]u’continue ? start the next iteration
of a for-, do-, repeat- or while-loop
\h’\n[lss]u’cos() ? return the cosine of its
single argument
\h’\n[lss]u’Name
\h’\n[lss]u’case ? mark the different cases within a switch-statement
\h’\n[lss]u’Synopsis
\h’\n[lss]u’switch
a
\h’\n[lss]u’case 1
\h’\n[lss]u’case 2
\h’\n[lss]u’?
\h’\n[lss]u’end switch
\h’\n[lss]u’?
\h’\n[lss]u’switch
a$
\h’\n[lss]u’case "a"
\h’\n[lss]u’case "b"
\h’\n[lss]u’?
\h’\n[lss]u’end switch
\h’\n[lss]u’Description
\h’\n[lss]u’Please see the switch-statement.
\h’\n[lss]u’Example
\h’\n[lss]u’input
a
\h’\n[lss]u’switch(a)
\h’\n[lss]u’case 1:print "one":break
\h’\n[lss]u’case 2:print "two":break
\h’\n[lss]u’default:print "more"
\h’\n[lss]u’end switch
\h’\n[lss]u’Depending
on your input (a number is expected) this code will print
one or two
\h’\n[lss]u’or otherwise more.
\h’\n[lss]u’See also
\h’\n[lss]u’switch
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’ceil() ? compute the ceiling for its (float) argument.
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print ceil(x)
\h’\n[lss]u’Description
\h’\n[lss]u’The
ceil-function returns the smallest integer number, that is
larger or equal
\h’\n[lss]u’than its argument.
\h’\n[lss]u’Example
\h’\n[lss]u’print
ceil(1.5),floor(1.5)
\h’\n[lss]u’print ceil(2),floor(2)
\h’\n[lss]u’Comparing
functions ceil and floor, gives a first line of output (1
2), showing
\h’\n[lss]u’that ceil is less or equal than
floor; but as the second line of output (2 2)
\h’\n[lss]u’shows, the two functions give equal
results for integer arguments.
\h’\n[lss]u’See also
\h’\n[lss]u’floor, int, frac
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’chomp$()
? Remove a single trailing newline from its string-argument;
if the
\h’\n[lss]u’string does not end in a newline,
the string is returned unchanged.
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print chomp$("Hallo !\n")
\h’\n[lss]u’Description
\h’\n[lss]u’The
chomp$-function checks, if its string-argument ends in a
newline and
\h’\n[lss]u’removes it eventually; for this
purpose chomp$ can replace an if-statement.
\h’\n[lss]u’This can be especially useful, when
you deal with input from external sources
\h’\n[lss]u’like system$.
\h’\n[lss]u’You
may apply chomp$ freely, as it only acts, if there is a
newline to remove;
\h’\n[lss]u’note however, that user-input, that
comes from the normal input-statement, does
\h’\n[lss]u’not need such a treatment, because
it already comes without a newline.
\h’\n[lss]u’Example
\h’\n[lss]u’The
following yabasic-program uses the unix-command whoami to
get the username
\h’\n[lss]u’of the current user in order to
greet him personally. This is done twice: First
\h’\n[lss]u’with the chomp$-function and then
again with with an equivalent if-statement:
\h’\n[lss]u’print "Hello " + chomp$(system$("whoami")) + " !"
\h’\n[lss]u’user$
= system$("whoami")
\h’\n[lss]u’if (right$(user$,1)="\n")
user$=left$(user$,len(user$)-1)
\h’\n[lss]u’print "Hello again " +
user$ + " !"
\h’\n[lss]u’See also
\h’\n[lss]u’system$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’chr$()
? accepts a number and returns the character at this
position within the
\h’\n[lss]u’ascii charset
\h’\n[lss]u’Synopsis
\h’\n[lss]u’character$=chr$(ascii)
\h’\n[lss]u’Description
\h’\n[lss]u’The
chr$-function is the opposite of the asc-function. It looks
up and returns
\h’\n[lss]u’the character at the given position
within the ascii-charset. It’s typical use
\h’\n[lss]u’is to construct nonprintable
characters which do not occur on your keyboard.
\h’\n[lss]u’Nevertheless
you won’t use chr$ as often as you might think,
because the most
\h’\n[lss]u’important nonprintable characters
can be constructed using escape-sequences
\h’\n[lss]u’using the \-character (e.g. you
might use \n instead of chr$(10) wherever you
\h’\n[lss]u’want to use the
newline-character).
\h’\n[lss]u’Example
\h’\n[lss]u’print "a",chr$(10),"b"
\h’\n[lss]u’This
will print the letters ’a’ and ’b’
in different lines because of the
\h’\n[lss]u’intervening newline-character, which
is returned by chr$(10).
\h’\n[lss]u’See also
\h’\n[lss]u’asc
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’circle ? draws a circle in the graphic-window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’circle
x,y,r
\h’\n[lss]u’clear circle x,y,r
\h’\n[lss]u’fill circle x,y,r
\h’\n[lss]u’clear fill circle x,y,r
\h’\n[lss]u’Description
\h’\n[lss]u’The
circle-command accepts three parameters: The x- and
y-coordinates of the
\h’\n[lss]u’center and the radius of the
circle.
\h’\n[lss]u’Some more observations related with the circle-command:
\h’\n[lss]u’* The graphic-window must have been opened already.
\h’\n[lss]u’* The circle may well extend over the boundaries of the window.
\h’\n[lss]u’*
If you have issued open printer before, the circle will
finally appear in
\h’\n[lss]u’the printed hard copy of the
window.
\h’\n[lss]u’* fill circle will draw a filled (with black ink) circle.
\h’\n[lss]u’* clear circle will erase (or clear) the outline of the circle.
\h’\n[lss]u’*
clear fill circle or fill clear circle will erase the full
area of the
\h’\n[lss]u’circle.
\h’\n[lss]u’Example
\h’\n[lss]u’open window 200,200
\h’\n[lss]u’for
n=1 to 2000
\h’\n[lss]u’x=ran(200)
\h’\n[lss]u’y=ran(200)
\h’\n[lss]u’fill circle x,y,10
\h’\n[lss]u’clear fill circle x,y,8
\h’\n[lss]u’next n
\h’\n[lss]u’This
code will open a window and draw 2000 overlapping circles
within. Each
\h’\n[lss]u’circle is drawn in two steps: First
it is filled with black ink (fill circle
\h’\n[lss]u’x,y,10), then most of this circle is
erased again (clear fill circle x,y,8). As
\h’\n[lss]u’a result each circle is drawn with
an opaque white interior and a 2-pixel
\h’\n[lss]u’outline (2-pixel, because the radii
differ by two).
\h’\n[lss]u’See also
\h’\n[lss]u’open window, open printer, line, rectangle, triangle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’clear ? Erase circles, rectangles or triangles
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear
rectangle 10,10,90,90
\h’\n[lss]u’clear fill circle 50,50,20
\h’\n[lss]u’clear triangle 10,10,20,20,50,30
\h’\n[lss]u’Description
\h’\n[lss]u’May
be used within the circle, rectangle or triangle command and
causes these
\h’\n[lss]u’shapes to be erased (i.e. be drawn
in the colour of the background).
\h’\n[lss]u’fill
can be used in conjunction with and wherever the fill-clause
may appear.
\h’\n[lss]u’Used alone, clear will erase the
outline (not the interior) of the shape
\h’\n[lss]u’(circle, rectangle or triangle);
together with fill the whole shape (including
\h’\n[lss]u’its interior) is erased.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’fill circle 100,100,50
\h’\n[lss]u’clear fill rectangle 10,10,90,90
\h’\n[lss]u’This opens a window and draws a pacman-like figure.
\h’\n[lss]u’See also
\h’\n[lss]u’clear, circle, rectangle, triangle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’clear screen ? erases the text window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear screen
\h’\n[lss]u’Description
\h’\n[lss]u’clear
screen erases the text window (the window where the output
of print
\h’\n[lss]u’appears).
\h’\n[lss]u’It
must be issued at least once, before some advanced
screen-commands (e.g.
\h’\n[lss]u’print at or inkey$) may be called;
this requirement is due to some limitations
\h’\n[lss]u’of the curses-library, which is used
by yabasic under Unix for some commands.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’print "Please press a key :
";
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’print a$
\h’\n[lss]u’The
clear screen command is essential here; if it would be
omitted, yabasic
\h’\n[lss]u’would issue an error ("need to
call ’clear screen’ first") while trying to
\h’\n[lss]u’execute the inkey$-function.
\h’\n[lss]u’See also
\h’\n[lss]u’inkey$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’clear
window ? clear the graphic window and begin a new page, if
printing is
\h’\n[lss]u’under way
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear window
\h’\n[lss]u’Description
\h’\n[lss]u’clear
window clears the graphic window. If you have started
printing the
\h’\n[lss]u’graphic via open printer, the clear
window-command starts a new page as well.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’open printer "t.ps"
\h’\n[lss]u’for
a=1 to 10
\h’\n[lss]u’if (a>1) clear window
\h’\n[lss]u’text 100,100,"Hallo
"+str$(a)
\h’\n[lss]u’next a
\h’\n[lss]u’close
printer
\h’\n[lss]u’close window
\h’\n[lss]u’This
example prints 10 pages, with the text "Hello 1",
"Hello 2", ? and so on.
\h’\n[lss]u’The clear screen-command clears the
graphics window and starts a new page.
\h’\n[lss]u’See also
\h’\n[lss]u’open window, open printer
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’close ? close a file, which has been opened before
\h’\n[lss]u’Synopsis
\h’\n[lss]u’close
filenum
\h’\n[lss]u’close # filenum
\h’\n[lss]u’Description
\h’\n[lss]u’The
close-command closes an open file. You should issue this
command as soon as
\h’\n[lss]u’you are done with reading from or
writing to a file.
\h’\n[lss]u’Example
\h’\n[lss]u’open
"my.data" for reading as 1
\h’\n[lss]u’input #1 a
\h’\n[lss]u’print a
\h’\n[lss]u’close 1
\h’\n[lss]u’This
program opens the file "my.data", reads a number
from it, prints this
\h’\n[lss]u’number and closes the file
again.
\h’\n[lss]u’See also
\h’\n[lss]u’open
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’close curve ? close a curve, that has been drawn by the line-command
\h’\n[lss]u’Synopsis
\h’\n[lss]u’new
curve
\h’\n[lss]u’line to x1,y1
\h’\n[lss]u’?
\h’\n[lss]u’close curve
\h’\n[lss]u’Description
\h’\n[lss]u’The
close curve-command closes a sequence of lines, that has
been drawn by
\h’\n[lss]u’repeated line to-commands.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’new curve
\h’\n[lss]u’line to 100,50
\h’\n[lss]u’line to 150,150
\h’\n[lss]u’line to 50,150
\h’\n[lss]u’close curve
\h’\n[lss]u’This
example draws a triangle: The three line to-commands draw
two lines; the
\h’\n[lss]u’final line is however not drawn
explicitly, but drawn by the close
\h’\n[lss]u’curve-command.
\h’\n[lss]u’See also
\h’\n[lss]u’line, new curve
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’close printer ? stops printing of graphics
\h’\n[lss]u’Synopsis
\h’\n[lss]u’close printer
\h’\n[lss]u’Description
\h’\n[lss]u’The
close printer-command ends the printing graphics. Between
open printer and
\h’\n[lss]u’close printer everything you draw
(e.g. circles, lines ?) is sent to your
\h’\n[lss]u’printer. close printer puts an end
to printing and will make your printer eject
\h’\n[lss]u’the page.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’open printer
\h’\n[lss]u’circle 100,100,50
\h’\n[lss]u’close printer
\h’\n[lss]u’close window
\h’\n[lss]u’As
soon as close printer is executed, your printer will eject a
page with a
\h’\n[lss]u’circle on it.
\h’\n[lss]u’See also
\h’\n[lss]u’open printer
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’close window ? close the graphics-window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’close window
\h’\n[lss]u’Description
\h’\n[lss]u’The
close window-command closes the graphics-window, i.e. it
makes it disappear
\h’\n[lss]u’from your screen. It includes an
implicit close printer, if a printer has been
\h’\n[lss]u’opened previously.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’circle 100,100,50
\h’\n[lss]u’close window
\h’\n[lss]u’This
example will open a window, draw a circle and close the
window again; all
\h’\n[lss]u’this without any pause or delay, so
the window will be closed before you may
\h’\n[lss]u’regard the circle..
\h’\n[lss]u’See also
\h’\n[lss]u’open window
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’color ? change color for any subsequent drawing-command
\h’\n[lss]u’Synopsis
\h’\n[lss]u’colour
red,green,blue
\h’\n[lss]u’colour
"red,green,blue"
\h’\n[lss]u’Description
\h’\n[lss]u’Change
the color, in which lines, dots, circles, rectangles or
triangles are
\h’\n[lss]u’drawn. The color-command accepts
three numbers in the range 0 ? 255 (as in the
\h’\n[lss]u’first line of the synopsis above).
Those numbers specify the intensity for the
\h’\n[lss]u’primary colors red, green and blue
respectively. As an example 255,0,0 is red
\h’\n[lss]u’and 255,255,0 is yellow.
\h’\n[lss]u’Alternatively
you may specify the color with a single string (as in the
second
\h’\n[lss]u’line of the synopsis above); this
string should contain three numbers,
\h’\n[lss]u’separated by commas. As an example
"255,0,255" would be violet. Using this
\h’\n[lss]u’variant of the colour-command, you
may use symbolic names for colours:
\h’\n[lss]u’open
window 100,100
\h’\n[lss]u’yellow$="255,255,0"
\h’\n[lss]u’color yellow$
\h’\n[lss]u’text 50,50,"Hallo"
\h’\n[lss]u’, which reads much clearer.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 255,255
\h’\n[lss]u’for x=10 to 235 step 10:for y=10 to
235 step 10
\h’\n[lss]u’colour x,y,0
\h’\n[lss]u’fill rectangle x,y,x+10,y+10
\h’\n[lss]u’next y:next x
\h’\n[lss]u’This
fills the window with colored rectangles. However, none of
the used
\h’\n[lss]u’colours contains any shade of blue,
because the color-command has always 0 as a
\h’\n[lss]u’third argument.
\h’\n[lss]u’See also
\h’\n[lss]u’open window, backcolor, line, rectangle, triangle, circle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’colour ? see color
\h’\n[lss]u’Synopsis
\h’\n[lss]u’colour
red,green,blue
\h’\n[lss]u’colour
"red,green,blue"
\h’\n[lss]u’See also
\h’\n[lss]u’color
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’compile ? compile a string with yabasic-code on the fly
\h’\n[lss]u’Synopsis
\h’\n[lss]u’compile(code$)
\h’\n[lss]u’Description
\h’\n[lss]u’This
is an advanced command (closely related with the
execute-command). It
\h’\n[lss]u’allows you to compile a string of
yabasic-code (which is the only argument).
\h’\n[lss]u’Afterwards the compiled code is a
normal part of your program.
\h’\n[lss]u’Note, that there is no way to remove the compiled code.
\h’\n[lss]u’Example
\h’\n[lss]u’compile("sub
mysub(a):print a:end sub")
\h’\n[lss]u’mysub(2)
\h’\n[lss]u’This
example creates a function named mysub, which simply prints
its single
\h’\n[lss]u’argument.
\h’\n[lss]u’See also
\h’\n[lss]u’execute
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’continue ? start the next iteration of a for-, do-, repeat- or while-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’continue
\h’\n[lss]u’Description
\h’\n[lss]u’You
may use continue within any loop to start the next iteration
immediately.
\h’\n[lss]u’Depending on the type of the loop,
the loop-condition will or will not be
\h’\n[lss]u’checked. Especially: for- and
while-loops will evaluate their respective
\h’\n[lss]u’conditions, do- and repeat-loops
will not.
\h’\n[lss]u’Remark:
Another way to change the flow of execution within a loop,
is the
\h’\n[lss]u’break-command.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 100
\h’\n[lss]u’if mod(a,2)=0 continue
\h’\n[lss]u’print a
\h’\n[lss]u’next a
\h’\n[lss]u’This example will print all odd numbers between 1 and 100.
\h’\n[lss]u’See also
\h’\n[lss]u’for, do, repeat, while, break
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’cos() ? return the cosine of its single argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=cos(angle)
\h’\n[lss]u’Description
\h’\n[lss]u’The cos-function expects an angle (in radians) and returns its cosine.
\h’\n[lss]u’Example
\h’\n[lss]u’print cos(pi)
\h’\n[lss]u’This example will print -1.
\h’\n[lss]u’See also
\h’\n[lss]u’acos, sin
\h’\n[lss]u’D
\h’\n[lss]u’data
? introduces a list of data-items
\h’\n[lss]u’date$ ? returns a string with
various components of the current date
\h’\n[lss]u’dec() ? convert a base 2 or base 16
number into decimal form
\h’\n[lss]u’default ? mark the default-branch
within a switch-statement
\h’\n[lss]u’dim ? create an array prior to its
first use
\h’\n[lss]u’do ? start a (conditionless) do-loop
\h’\n[lss]u’doc ? special comment, which might
be retrieved by the program itself
\h’\n[lss]u’docu$ ? special array, containing
the contents of all docu-statement within the
\h’\n[lss]u’program
\h’\n[lss]u’dot ? draw a dot in the
graphic-window
\h’\n[lss]u’Name
\h’\n[lss]u’data ? introduces a list of data-items
\h’\n[lss]u’Synopsis
\h’\n[lss]u’data
9,"world"
\h’\n[lss]u’?
\h’\n[lss]u’read b,a$
\h’\n[lss]u’Description
\h’\n[lss]u’The
data-keyword introduces a list of comma-separated list of
strings or
\h’\n[lss]u’numbers, which may be retrieved with
the read-command.
\h’\n[lss]u’The
data-command itself does nothing; it just stores data. A
single
\h’\n[lss]u’data-command may precede an
arbitrarily long list of values, in which strings
\h’\n[lss]u’or numbers may be mixed at will.
\h’\n[lss]u’yabasic
internally uses a data-pointer to keep track of the current
location
\h’\n[lss]u’within the data-list; this pointer
may be reset with the restore-command.
\h’\n[lss]u’Example
\h’\n[lss]u’do
\h’\n[lss]u’restore
\h’\n[lss]u’for a=1 to 4
\h’\n[lss]u’read num$,num
\h’\n[lss]u’print num$,"=",num
\h’\n[lss]u’next a
\h’\n[lss]u’loop
\h’\n[lss]u’data
"eleven",11,"twelve",12,"thirteen",13,"fourteen",14
\h’\n[lss]u’This
example just prints a series of lines eleven=11 up to
fourteen=14 and so
\h’\n[lss]u’on without end.
\h’\n[lss]u’The
restore-command ensures that the list of data-items is read
from the start
\h’\n[lss]u’with every iteration.
\h’\n[lss]u’See also
\h’\n[lss]u’read, restore
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’date$ ? returns a string with various components of the current date
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=date$
\h’\n[lss]u’Description
\h’\n[lss]u’The
date$-function (which must be called without parentheses;
i.e. date$()
\h’\n[lss]u’would be an error) returns a string
containing various components of a date; an
\h’\n[lss]u’example would be
4-05-27-2004-Thu-May. This string consists of various fields
\h’\n[lss]u’separated by hyphens
("-"):
\h’\n[lss]u’*
The day within the week as a number in the range 0 (=Sunday)
to 6 (=
\h’\n[lss]u’Saturday) (in the example above: 4,
i.e. Thursday).
\h’\n[lss]u’*
The month as a number in the range 1 (=January) to 12
(=December) (in the
\h’\n[lss]u’example: 5 which stands for
May).
\h’\n[lss]u’*
The day within the month as a number in the range 1 to 31
(in the example:
\h’\n[lss]u’27).
\h’\n[lss]u’*
The full, 4-digit year (in the example: 2004, which reminds
me that I
\h’\n[lss]u’should adjust the clock within my
computer ?).
\h’\n[lss]u’* The abbreviated name of the day within the week (Mon to Sun).
\h’\n[lss]u’* The abbreviated name of the month (Jan to Dec).
\h’\n[lss]u’Therefore
the whole example above (4-05-27-2004-Thu-May) would read:
day 4 in
\h’\n[lss]u’the week (counting from 0), May 27
in the year 2004, which is a Thursday in
\h’\n[lss]u’May.
\h’\n[lss]u’Note,
that all fields within the string returned by date$ have a
fixed with
\h’\n[lss]u’(numbers are padded with zeroes);
therefore it is easy to extract the various
\h’\n[lss]u’fields of a date format with
mid$.
\h’\n[lss]u’Example
\h’\n[lss]u’rem Two ways to print the same ...
\h’\n[lss]u’print mid$(date$,3,10)
\h’\n[lss]u’dim
fields$(6)
\h’\n[lss]u’a=split(date$,fields$(),"-")
\h’\n[lss]u’print
fields$(2),"-",fields$(3),"-",fields$(4)
\h’\n[lss]u’This
example shows two different techniques to extract components
from the
\h’\n[lss]u’value returned by date$. The
mid$-function is the preferred way, but you could
\h’\n[lss]u’just as well split the return-value
of date$ at every "-" and store the result
\h’\n[lss]u’within an array of strings.
\h’\n[lss]u’See also
\h’\n[lss]u’time$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’dec() ? convert a base 2 or base 16 number into decimal form
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a=dec(number$)
\h’\n[lss]u’a=dec(number$,base)
\h’\n[lss]u’Description
\h’\n[lss]u’The
dec-function takes the string-representation of a base-2 or
base-16 (which
\h’\n[lss]u’is the default) number and converts
it into a decimal number. The optional
\h’\n[lss]u’second argument (base) might be used
to specify a base other than 16. However,
\h’\n[lss]u’currently only base 2 or base 16 are
supported. Please note, that for base 16
\h’\n[lss]u’you may write literals in the usual
way, by preceding them with 0x, e.g. like
\h’\n[lss]u’print 0xff
\h’\n[lss]u’; this may save you from applying the dec altogether.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a binary number: " a$
\h’\n[lss]u’print a$," is
",dec(a$)
\h’\n[lss]u’See also
\h’\n[lss]u’bin$, hex$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’default ? mark the default-branch within a switch-statement
\h’\n[lss]u’Synopsis
\h’\n[lss]u’switch
a+3
\h’\n[lss]u’case 1
\h’\n[lss]u’?
\h’\n[lss]u’case 2
\h’\n[lss]u’?
\h’\n[lss]u’default
\h’\n[lss]u’?
\h’\n[lss]u’end switch
\h’\n[lss]u’Description
\h’\n[lss]u’The
default-clause is an optional part of the switch-statement
(see there for
\h’\n[lss]u’more information). It introduces a
series of statements, that should be
\h’\n[lss]u’executed, if none of the cases
matches, that have been specified before (each
\h’\n[lss]u’with its own case-clause).
\h’\n[lss]u’So
default specifies a default to be executed, if none of the
explicitly named
\h’\n[lss]u’cases matches; hence its name.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Please enter a number between 0 and 6,"
\h’\n[lss]u’print "specifying a day in the
week."
\h’\n[lss]u’input d
\h’\n[lss]u’switch d
\h’\n[lss]u’case 0:print
"Monday":break
\h’\n[lss]u’case 1:print
"Tuesday":break
\h’\n[lss]u’case 2:print
"Wednesday":break
\h’\n[lss]u’case 3:print
"Thursday":break
\h’\n[lss]u’case 4:print
"Friday":break
\h’\n[lss]u’case 5:print
"Saturday":break
\h’\n[lss]u’case 6:print
"Sunday":break
\h’\n[lss]u’default:print "Hey you entered
something invalid !"
\h’\n[lss]u’end switch
\h’\n[lss]u’This
program translates a number between 0 and 6 into the name of
a weekday;
\h’\n[lss]u’the default-case is used to detect
(and complain about) invalid input.
\h’\n[lss]u’See also
\h’\n[lss]u’sub, case
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’dim ? create an array prior to its first use
\h’\n[lss]u’Synopsis
\h’\n[lss]u’dim
array(x,y)
\h’\n[lss]u’dim array$(x,y)
\h’\n[lss]u’Description
\h’\n[lss]u’The
dim-command prepares one or more arrays (of either strings
or numbers) for
\h’\n[lss]u’later use. This command can also be
used to enlarges an existing array.
\h’\n[lss]u’When
an array is created with the dim-statement, memory is
allocated and all
\h’\n[lss]u’elements are initialized with either
0 (for numerical arrays) or "" (for string
\h’\n[lss]u’arrays).
\h’\n[lss]u’If
the array already existed, and the dim-statement specifies a
larger size
\h’\n[lss]u’than the current size, the array is
enlarged and any old content is preserved.
\h’\n[lss]u’Note,
that dim cannot be used to shrink an array: If you specify a
size, that
\h’\n[lss]u’is smaller than the current size,
the dim-command does nothing.
\h’\n[lss]u’Finally:
To create an array, that is only known within a single
subroutine, you
\h’\n[lss]u’should use the command local, which
creates local variables as well as local
\h’\n[lss]u’arrays.
\h’\n[lss]u’Example
\h’\n[lss]u’dim
a(5,5)
\h’\n[lss]u’for x=1 to 5:for y=1 to 5
\h’\n[lss]u’a(x,y)=int(ran(100))
\h’\n[lss]u’next y:next x
\h’\n[lss]u’printmatrix(a())
\h’\n[lss]u’dim a(7,7)
\h’\n[lss]u’printmatrix(a())
\h’\n[lss]u’sub
printmatrix(ar())
\h’\n[lss]u’local x,y,p,q
\h’\n[lss]u’x=arraysize(ar(),1)
\h’\n[lss]u’y=arraysize(ar(),2)
\h’\n[lss]u’for q=1 to y
\h’\n[lss]u’for p=1 to y
\h’\n[lss]u’print ar(p,q),"\t";
\h’\n[lss]u’next p
\h’\n[lss]u’print
\h’\n[lss]u’next q
\h’\n[lss]u’end sub
\h’\n[lss]u’This
example creates a 2-dimensional array (i.e. a matrix) with
the
\h’\n[lss]u’dim-statement and fills it with
random numbers. The second dim-statement
\h’\n[lss]u’enlarges the array, all new elements
are filled with 0.
\h’\n[lss]u’The subroutine printmatrix just does, what its name says.
\h’\n[lss]u’See also
\h’\n[lss]u’arraysize, arraydim, local
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’do ? start a (conditionless) do-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’do
\h’\n[lss]u’?
\h’\n[lss]u’loop
\h’\n[lss]u’Description
\h’\n[lss]u’Starts
a loop, which is terminated by loop; everything between do
and loop will
\h’\n[lss]u’be repeated forever. This loop has
no condition, so it is an infinite loop;
\h’\n[lss]u’note however, that a break- or
goto-statement might be used to leave this loop
\h’\n[lss]u’anytime.
\h’\n[lss]u’Example
\h’\n[lss]u’do
\h’\n[lss]u’a=a+1
\h’\n[lss]u’print a
\h’\n[lss]u’if (a>100) break
\h’\n[lss]u’loop
\h’\n[lss]u’This
example prints the numbers between 1 and 101. The
break-statement is used
\h’\n[lss]u’to leave the loop.
\h’\n[lss]u’See also
\h’\n[lss]u’loop, repeat, while, break
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’doc ? special comment, which might be retrieved by the program itself
\h’\n[lss]u’Synopsis
\h’\n[lss]u’doc
This is a comment
\h’\n[lss]u’docu This is another comment
\h’\n[lss]u’Description
\h’\n[lss]u’Introduces
a comment, which spans up to the end of the line. But other
than the
\h’\n[lss]u’rem-comment, any docu-comment is
collected within the special docu$-array and
\h’\n[lss]u’might be retrieved later on.
Moreover you might invoke yabasic -docu foo.yab on
\h’\n[lss]u’the command line to retrieve the
embedded documentation within the program
\h’\n[lss]u’foo.yab.
\h’\n[lss]u’Instead of doc you may just as well write docu or even documentation.
\h’\n[lss]u’Example
\h’\n[lss]u’rem
Hi, this has been written by me
\h’\n[lss]u’rem
\h’\n[lss]u’doc This program asks for a number
and
\h’\n[lss]u’doc prints this number multiplied
with 2
\h’\n[lss]u’rem
\h’\n[lss]u’rem Print out rhe above message
\h’\n[lss]u’for a=1 to arraysize(docu$()):print
docu$(a):next a
\h’\n[lss]u’rem
Read and print the number
\h’\n[lss]u’input "Please input a number:
" x
\h’\n[lss]u’print x*2
\h’\n[lss]u’This
program uses the comments within its code to print out a
help message for
\h’\n[lss]u’the user.
\h’\n[lss]u’The
contents of the doc-lines are retrieved from the
docu$-array; if you do not
\h’\n[lss]u’want a comment to be collected
within this array, use the rem-statement
\h’\n[lss]u’instead.
\h’\n[lss]u’See also
\h’\n[lss]u’docu$, rem
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’docu$
? special array, containing the contents of all
docu-statement within the
\h’\n[lss]u’program
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=docu$(1)
\h’\n[lss]u’Description
\h’\n[lss]u’Before
your program is executed, yabasic collects the content of
all the
\h’\n[lss]u’doc-statements within your program
within this 1-dimensional array (well only
\h’\n[lss]u’those within the main-program,
libraries are skipped).
\h’\n[lss]u’You may use the arraysize function to find out, how many lines it contains.
\h’\n[lss]u’Example
\h’\n[lss]u’docu
\h’\n[lss]u’docu This program reads two numbers
\h’\n[lss]u’docu and adds them.
\h’\n[lss]u’docu
\h’\n[lss]u’rem
retrieve and print the embedded documentation
\h’\n[lss]u’for a=1 to arraysize(docu$(),1)
\h’\n[lss]u’print docu$(a)
\h’\n[lss]u’next a
\h’\n[lss]u’input
"First number: " b
\h’\n[lss]u’input "Second number: "
c
\h’\n[lss]u’print "The sum of ",b," and ",c," is ",b+c
\h’\n[lss]u’This program uses the embedded documentation to issue a usage-message.
\h’\n[lss]u’See also
\h’\n[lss]u’arraydim, rem
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’dot ? draw a dot in the graphic-window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’dot
x,y
\h’\n[lss]u’clear dot x,y
\h’\n[lss]u’Description
\h’\n[lss]u’Draws
a dot at the specified coordinates within your
graphic-window. If
\h’\n[lss]u’printing is in effect, the dot
appears on your printout too.
\h’\n[lss]u’Use
the functions peek("winheight") or
peek("winwidth") to get the size of your
\h’\n[lss]u’window and hence the boundaries of
the coordinates specified for the
\h’\n[lss]u’dot-command.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’circle 100,100,100
\h’\n[lss]u’do
\h’\n[lss]u’x=ran(200):y=ran(200)
\h’\n[lss]u’dot x,y
\h’\n[lss]u’total=total+1
\h’\n[lss]u’if
(sqrt((x-100)ˆ2+(y-100)ˆ2)<100) in=in+1
\h’\n[lss]u’print 4*in/total
\h’\n[lss]u’loop
\h’\n[lss]u’This program uses a well known algorithm to compute ?.
\h’\n[lss]u’See also
\h’\n[lss]u’line, open window
\h’\n[lss]u’E
\h’\n[lss]u’else
? mark an alternative within an if-statement
\h’\n[lss]u’elsif ? starts an alternate
condition within an if-statement
\h’\n[lss]u’end ? terminate your program
\h’\n[lss]u’endif ? ends an if-statement
\h’\n[lss]u’end sub ? ends a subroutine
definition
\h’\n[lss]u’eof ? check, if an open file
contains data
\h’\n[lss]u’eor() ? compute the bitwise
exclusive or of its two arguments
\h’\n[lss]u’error ? raise an error and terminate
your program
\h’\n[lss]u’euler ? another name for the
constant 2.71828182864
\h’\n[lss]u’execute$() ? execute a user defined
subroutine, which must return a string
\h’\n[lss]u’execute() ? execute a user defined
subroutine, which must return a number
\h’\n[lss]u’exit ? terminate your program
\h’\n[lss]u’exp() ? compute the exponential
function of its single argument
\h’\n[lss]u’export ? mark a function as globally
visible
\h’\n[lss]u’Name
\h’\n[lss]u’else ? mark an alternative within an if-statement
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(?) then
\h’\n[lss]u’?
\h’\n[lss]u’else
\h’\n[lss]u’?
\h’\n[lss]u’endif
\h’\n[lss]u’Description
\h’\n[lss]u’The
else-statement introduces the alternate branch of an
if-statement. I.e. it
\h’\n[lss]u’starts the sequence of statements,
which is executed, if the condition of the
\h’\n[lss]u’if-statement is not true.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a number: " a
\h’\n[lss]u’if (mod(a,2)=1) then
\h’\n[lss]u’print a," is odd."
\h’\n[lss]u’else
\h’\n[lss]u’print a," is even."
\h’\n[lss]u’endif
\h’\n[lss]u’This program detects, if the number you have entered is even or odd.
\h’\n[lss]u’See also
\h’\n[lss]u’if
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’elsif ? starts an alternate condition within an if-statement
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(?) then
\h’\n[lss]u’?
\h’\n[lss]u’elseif (?)
\h’\n[lss]u’?
\h’\n[lss]u’elsif (?) then
\h’\n[lss]u’?
\h’\n[lss]u’else
\h’\n[lss]u’?
\h’\n[lss]u’endif
\h’\n[lss]u’Description
\h’\n[lss]u’The
elsif-statement is used to select a single alternative among
a series of
\h’\n[lss]u’choices.
\h’\n[lss]u’With
each elsif-statement you may specify a condition, which is
tested, if the
\h’\n[lss]u’main condition (specified with the
if-statement) has failed. Note that elsif
\h’\n[lss]u’might be just as well written as
elseif.
\h’\n[lss]u’Within
the example below, two variables a and b are tested against
a range of
\h’\n[lss]u’values. The variable a is tested
with the elsif-statement. The very same tests
\h’\n[lss]u’are performed for the variable b
too; but here an involved series of
\h’\n[lss]u’if-else-statements is employed,
making the tests much more obscure.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a number: " a
\h’\n[lss]u’if (a<0) then
\h’\n[lss]u’print "less than 0"
\h’\n[lss]u’elseif (a<=10) then
\h’\n[lss]u’print "between 0 and 10"
\h’\n[lss]u’elsif (a<=20)
\h’\n[lss]u’print "between 11 and 20"
\h’\n[lss]u’else
\h’\n[lss]u’print "over 20"
\h’\n[lss]u’endif
\h’\n[lss]u’input
"Please enter another number: " b
\h’\n[lss]u’if (b<0) then
\h’\n[lss]u’print "less than 0"
\h’\n[lss]u’else
\h’\n[lss]u’if (b<=10) then
\h’\n[lss]u’print "between 0 and 10"
\h’\n[lss]u’else
\h’\n[lss]u’if (b<=20) then
\h’\n[lss]u’print "between 11 and 20"
\h’\n[lss]u’else
\h’\n[lss]u’print "over 20"
\h’\n[lss]u’endif
\h’\n[lss]u’endif
\h’\n[lss]u’endif
\h’\n[lss]u’Note,
that the very same tests are performed for the variables a
and b, but can
\h’\n[lss]u’be stated much more clearly with the
elsif-statement.
\h’\n[lss]u’Note,
that elsif might be written as elseif too, and that the
keyword then is
\h’\n[lss]u’optional.
\h’\n[lss]u’See also
\h’\n[lss]u’if, else
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’end ? terminate your program
\h’\n[lss]u’Synopsis
\h’\n[lss]u’end
\h’\n[lss]u’Description
\h’\n[lss]u’Terminate your program. Much (but not exactly) like the exit command.
\h’\n[lss]u’Note,
that end may not end your program immediately; if you have
opened a
\h’\n[lss]u’window or called clear screen,
yabasic assumes, that your user wants to study
\h’\n[lss]u’the output of your program after it
has ended; therefore it issues the line
\h’\n[lss]u’---Program done, press RETURN--- and
waits for a key to be pressed. If you do
\h’\n[lss]u’not like this behaviour, consider
using exit.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Do you want to continue ?"
\h’\n[lss]u’input "Please answer y(es) or
n(o): " a$
\h’\n[lss]u’if
(lower$(left$(a$,1))="n") then
\h’\n[lss]u’print "bye"
\h’\n[lss]u’end
\h’\n[lss]u’fi
\h’\n[lss]u’See also
\h’\n[lss]u’exit
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’endif ? ends an if-statement
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(?) then
\h’\n[lss]u’?
\h’\n[lss]u’endif
\h’\n[lss]u’Description
\h’\n[lss]u’The endif-statement closes (or ends) an if-statement.
\h’\n[lss]u’Note,
that endif may be written in a variety of other ways: end
if, end-if or
\h’\n[lss]u’even fi.
\h’\n[lss]u’The
endif-statement must be omitted, if the if-statement does
not contain the
\h’\n[lss]u’keyword then (see the example
below). Such an if-statement without endif
\h’\n[lss]u’extends only over a single line.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"A number please: " a
\h’\n[lss]u’if (a<10) then
\h’\n[lss]u’print "Your number is less than
10."
\h’\n[lss]u’endif
\h’\n[lss]u’REM and now without endif
\h’\n[lss]u’input
"A number please: " a
\h’\n[lss]u’if (a<10) print "Your number
is less than 10."
\h’\n[lss]u’See also
\h’\n[lss]u’if
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’end sub ? ends a subroutine definition
\h’\n[lss]u’Synopsis
\h’\n[lss]u’sub
foo(?)
\h’\n[lss]u’?
\h’\n[lss]u’end sub
\h’\n[lss]u’Description
\h’\n[lss]u’Marks
the end of a subroutine-definition (which starts with the
sub-keyword).
\h’\n[lss]u’The whole concept of subroutines is
explained within the entry for sub.
\h’\n[lss]u’Example
\h’\n[lss]u’print foo(3)
\h’\n[lss]u’sub
foo(a)
\h’\n[lss]u’return a*2
\h’\n[lss]u’end sub
\h’\n[lss]u’This
program prints out 6. The subroutine foo simply returns
twice its
\h’\n[lss]u’argument.
\h’\n[lss]u’See also
\h’\n[lss]u’sub
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’eof ? check, if an open file contains data
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
1,"foo.bar"
\h’\n[lss]u’if (eof(1)) then
\h’\n[lss]u’?
\h’\n[lss]u’end if
\h’\n[lss]u’Description
\h’\n[lss]u’The
eof-function checks, if there is still data left within an
open file. As an
\h’\n[lss]u’argument it expects the file-number
as returned by (or used within) the
\h’\n[lss]u’open-function (or statement).
\h’\n[lss]u’Example
\h’\n[lss]u’a=open("foo.bar")
\h’\n[lss]u’while(not eof(a))
\h’\n[lss]u’input #a,a$
\h’\n[lss]u’print a$
\h’\n[lss]u’end while
\h’\n[lss]u’This
example will print the contents of the file
"foo.bar". The eof-function
\h’\n[lss]u’will terminate the loop, if there is
no more data left within the file.
\h’\n[lss]u’See also
\h’\n[lss]u’open
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’eor() ? compute the bitwise exclusive or of its two arguments
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print eor(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’The
eor-function takes two arguments and computes their bitwise
exclusive or.
\h’\n[lss]u’See your favorite introductory text
on informatics for an explanation of this
\h’\n[lss]u’function.
\h’\n[lss]u’The
xor-function is the same as the eor function; both are
synonymous; however
\h’\n[lss]u’they have each their own
description, so you may check out the entry of xor for
\h’\n[lss]u’a slightly different view.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=0 to 3
\h’\n[lss]u’for b=0 to 3
\h’\n[lss]u’print fill$(bin$(a))," eor
",fill$(bin$(b))," = ",fill$(bin$(eor(a,b)))
\h’\n[lss]u’next b
\h’\n[lss]u’next a
\h’\n[lss]u’sub
fill$(a$)
\h’\n[lss]u’return right$("0"+a$,2)
\h’\n[lss]u’end sub
\h’\n[lss]u’This
example prints a table, from which you may figure, how the
eor-function is
\h’\n[lss]u’computed.
\h’\n[lss]u’See also
\h’\n[lss]u’and, or
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’error ? raise an error and terminate your program
\h’\n[lss]u’Synopsis
\h’\n[lss]u’error "Wrong, wrong, wrong !!"
\h’\n[lss]u’Description
\h’\n[lss]u’Produces
the same kind or error messages, that yabasic itself
produces (e.g. in
\h’\n[lss]u’case of a syntax-error). The single
argument is issued along with the current
\h’\n[lss]u’line-number.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a number between 1 and 10: " a
\h’\n[lss]u’if (a<1 or a>10) error
"Oh no ..."
\h’\n[lss]u’This
program is very harsh in checking the users input; instead
of just asking
\h’\n[lss]u’again, the program terminates with
an error, if the user enters something
\h’\n[lss]u’wrong.
\h’\n[lss]u’The error message would look like this:
\h’\n[lss]u’---Error
in t.yab, line 2: Oh no ...
\h’\n[lss]u’---Error: Program stopped due to an
error
\h’\n[lss]u’See also
\h’\n[lss]u’Well,
there should be a corresponding called warning;
unfortunately ther is
\h’\n[lss]u’none yet.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’euler ? another name for the constant 2.71828182864
\h’\n[lss]u’Synopsis
\h’\n[lss]u’foo=euler
\h’\n[lss]u’Description
\h’\n[lss]u’euler
is the well known constant named after Leonard Euler; its
value is
\h’\n[lss]u’2.71828182864. euler is not a
function, so parens are not allowed (i.e. euler()
\h’\n[lss]u’will produce an error). Finally, you
may not assign to euler; it wouldn’t sense
\h’\n[lss]u’anyway, because it is a
constant.
\h’\n[lss]u’Example
\h’\n[lss]u’print euler
\h’\n[lss]u’See also
\h’\n[lss]u’pi
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’execute$() ? execute a user defined subroutine, which must return a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print execute$("foo$","arg1","arg2")
\h’\n[lss]u’Description
\h’\n[lss]u’execute$
can be used to execute a user defined subroutine, whose name
may be
\h’\n[lss]u’specified as a string
expression.
\h’\n[lss]u’This
feature is the only way to execute a subroutine, whose name
is not known
\h’\n[lss]u’by the time you write your program.
This might happen, if you want to execute a
\h’\n[lss]u’subroutine, which is compiled (using
the compile command) during the course of
\h’\n[lss]u’execution of your program.
\h’\n[lss]u’Note
however, that the execute$-function is not the preferred
method to execute
\h’\n[lss]u’a user defined subroutine; in almost
all cases you should just execute a
\h’\n[lss]u’subroutine by writing down its name
within your yabasic program (see the
\h’\n[lss]u’example).
\h’\n[lss]u’Example
\h’\n[lss]u’print
execute$("foo$","Hello","world
!")
\h’\n[lss]u’sub foo$(a$,b$)
\h’\n[lss]u’return a$+" "+b$
\h’\n[lss]u’end sub
\h’\n[lss]u’The
example simply prints Hello world !, which is the return
value of the user
\h’\n[lss]u’defined subroutine foo$. The same
could be achieved by executing:
\h’\n[lss]u’print foo$(a$,b$)
\h’\n[lss]u’See also
\h’\n[lss]u’compile, execute
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’execute() ? execute a user defined subroutine, which must return a number
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print execute("bar","arg1","arg2")
\h’\n[lss]u’Description
\h’\n[lss]u’The
execute-function is the counterpart of the execute$-function
(please see
\h’\n[lss]u’there for some caveats). execute
executes subroutines, which returns a number.
\h’\n[lss]u’Example
\h’\n[lss]u’print
execute("bar",2,3)
\h’\n[lss]u’sub bar(a,b)
\h’\n[lss]u’return a+b
\h’\n[lss]u’end sub
\h’\n[lss]u’See also
\h’\n[lss]u’compile, execute$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’exit ? terminate your program
\h’\n[lss]u’Synopsis
\h’\n[lss]u’exit
\h’\n[lss]u’exit 1
\h’\n[lss]u’Description
\h’\n[lss]u’Terminate
your program and return any given value to the operating
system. exit
\h’\n[lss]u’is similar to end, but it will
terminate your program immediately, no matter
\h’\n[lss]u’what.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Do you want to continue ?"
\h’\n[lss]u’input "Please answer y(es) or
n(o): " a$
\h’\n[lss]u’if
(lower$(left$(a$,1))="n") exit 1
\h’\n[lss]u’See also
\h’\n[lss]u’end
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’exp() ? compute the exponential function of its single argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’foo=exp(bar)
\h’\n[lss]u’Description
\h’\n[lss]u’This
function computes e to the power of its argument, where e is
the well
\h’\n[lss]u’known euler constant
2.71828182864.
\h’\n[lss]u’The exp-function is the inverse of the log-function.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 100,100
\h’\n[lss]u’for x=0 to 100
\h’\n[lss]u’dot x,100-100*exp(x/100)/euler
\h’\n[lss]u’next x
\h’\n[lss]u’This
program plots part of the exp-function, however the range is
rather small,
\h’\n[lss]u’so that you may not recognize the
function from this plot.
\h’\n[lss]u’See also
\h’\n[lss]u’log
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’export ? mark a function as globally visible
\h’\n[lss]u’Synopsis
\h’\n[lss]u’export
sub foo(bar)
\h’\n[lss]u’?
\h’\n[lss]u’end sub
\h’\n[lss]u’Description
\h’\n[lss]u’The
export-statement is used within libraries to mark a user
defined subroutine
\h’\n[lss]u’as visible outside the library
wherein it is defined. Subroutines, which are
\h’\n[lss]u’not exported, must be qualified with
the name of the library, e.g. foo.baz
\h’\n[lss]u’(where foo is the name of the
library and baz the name of the subroutine);
\h’\n[lss]u’exported subroutines may be used
without specifying the name of the library,
\h’\n[lss]u’e.g. bar.
\h’\n[lss]u’Therefore export may only be useful within libraries.
\h’\n[lss]u’Example
\h’\n[lss]u’The
library foo.bar (which is listed below) defines two
functions bar and baz,
\h’\n[lss]u’however only the function bar is
exported and therefore visible even outside
\h’\n[lss]u’the library; baz is not exported and
may only be used within the library
\h’\n[lss]u’foo.yab:
\h’\n[lss]u’export
sub bar()
\h’\n[lss]u’print "Hello"
\h’\n[lss]u’end sub
\h’\n[lss]u’sub
baz()
\h’\n[lss]u’print "World"
\h’\n[lss]u’end sub
\h’\n[lss]u’Now
within your main program cux.yab (which imports the library
foo.yab); note
\h’\n[lss]u’that this program produces an
error:
\h’\n[lss]u’import foo
\h’\n[lss]u’print
"Calling subroutine foo.bar (okay) ..."
\h’\n[lss]u’foo.bar()
\h’\n[lss]u’print "done."
\h’\n[lss]u’print
"Calling subroutine bar (okay) ..."
\h’\n[lss]u’bar()
\h’\n[lss]u’print "done."
\h’\n[lss]u’print
"Calling subroutine foo.baz (okay) ..."
\h’\n[lss]u’foo.baz()
\h’\n[lss]u’print "done."
\h’\n[lss]u’print
"Calling subroutine baz (NOT okay) ..."
\h’\n[lss]u’baz()
\h’\n[lss]u’print "done."
\h’\n[lss]u’The output when executing yabasic foo.yab is this:
\h’\n[lss]u’Calling
subroutine foo.bar (okay) ...
\h’\n[lss]u’Hello
\h’\n[lss]u’done.
\h’\n[lss]u’Calling subroutine bar (okay) ...
\h’\n[lss]u’Hello
\h’\n[lss]u’done.
\h’\n[lss]u’Calling subroutine foo.baz (okay)
...
\h’\n[lss]u’World
\h’\n[lss]u’done.
\h’\n[lss]u’Calling subroutine baz (NOT okay)
...
\h’\n[lss]u’---Error in main.yab, line 16:
can’t find subroutine ’baz’
\h’\n[lss]u’---Dump: sub baz() called in
main.yab,16
\h’\n[lss]u’---Error: Program stopped due to an
error
\h’\n[lss]u’As
the error message above shows, the subroutine baz must be
qualified with the
\h’\n[lss]u’name of the library, if used outside
the library, wherein it is defined (e.g.
\h’\n[lss]u’foo.baz. I.e. outside the library
foo.yab you need to write foo.baz. baz alone
\h’\n[lss]u’would be an error.
\h’\n[lss]u’The
subroutine bar (without adding the name of the library)
however may (and
\h’\n[lss]u’probably should) be used in any
program, which imports the library foo.yab.
\h’\n[lss]u’Note
\h’\n[lss]u’In
some sense the set of exported subroutines constitutes the
interface of a
\h’\n[lss]u’library.
\h’\n[lss]u’See also
\h’\n[lss]u’sub, import
\h’\n[lss]u’F
\h’\n[lss]u’false
? a constant with the value of 0
\h’\n[lss]u’fi ? another name for endif
\h’\n[lss]u’fill ? draw a filled circles,
rectangles or triangles
\h’\n[lss]u’floor() ? compute the floor for its
(float) argument.
\h’\n[lss]u’for ? starts a for-loop
\h’\n[lss]u’frac() ? return the fractional part
of its numeric argument
\h’\n[lss]u’Name
\h’\n[lss]u’false ? a constant with the value of 0
\h’\n[lss]u’Synopsis
\h’\n[lss]u’okay=false
\h’\n[lss]u’Description
\h’\n[lss]u’The
constant false can be assigned to variables which later
appear in
\h’\n[lss]u’conditions (e.g. within an
if-statement.
\h’\n[lss]u’false may also be written as FALSE or even FaLsE.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a number between 1 and 10: " a
\h’\n[lss]u’if (check_input(a)) print
"Okay"
\h’\n[lss]u’sub
check_input(x)
\h’\n[lss]u’if (x>10 or x<1) return false
\h’\n[lss]u’return true
\h’\n[lss]u’end sub
\h’\n[lss]u’The
subroutine check_input checks its argument and returns true
or false
\h’\n[lss]u’according to the outcome of the
check..
\h’\n[lss]u’See also
\h’\n[lss]u’true
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’fi ? another name for endif
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(?)
\h’\n[lss]u’?
\h’\n[lss]u’fi
\h’\n[lss]u’Description
\h’\n[lss]u’fi
marks the end of an if-statement and is exactly equivalent
to endif, please
\h’\n[lss]u’see there for further
information.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"A number please: " a
\h’\n[lss]u’if (a<10) then
\h’\n[lss]u’print "Your number is less than
10."
\h’\n[lss]u’fi
\h’\n[lss]u’See also
\h’\n[lss]u’endif
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’fill ? draw a filled circles, rectangles or triangles
\h’\n[lss]u’Synopsis
\h’\n[lss]u’fill
rectangle 10,10,90,90
\h’\n[lss]u’fill circle 50,50,20
\h’\n[lss]u’fill triangle 10,20,20,10,20,20
\h’\n[lss]u’Description
\h’\n[lss]u’The
keyword fill may be used within the circle, rectangle or
triangle command
\h’\n[lss]u’and causes these shapes to be
filled.
\h’\n[lss]u’fill
can be used in conjunction with and wherever the
clear-clause may appear.
\h’\n[lss]u’Used alone, fill will fill the
interior of the shape (circle, rectangle or
\h’\n[lss]u’triangle); together with clear the
whole shape (including its interior) is
\h’\n[lss]u’erased.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’fill circle 100,100,50
\h’\n[lss]u’clear fill rectangle 10,10,90,90
\h’\n[lss]u’This opens a window and draws a pacman-like figure.
\h’\n[lss]u’See also
\h’\n[lss]u’clear, circle, rectangle, triangle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’floor() ? compute the floor for its (float) argument.
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print floor(x)
\h’\n[lss]u’Description
\h’\n[lss]u’The
floor-function returns the largest integer number, that is
smaller or equal
\h’\n[lss]u’than its argument. For positive
numbers x, floor(x) is the same as int(x); for
\h’\n[lss]u’negaive numbers it can be different
(see the example below).
\h’\n[lss]u’Example
\h’\n[lss]u’print
int(-1.5),floor(-1.5)
\h’\n[lss]u’print int(-1),floor(-1)
\h’\n[lss]u’print int(1.5),floor(1.5)
\h’\n[lss]u’This
example compares the functions int and floor, starting with
-1 -2, then -1
\h’\n[lss]u’-1 and ending with 1 1, which shows
the different behaviour of both functions.
\h’\n[lss]u’See also
\h’\n[lss]u’ceil, int, frac
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’for ? starts a for-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’for
a=1 to 100 step 2
\h’\n[lss]u’?
\h’\n[lss]u’next a
\h’\n[lss]u’Description
\h’\n[lss]u’The
for-loop lets its numerical variable (a in the synopsis)
assume all values
\h’\n[lss]u’within the given range. The optional
step-clause may specify a value (default:
\h’\n[lss]u’1) by which the variable will be
incremented (or decremented, if step is
\h’\n[lss]u’negative).
\h’\n[lss]u’Any
for-statement can be replaced by a set of ifs and gotos; as
you may infer
\h’\n[lss]u’from the example below this is
normally not feasible. However if you want to
\h’\n[lss]u’know in detail how the for-statement
works, you should study this example,
\h’\n[lss]u’which presents a for-statement and
an exactly equivalent series of ifs and
\h’\n[lss]u’gotos.
\h’\n[lss]u’Example
\h’\n[lss]u’for a=1 to 10 step 2:print a:next
\h’\n[lss]u’a=1
\h’\n[lss]u’label check
\h’\n[lss]u’if (a>10) goto done
\h’\n[lss]u’print a
\h’\n[lss]u’a=a+2
\h’\n[lss]u’goto check
\h’\n[lss]u’label done
\h’\n[lss]u’This
example simply prints the numbers 1, 3, 5, 7 and 9. It does
this twice:
\h’\n[lss]u’First with a simple for-statement
and then with ifs and gotos.
\h’\n[lss]u’See also
\h’\n[lss]u’step, next
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’frac() ? return the fractional part of its numeric argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=frac(y)
\h’\n[lss]u’Description
\h’\n[lss]u’The
frac-function takes its argument, removes all the digits to
the left of the
\h’\n[lss]u’comma and just returns the digits
right of the comma, i.e. the fractional part.
\h’\n[lss]u’Refer
to the example to learn how to rewrite frac by employing the
int-function
\h’\n[lss]u’(which is not suggested anyway).
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 10
\h’\n[lss]u’print frac(sqr(a))
\h’\n[lss]u’print sqr(a)-int(sqr(a))
\h’\n[lss]u’next a
\h’\n[lss]u’The
example prints the fractional part of the square root of the
numbers
\h’\n[lss]u’between 1 and 10. Each result is
computed (and printed) twice: Once by
\h’\n[lss]u’employing the frac-function and once
by employing the int-function.
\h’\n[lss]u’See also
\h’\n[lss]u’int, floor, ceil
\h’\n[lss]u’G
\h’\n[lss]u’getbit$()
? return a string representing the bit pattern of a
rectangle within
\h’\n[lss]u’the graphic window
\h’\n[lss]u’getscreen$() ? returns a string
representing a rectangular section of the text
\h’\n[lss]u’terminal
\h’\n[lss]u’glob() ? check if a string matches a
simple pattern
\h’\n[lss]u’gosub ? continue execution at
another point within your program (and return
\h’\n[lss]u’later)
\h’\n[lss]u’goto ? continue execution at another
point within your program (and never come
\h’\n[lss]u’back)
\h’\n[lss]u’Name
\h’\n[lss]u’getbit$()
? return a string representing the bit pattern of a
rectangle within
\h’\n[lss]u’the graphic window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=getbit$(10,10,20,20)
\h’\n[lss]u’a$=getbit$(10,10 to 20,20)
\h’\n[lss]u’Description
\h’\n[lss]u’The
function getbit returns a string, which contains the encoded
bit-pattern of
\h’\n[lss]u’a rectangle within graphic window;
the four arguments specify two opposite
\h’\n[lss]u’corners of the rectangle. The string
returned might later be fed to the putbit
\h’\n[lss]u’-command.
\h’\n[lss]u’The
getbit$-function might be used for simple animations (as in
the example
\h’\n[lss]u’below).
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 40,40
\h’\n[lss]u’fill circle 20,20,18
\h’\n[lss]u’circle$=getbit$(0,0,40,40)
\h’\n[lss]u’close window
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’for x=1 to 200
\h’\n[lss]u’putbit circle$,x,80
\h’\n[lss]u’next x
\h’\n[lss]u’This example features a circle moving from left to right over the window.
\h’\n[lss]u’See also
\h’\n[lss]u’putbit
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’getscreen$()
? returns a string representing a rectangular section of the
text
\h’\n[lss]u’terminal
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=getscreen$(2,2,20,20)
\h’\n[lss]u’Description
\h’\n[lss]u’The
getscreen$ function returns a string representing the area
of the screen as
\h’\n[lss]u’specified by its four arguments
(which specify two opposite corners). I.e.
\h’\n[lss]u’everything you have printed within
this rectangle will be encoded in the string
\h’\n[lss]u’returned (including any
colour-information).
\h’\n[lss]u’Like
most other commands dealing with advanced text output,
getscreen$
\h’\n[lss]u’requires, that you have called clear
screen before.
\h’\n[lss]u’Example
\h’\n[lss]u’clear screen
\h’\n[lss]u’for
a=1 to 1000:
\h’\n[lss]u’print color("red")
"1";
\h’\n[lss]u’print color("green")
"2";
\h’\n[lss]u’print color("blue")
"3";
\h’\n[lss]u’next a
\h’\n[lss]u’screen$=getscreen$(10,10,40,10)
\h’\n[lss]u’print at(10,10) " Please Press
’y’ or ’n’ ! "
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’putscreen screen$,10,10
\h’\n[lss]u’This
program fills the screen with colored digits and afterwards
asks the user
\h’\n[lss]u’for a choice ( Please press
’y’ or ’n’ ! ). Afterwards the area
of the screen,
\h’\n[lss]u’which has been overwritten by the
question will be restored with its previous
\h’\n[lss]u’contents, whhch had been saved via
getscreen$.
\h’\n[lss]u’See also
\h’\n[lss]u’putscreen$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’glob() ? check if a string matches a simple pattern
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if (glob(string$,pattern$)) ?
\h’\n[lss]u’Description
\h’\n[lss]u’The
glob-function takes two arguments, a string and a (glob-)
pattern, and
\h’\n[lss]u’checks if the string matches the
pattern. However glob does not employ the
\h’\n[lss]u’powerful rules of regular
expressions; rather it has only two special
\h’\n[lss]u’characters: * (which matches any
number (even zero) of characters) and ? (which
\h’\n[lss]u’matches exactly a single
character).
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 10
\h’\n[lss]u’read string$,pattern$
\h’\n[lss]u’if (glob(string$,pattern$)) then
\h’\n[lss]u’print string$," matches
",pattern$
\h’\n[lss]u’else
\h’\n[lss]u’print string$," does not match
",pattern$
\h’\n[lss]u’endif
\h’\n[lss]u’next a
\h’\n[lss]u’data
"abc","a*"
\h’\n[lss]u’data "abc","a?"
\h’\n[lss]u’data "abc","a??"
\h’\n[lss]u’data "abc","*b*"
\h’\n[lss]u’data "abc","*"
\h’\n[lss]u’data "abc","???"
\h’\n[lss]u’data "abc","?"
\h’\n[lss]u’data "abc","*c"
\h’\n[lss]u’data "abc","A*"
\h’\n[lss]u’data
"abc","????"
\h’\n[lss]u’This
program checks the string abc against various patterns and
prints the
\h’\n[lss]u’result. The output is:
\h’\n[lss]u’abc
matches a*
\h’\n[lss]u’abc does not match a?
\h’\n[lss]u’abc matches a??
\h’\n[lss]u’abc matches *b*
\h’\n[lss]u’abc matches *
\h’\n[lss]u’abc matches ???
\h’\n[lss]u’abc does not match ?
\h’\n[lss]u’abc matches *c
\h’\n[lss]u’abc does not match A*
\h’\n[lss]u’abc does not match ????
\h’\n[lss]u’See also
\h’\n[lss]u’There are no related commands.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’gosub
? continue execution at another point within your program
(and return
\h’\n[lss]u’later)
\h’\n[lss]u’Synopsis
\h’\n[lss]u’gosub foo
\h’\n[lss]u’?
\h’\n[lss]u’label
foo
\h’\n[lss]u’?
\h’\n[lss]u’return
\h’\n[lss]u’Description
\h’\n[lss]u’gosub
remembers the current position within your program and then
passes the
\h’\n[lss]u’flow of execution to another point
(which is normally marked with a label).
\h’\n[lss]u’Later, when a return-statement is
encountered, the execution is resumed at the
\h’\n[lss]u’previous location.
\h’\n[lss]u’gosub
is the traditional command for calling code, which needs to
be executed
\h’\n[lss]u’from various places within your
program. However, with subroutines yabasic
\h’\n[lss]u’offers a much more flexible way to
achieve this (and more). Therefore gosub
\h’\n[lss]u’must to be considered obsolete.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Do you want to exit ? "
\h’\n[lss]u’gosub ask
\h’\n[lss]u’if (r$="y") exit
\h’\n[lss]u’label
ask
\h’\n[lss]u’input "Please answer yes or no,
by typing ’y’ or ’n’: ",r$
\h’\n[lss]u’return
\h’\n[lss]u’See also
\h’\n[lss]u’return, goto, sub, label, on gosub
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’goto
? continue execution at another point within your program
(and never come
\h’\n[lss]u’back)
\h’\n[lss]u’Synopsis
\h’\n[lss]u’goto foo
\h’\n[lss]u’?
\h’\n[lss]u’label foo
\h’\n[lss]u’Description
\h’\n[lss]u’The
goto-statement passes the flow of execution to another point
within your
\h’\n[lss]u’program (which is normally marked
with a label).
\h’\n[lss]u’goto
is normally considered obsolete and harmful, however in
yabasic it may be
\h’\n[lss]u’put to the good use of leaving loops
(e.g. while or for) prematurely. Note
\h’\n[lss]u’however, that subroutines may not be
left with the goto-statement.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Please press any key to continue."
\h’\n[lss]u’print "(program will continue
by itself within 10 seconds)"
\h’\n[lss]u’for a=1 to 10
\h’\n[lss]u’if (inkey$(1)<>"")
then goto done
\h’\n[lss]u’next a
\h’\n[lss]u’label done
\h’\n[lss]u’print "Hello World !"
\h’\n[lss]u’Here the goto-statement is used to leave the for-loop prematurely.
\h’\n[lss]u’See also
\h’\n[lss]u’gosub, on goto
\h’\n[lss]u’H
\h’\n[lss]u’hex$() ? convert a number into hexadecimal
\h’\n[lss]u’Name
\h’\n[lss]u’hex$() ? convert a number into hexadecimal
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print hex$(foo)
\h’\n[lss]u’Description
\h’\n[lss]u’The
hex$-function converts a number into a string with its
hexadecimal
\h’\n[lss]u’representation. hex$ is the inverse
of the dec-function.
\h’\n[lss]u’Example
\h’\n[lss]u’open
1,"foo"
\h’\n[lss]u’while(!eof(1))
\h’\n[lss]u’print
right$("0"+hex$(peek(1)),2)," ";
\h’\n[lss]u’i=i+1
\h’\n[lss]u’if (mod(i,10)=0) print
\h’\n[lss]u’end while
\h’\n[lss]u’print
\h’\n[lss]u’This
program reads the file foo and prints its output as a
hex-dump using the
\h’\n[lss]u’hex-function.
\h’\n[lss]u’See also
\h’\n[lss]u’decbin
\h’\n[lss]u’I
\h’\n[lss]u’if
? evaluate a condition and execute statements or not,
depending on the
\h’\n[lss]u’result
\h’\n[lss]u’import ? import a library
\h’\n[lss]u’inkey$ ? wait, until a key is
pressed
\h’\n[lss]u’input ? read input from the user (or
from a file) and assign it to a variable
\h’\n[lss]u’instr() ? searches its second
argument within the first; returns its position
\h’\n[lss]u’if found
\h’\n[lss]u’int() ? return the integer part of
its single numeric argument
\h’\n[lss]u’Name
\h’\n[lss]u’if
? evaluate a condition and execute statements or not,
depending on the
\h’\n[lss]u’result
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(?) then
\h’\n[lss]u’?
\h’\n[lss]u’endif
\h’\n[lss]u’if (?) ?
\h’\n[lss]u’if
(?) then
\h’\n[lss]u’?
\h’\n[lss]u’else
\h’\n[lss]u’?
\h’\n[lss]u’endif
\h’\n[lss]u’if
(?) then
\h’\n[lss]u’?
\h’\n[lss]u’elsif (?)
\h’\n[lss]u’?
\h’\n[lss]u’elsif (?) then
\h’\n[lss]u’?
\h’\n[lss]u’else
\h’\n[lss]u’?
\h’\n[lss]u’endif
\h’\n[lss]u’Description
\h’\n[lss]u’The
if-statement is used to evaluate a conditions and take
actions accordingly.
\h’\n[lss]u’(As an aside, please note that there
is no real difference between conditions
\h’\n[lss]u’and expressions.)
\h’\n[lss]u’There are two major forms of the if-statement:
\h’\n[lss]u’* The one-line-form without the keyword then:
\h’\n[lss]u’if (?) ?
\h’\n[lss]u’This
form evaluates the condition and if the result is true
executes all
\h’\n[lss]u’commands (separated by colons) upt
to the end of the line. There is neither
\h’\n[lss]u’an endif keyword nor an
else-branch.
\h’\n[lss]u’* The multi-line-form with the keyword then:
\h’\n[lss]u’if (?) then ? elsif (?) ? else ? endif
\h’\n[lss]u’(where elsif and else are optional, whereas endif is not.
\h’\n[lss]u’According to the requirements of your program, you may specify:
\h’\n[lss]u’+
elsif(?), which specifies a condition, that will be
evaluated only if
\h’\n[lss]u’the condition(s) within if or any
preceding elsif did not match.
\h’\n[lss]u’+
else, which introduces a sequence of commands, that will be
executed,
\h’\n[lss]u’if none of the conditions above did
match.
\h’\n[lss]u’+ endif is required and ends the if-statement.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a number between 1 and 4: " a
\h’\n[lss]u’if (a<=1 or a>=4) error
"Wrong, wrong !"
\h’\n[lss]u’if (a=1) then
\h’\n[lss]u’print "one"
\h’\n[lss]u’elsif (a=2)
\h’\n[lss]u’print "two"
\h’\n[lss]u’elsif (a=3)
\h’\n[lss]u’print "three"
\h’\n[lss]u’else
\h’\n[lss]u’print "four"
\h’\n[lss]u’endif
\h’\n[lss]u’The
input-number between 1 and 4 is simply echoed as text (one,
two, ?). The
\h’\n[lss]u’example demonstrates both forms
(short and long) of the if-statement (Note
\h’\n[lss]u’however, that the same thing can be
done, probably somewhat more elegant, with
\h’\n[lss]u’the switch-statement).
\h’\n[lss]u’See also
\h’\n[lss]u’else, elsif, endif, conditions and expressions.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’import ? import a library
\h’\n[lss]u’Synopsis
\h’\n[lss]u’import foo
\h’\n[lss]u’Description
\h’\n[lss]u’The
import-statement imports a library. It expects a single
argument, which
\h’\n[lss]u’must be the name of a library
(without the trailing .yab). This library will
\h’\n[lss]u’then be read and parsed and its
subroutines (and variables) will be made
\h’\n[lss]u’available within the importing
program. Most of the time this will be the main
\h’\n[lss]u’program, but libraries my also
import and use other libraries.
\h’\n[lss]u’Libraries will first be searched in three locations in order:
\h’\n[lss]u’*
The current directory, i.e. the directory from which you
have invoked
\h’\n[lss]u’yabasic)
\h’\n[lss]u’*
The directory, where your main program lives. This can be
different from
\h’\n[lss]u’the first directory, if you specify
a path for your main program, e.g. like
\h’\n[lss]u’yabasic foo/bar.yab.
\h’\n[lss]u’*
Finally, libraries are searched within a special directory,
whose exact
\h’\n[lss]u’location depends on your system or
options when invoking yabasic. Typical
\h’\n[lss]u’values would be /usr/lib under Unix
or C:\yabasic\lib under Windows.
\h’\n[lss]u’Invoking yabasic --help will show
the correct directory. The location of
\h’\n[lss]u’this directory may be changed with
the option --librarypath (see options).
\h’\n[lss]u’Example
\h’\n[lss]u’Lets
say you have a yabasic-program foo.yab, which imports a
library lib.yab.
\h’\n[lss]u’foo.yab; this would read:
\h’\n[lss]u’import lib
\h’\n[lss]u’rem
This works
\h’\n[lss]u’lib.x(0)
\h’\n[lss]u’rem
This works too
\h’\n[lss]u’x(1)
\h’\n[lss]u’rem
And this
\h’\n[lss]u’lib.y(2)
\h’\n[lss]u’rem
But this not !
\h’\n[lss]u’y(3)
\h’\n[lss]u’Now the library lib.yab reads:
\h’\n[lss]u’rem
Make the subroutine x easily available outside this library
\h’\n[lss]u’export sub x(a)
\h’\n[lss]u’print a
\h’\n[lss]u’return
\h’\n[lss]u’end sub
\h’\n[lss]u’rem
sub y must be referenced by its full name
\h’\n[lss]u’rem outside this library
\h’\n[lss]u’sub y(a)
\h’\n[lss]u’print a
\h’\n[lss]u’return
\h’\n[lss]u’end sub
\h’\n[lss]u’This program produces an error:
\h’\n[lss]u’0
\h’\n[lss]u’1
\h’\n[lss]u’2
\h’\n[lss]u’---Error in foo.yab, line 13:
can’t find subroutine ’y’
\h’\n[lss]u’---Dump: sub y() called in
foo.yab,13
\h’\n[lss]u’---Error: Program stopped due to an
error
\h’\n[lss]u’As
you may see from the error message, yabasic is unable to
find the subroutine
\h’\n[lss]u’y without specifying the name of the
library (i.e. lib.y). The reason for this
\h’\n[lss]u’is, that y, other than x, is not
exported from the library lib.yab (using the
\h’\n[lss]u’export-statement).
\h’\n[lss]u’See also
\h’\n[lss]u’export, sub
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’inkey$ ? wait, until a key is pressed
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear
screen
\h’\n[lss]u’foo$=inkey$
\h’\n[lss]u’inkey$
\h’\n[lss]u’foo$=inkey$(bar)
\h’\n[lss]u’inkey$(bar)
\h’\n[lss]u’Description
\h’\n[lss]u’The
inkeys$-function waits, until the user presses a key on the
keyboard or a
\h’\n[lss]u’button of his mouse, and returns
this very key. An optional argument specifies
\h’\n[lss]u’the number of seconds to wait; if
omitted, inkey$ will wait indefinitely.
\h’\n[lss]u’inkey$ may only be used, if clear screen has been called at least once.
\h’\n[lss]u’For
normal keys, yabasic simply returns the key, e.g. a, 1 or !.
For function
\h’\n[lss]u’keys you will get f1, f2 and so on.
Other special keys will return these
\h’\n[lss]u’strings respectively: enter,
backspace, del, esc, scrnup (for screen up),
\h’\n[lss]u’scrndown and tab. Modifier keys
(e.g. ctrl, alt or shift) by themselves can not
\h’\n[lss]u’be detected (e.g. if you
simultaneously press shift and ’a’, inkey$ will
return
\h’\n[lss]u’the letter ’A’ instead
of ’a’ of course).
\h’\n[lss]u’If
a graphical window has been opened (via open window) any
mouseclick within
\h’\n[lss]u’this window will be returned by
inkey$ too. The string returned (e.g.
\h’\n[lss]u’MB1d+0:0028,0061, MB2u+0:0028,0061
or MB1d+1:0028,0061) is constructed as
\h’\n[lss]u’follows:
\h’\n[lss]u’*
Every string associated with a mouseclick will start with
the fixed string
\h’\n[lss]u’MB
\h’\n[lss]u’* The next digit (1, 2 or 3) specifies the mousebutton pressed.
\h’\n[lss]u’*
A single letter, d or u, specifies, if the mousebutton has
been pressed or
\h’\n[lss]u’released: d stands for down, i.e.
the mousebutton has been pressed; u means
\h’\n[lss]u’up, i.e. the mousebutton has been
released.
\h’\n[lss]u’* The plus-sign (’+’), which follows is always fixed.
\h’\n[lss]u’*
The next digit (in the range 0 to 7) encodes the modifier
keys pressed,
\h’\n[lss]u’where 1 stands for shift, 2 stands
for alt and 4 stands for ctrl.
\h’\n[lss]u’*
The next four digits (e.g. 0028) contain the x-position,
where the
\h’\n[lss]u’mousebutton has been pressed.
\h’\n[lss]u’* The comma to follow is always fixed.
\h’\n[lss]u’*
The last four digits (e.g. 0061) contain the y-position,
where the
\h’\n[lss]u’mousebutton has been pressed.
\h’\n[lss]u’All
those fields are of fixed length, so you may use functions
like mid$ to
\h’\n[lss]u’extract certain fields. However,
note that with mousex, mousey, mouseb and
\h’\n[lss]u’mousemod there are specialized
functions to return detailed information about
\h’\n[lss]u’the mouseclick. Finally it should be
noted, that inkey$ will only register
\h’\n[lss]u’mouseclicks within the
graphic-window; mouseclicks in the text-window cannot be
\h’\n[lss]u’detected.
\h’\n[lss]u’inkey$
accepts an optional argument, specifying a timeout in
seconds; if no key
\h’\n[lss]u’has been pressed within this span of
time, an empty string is returned. If the
\h’\n[lss]u’timeout-argument is omitted, inkey$
will wait for ever.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’open window 100,100
\h’\n[lss]u’print "Press any key or press
’q’ to stop."
\h’\n[lss]u’repeat
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’print a$
\h’\n[lss]u’until(a$="q")
\h’\n[lss]u’This
program simply returns the key pressed. You may use it, to
learn, which
\h’\n[lss]u’strings are returned for the special
keys on your keyboard (e.g.
\h’\n[lss]u’function-keys).
\h’\n[lss]u’See also
\h’\n[lss]u’clear screen,mousex, mousey, mouseb, mousemod
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’input ? read input from the user (or from a file) and assign it to a variable
\h’\n[lss]u’Synopsis
\h’\n[lss]u’input
a
\h’\n[lss]u’input a,b,c
\h’\n[lss]u’input a$
\h’\n[lss]u’input "Hello" a
\h’\n[lss]u’input #1 a$
\h’\n[lss]u’Description
\h’\n[lss]u’input
reads the new contents of one or many (numeric- or string-)
variables,
\h’\n[lss]u’either from the keyboard (i.e. from
you) or from a file. An optional first
\h’\n[lss]u’string-argument specifies a prompt,
which will be issued before reading any
\h’\n[lss]u’contents.
\h’\n[lss]u’If
you want to read from an open file, you need to specify a
hash (’#’),
\h’\n[lss]u’followed by the number, under which
the file has been opened.
\h’\n[lss]u’Note,
that the input is split at spaces, i.e. if you enter a whole
line
\h’\n[lss]u’consisting of many space-separated
word, the first input-statement will only
\h’\n[lss]u’return the first word; the other
words will only be returned on subsequent
\h’\n[lss]u’calls to input; the same applies, if
a single input reads multiple variables:
\h’\n[lss]u’The first variable gets only the
first word, the second one the second word,
\h’\n[lss]u’and so on. If you don’t like
this behaviour, you may use line input, which
\h’\n[lss]u’returns a whole line (including
embedded spaces) at once.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter the name of a file to read: " a$
\h’\n[lss]u’open 1,a$
\h’\n[lss]u’while(!eof(1))
\h’\n[lss]u’input #1 b$
\h’\n[lss]u’print b$
\h’\n[lss]u’wend
\h’\n[lss]u’If
this program is stored within a file test.yab and you enter
this name when
\h’\n[lss]u’prompted for a file to read, you
will see this output:
\h’\n[lss]u’Please
enter the name of a file to read: t.yab
\h’\n[lss]u’input
\h’\n[lss]u’"Please
\h’\n[lss]u’enter
\h’\n[lss]u’the
\h’\n[lss]u’name
\h’\n[lss]u’of
\h’\n[lss]u’a
\h’\n[lss]u’file
\h’\n[lss]u’to
\h’\n[lss]u’read:
\h’\n[lss]u’"
\h’\n[lss]u’a$
\h’\n[lss]u’open
\h’\n[lss]u’1,a$
\h’\n[lss]u’while(!eof(1))
\h’\n[lss]u’input
\h’\n[lss]u’#1
\h’\n[lss]u’b$
\h’\n[lss]u’print
\h’\n[lss]u’b$
\h’\n[lss]u’wend
\h’\n[lss]u’See also
\h’\n[lss]u’line input
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’instr()
? searches its second argument within the first; returns its
position
\h’\n[lss]u’if found
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
instr(a$,b$)
\h’\n[lss]u’if (instr(a$,b$)) ?
\h’\n[lss]u’pos=instr(a$,b$,x)
\h’\n[lss]u’Description
\h’\n[lss]u’The
instr-functions requires two string arguments and searches
the second
\h’\n[lss]u’argument within the first. If the
second argument can be found within the
\h’\n[lss]u’first, the position is returned
(counting from one). If it can not be found,
\h’\n[lss]u’the instr-function returns 0; this
makes this function usable within the
\h’\n[lss]u’condition of an if-statement (see
the example below).
\h’\n[lss]u’If
you supply a third, numeric argument to the instr-function,
it will be used
\h’\n[lss]u’as a starting point for the search.
Therefore instr("abcdeabcdeabcde","e",8)
\h’\n[lss]u’will return 10, because the search
for an "e" starts at position 8 and finds
\h’\n[lss]u’the "e" at position 10
(and not the one at position 5).
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a text containing the string
’cat’: " a$
\h’\n[lss]u’if (instr(a$,"cat")) then
\h’\n[lss]u’print "Well done !"
\h’\n[lss]u’else
\h’\n[lss]u’print "No cat in your input
..."
\h’\n[lss]u’endif
\h’\n[lss]u’See also
\h’\n[lss]u’rinstr
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’int() ? return the integer part of its single numeric argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print int(a)
\h’\n[lss]u’Description
\h’\n[lss]u’The
int-function returns only the digits before the comma;
int(2.5) returns 2
\h’\n[lss]u’and int(-2.3) returns -2.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a whole number between 1 and 10: " a
\h’\n[lss]u’if (a=int(a) and a>=1 and
a<=10) then
\h’\n[lss]u’print "Thanx !"
\h’\n[lss]u’else
\h’\n[lss]u’print "Never mind ..."
\h’\n[lss]u’endif
\h’\n[lss]u’See also
\h’\n[lss]u’frac, floor, ceil
\h’\n[lss]u’L
\h’\n[lss]u’label
? mark a specific location within your program for goto,
gosub or restore
\h’\n[lss]u’left$() ? return (or change) left
end of a string
\h’\n[lss]u’len() ? return the length of a
string
\h’\n[lss]u’line ? draw a line
\h’\n[lss]u’line input ? read in a whole line of
text and assign it to a variable
\h’\n[lss]u’local ? mark a variable as local to
a subroutine
\h’\n[lss]u’log() ? compute the natural
logarithm
\h’\n[lss]u’loop ? marks the end of an infinite
loop
\h’\n[lss]u’lower$() ? convert a string to lower
case
\h’\n[lss]u’ltrim$() ? trim spaces at the left
end of a string
\h’\n[lss]u’Name
\h’\n[lss]u’label ? mark a specific location within your program for goto, gosub or restore
\h’\n[lss]u’Synopsis
\h’\n[lss]u’label foo
\h’\n[lss]u’?
\h’\n[lss]u’goto foo
\h’\n[lss]u’Description
\h’\n[lss]u’The
label-command can be used to give a name to a specific
location within your
\h’\n[lss]u’program. Such a position might be
referred from one of three commands: goto,
\h’\n[lss]u’gosub and restore.
\h’\n[lss]u’You
may use labels safely within libraries, because a label
(e.g. foo) does not
\h’\n[lss]u’collide with a label with the same
name within the main program or within
\h’\n[lss]u’another library; yabasic will not
mix them up.
\h’\n[lss]u’As
an aside, please note, that line numbers are a special
(however deprecated)
\h’\n[lss]u’case of labels; see the second
example below.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 100
\h’\n[lss]u’if (ran(10)>5) goto done
\h’\n[lss]u’next a
\h’\n[lss]u’label done
\h’\n[lss]u’10
for a=1 to 100
\h’\n[lss]u’20 if (ran(10)>5) goto 40
\h’\n[lss]u’30 next a
\h’\n[lss]u’40
\h’\n[lss]u’Within
this example, the for-loop will probably be left prematurely
with a
\h’\n[lss]u’goto-statement. This task is done
twice: First with labels and then again with
\h’\n[lss]u’line numbers.
\h’\n[lss]u’See also
\h’\n[lss]u’gosub, goto.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’left$() ? return (or change) left end of a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
left$(a$,2)
\h’\n[lss]u’left$(b$,3)="foobar"
\h’\n[lss]u’Description
\h’\n[lss]u’The
left$-function accepts two arguments (a string and a number)
and returns
\h’\n[lss]u’the part from the left end of the
string, whose length is specified by its
\h’\n[lss]u’second argument. Loosely spoken, it
simply returns the requested number of
\h’\n[lss]u’chars from the left end of the given
string.
\h’\n[lss]u’Note,
that the left$-function can be assigned to, i.e. it may
appear on the
\h’\n[lss]u’left hand side of an assignment. In
this way it is possible to change a part of
\h’\n[lss]u’the variable used within the
left$-function. Note, that that way the length of
\h’\n[lss]u’the string cannot be changed, i.e.
characters might be overwritten, but not
\h’\n[lss]u’added. For an example see below.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please answer yes or no: " a$
\h’\n[lss]u’l=len(a$):a$=lower$(a$):print
"Your answer is ";
\h’\n[lss]u’if (left$("yes",l)=a$ and
l>=1) then
\h’\n[lss]u’print "yes"
\h’\n[lss]u’elsif (left$("no",l)=a$
and l>=1) then
\h’\n[lss]u’print "no"
\h’\n[lss]u’else
\h’\n[lss]u’print "?"
\h’\n[lss]u’endif
\h’\n[lss]u’This
example asks a simple yes/no question and goes some way to
accept even
\h’\n[lss]u’incomplete input, while still being
able to reject invalid input.
\h’\n[lss]u’This
second example demonstrates the capability to assign to the
\h’\n[lss]u’left$-function.
\h’\n[lss]u’a$="Heiho
World !"
\h’\n[lss]u’print a$
\h’\n[lss]u’left$(a$,5)="Hello"
\h’\n[lss]u’print a$
\h’\n[lss]u’See also
\h’\n[lss]u’right$, mid$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’len() ? return the length of a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=len(a$)
\h’\n[lss]u’Description
\h’\n[lss]u’The len-function returns the length of its single string argument.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a password: " a$
\h’\n[lss]u’if (len(a$)<6) error
"Password too short !"
\h’\n[lss]u’This example checks the length of the password, that the user has entered.
\h’\n[lss]u’See also
\h’\n[lss]u’left$, right$ and mid$,
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’line ? draw a line
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
window 100,100
\h’\n[lss]u’line 0,0,100,100
\h’\n[lss]u’line 0,0 to 100,100
\h’\n[lss]u’new curve
\h’\n[lss]u’line 100,100
\h’\n[lss]u’line to 100,100
\h’\n[lss]u’open
window 100,100
\h’\n[lss]u’clear line 0,0,100,100
\h’\n[lss]u’clear line 0,0 to 100,100
\h’\n[lss]u’new curve
\h’\n[lss]u’clear line 100,100
\h’\n[lss]u’clear line to 100,100
\h’\n[lss]u’Description
\h’\n[lss]u’The
line-command draws a line. Simple as this is, the
line-command has a large
\h’\n[lss]u’variety of forms as they are listed
in the synopsis above. Lets look at them a
\h’\n[lss]u’little closer:
\h’\n[lss]u’*
A line has a starting and an end point; therefore the
line-command
\h’\n[lss]u’(normally) needs four numbers as
arguments, representing these two points.
\h’\n[lss]u’This is the first form appearing
within the synopsis.
\h’\n[lss]u’*
You may separate the two points with either ’,’
or to, which accounts for
\h’\n[lss]u’the second form of the
line-command.
\h’\n[lss]u’*
The line-command may be used to draw a connected sequence of
lines with a
\h’\n[lss]u’sequence of commands like line x,y;
Each command will draw a line from the
\h’\n[lss]u’point where the last line-command
left off, to the point specified in the
\h’\n[lss]u’arguments. Note, that you need to
use the command new curve before you may
\h’\n[lss]u’issue such a line-command. See the
example below.
\h’\n[lss]u’*
You may insert the word to for beauty: line to x,y, which
does exactly the
\h’\n[lss]u’same as line x,y
\h’\n[lss]u’*
Finally, you may choose not to draw, but to erase the lines;
this can be
\h’\n[lss]u’done by prepending the phrase clear.
This account for all the other forms
\h’\n[lss]u’of the line-command.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’line 10,10 to 10,190
\h’\n[lss]u’line 10,190 to 190,190
\h’\n[lss]u’new curve
\h’\n[lss]u’for a=0 to 360
\h’\n[lss]u’line to
10+a*180/360,100+60*sin(a*pi/180)
\h’\n[lss]u’next a
\h’\n[lss]u’This
example draws a sine-curve (with an offset in x- and
y-direction). Note,
\h’\n[lss]u’that the first line-command after
new curve does not draw anything. Only the
\h’\n[lss]u’coordinates will be stored. The
second iteration of the loop then uses these
\h’\n[lss]u’coordinates as a starting point for
the first line.
\h’\n[lss]u’See also
\h’\n[lss]u’new curve, close curve, open window
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’line input ? read in a whole line of text and assign it to a variable
\h’\n[lss]u’Synopsis
\h’\n[lss]u’line
input a
\h’\n[lss]u’line input a$
\h’\n[lss]u’line input "Hello" a
\h’\n[lss]u’line input #1 a$
\h’\n[lss]u’Description
\h’\n[lss]u’In
most respects line input is like the input-command: It reads
the new
\h’\n[lss]u’contents of a variable, either from
keyboard or from a file. However, line
\h’\n[lss]u’input always reads a complete line
and assigns it to its variable. line input
\h’\n[lss]u’does not stop reading at spaces and
is therefore the best way to read in a
\h’\n[lss]u’string which might contain
whitespace. Note, that the final newline is stripped
\h’\n[lss]u’of.
\h’\n[lss]u’Example
\h’\n[lss]u’line
input "Please enter your name (e.g. Frodo Beutelin):
" a$
\h’\n[lss]u’print "Hello ",a$
\h’\n[lss]u’Note
that the usage of line input is essential in this example; a
simple
\h’\n[lss]u’input-statement would only return
the string up to the first space, e.g. Frodo.
\h’\n[lss]u’See also
\h’\n[lss]u’input
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’local ? mark a variable as local to a subroutine
\h’\n[lss]u’Synopsis
\h’\n[lss]u’sub foo()
\h’\n[lss]u’local a,b,c$,d(10),e$(5,5)
\h’\n[lss]u’?
\h’\n[lss]u’end sub
\h’\n[lss]u’Description
\h’\n[lss]u’The
local-command can (and should be) used to mark a variable
(or array) as
\h’\n[lss]u’local to the containing subroutine.
This means, that a local variable in your
\h’\n[lss]u’subroutine is totally different from
a variable with the same name within your
\h’\n[lss]u’main program. Variables which are
known everywhere within your program are
\h’\n[lss]u’called global in contrast.
\h’\n[lss]u’Declaring
variables within the subroutine as local helps to avoid hard
to find
\h’\n[lss]u’bugs; therefore local variables
should be used whenever possible.
\h’\n[lss]u’Note, that the parameters of your subroutines are always local.
\h’\n[lss]u’As
you may see from the example, local arrays may be created
without using the
\h’\n[lss]u’keyword dim (which is required only
for global arrays).
\h’\n[lss]u’Example
\h’\n[lss]u’a=1
\h’\n[lss]u’b=1
\h’\n[lss]u’print a,b
\h’\n[lss]u’foo()
\h’\n[lss]u’print a,b
\h’\n[lss]u’sub
foo()
\h’\n[lss]u’local a
\h’\n[lss]u’a=2
\h’\n[lss]u’b=2
\h’\n[lss]u’end sub
\h’\n[lss]u’This
example demonstrates the difference between local and global
variables; it
\h’\n[lss]u’produces this output:
\h’\n[lss]u’1
1
\h’\n[lss]u’1 2
\h’\n[lss]u’As
you may see, the content of the global variable a is
unchanged after the
\h’\n[lss]u’subroutine foo; this is because the
assignment a=2 within the subroutine
\h’\n[lss]u’affects the local variable a only
and not the global one. However, the variable
\h’\n[lss]u’b is never declared local and
therefore the subroutine changes the global
\h’\n[lss]u’variable, which is reflected in the
output of the second print-statement.
\h’\n[lss]u’See also
\h’\n[lss]u’sub, static, dim
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’log() ? compute the natural logarithm
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a=log(x)
\h’\n[lss]u’a=log(x,base)
\h’\n[lss]u’Description
\h’\n[lss]u’The
log-function computes the logarithm of its first argument.
The optional
\h’\n[lss]u’second argument gives the base for
the logarithm; if this second argument is
\h’\n[lss]u’omitted, the euler-constant 2.71828?
will be taken as the base.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’for x=10 to 190 step 10:for y=10 to
190 step 10
\h’\n[lss]u’r=3*log(1+x,1+y)
\h’\n[lss]u’if (r>10) r=10
\h’\n[lss]u’if (r<1) r=1
\h’\n[lss]u’fill circle x,y,r
\h’\n[lss]u’next y:next x
\h’\n[lss]u’This draws another nice plot.
\h’\n[lss]u’See also
\h’\n[lss]u’exp
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’loop ? marks the end of an infinite loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’do
\h’\n[lss]u’?
\h’\n[lss]u’loop
\h’\n[lss]u’Description
\h’\n[lss]u’The
loop-command marks the ends of a loop (which is started by
do), wherein all
\h’\n[lss]u’statements within the loop are
repeated forever. In this respect the do
\h’\n[lss]u’loop-loop is infinite, however, you
may leave it anytime via break or goto.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Hello, I will throw dice, until I get a 2 ..."
\h’\n[lss]u’do
\h’\n[lss]u’r=int(ran(6))+1
\h’\n[lss]u’print r
\h’\n[lss]u’if (r=2) break
\h’\n[lss]u’loop
\h’\n[lss]u’See also
\h’\n[lss]u’do, for, repeat, while, break
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’lower$() ? convert a string to lower case
\h’\n[lss]u’Synopsis
\h’\n[lss]u’l$=lower$(a$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
lower$-function accepts a single string-argument and
converts it to all
\h’\n[lss]u’lower case.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a password: " a$
\h’\n[lss]u’if (a$=lower$(a$)) error "Your
password is NOT mixed case !"
\h’\n[lss]u’This example prompts for a password and checks, if it is really lower case.
\h’\n[lss]u’See also
\h’\n[lss]u’upper$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’ltrim$() ? trim spaces at the left end of a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=ltrim$(b$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
ltrim$-function removes all whitespace from the left end of
a string and
\h’\n[lss]u’returns the result.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please answer ’yes’ or ’no’ :
" a$
\h’\n[lss]u’a$=lower$(ltrim$(rtrim$(a$)))
\h’\n[lss]u’if (len(a$)>0 and
a$=left$("yes",len(a$))) then
\h’\n[lss]u’print "Yes ..."
\h’\n[lss]u’else
\h’\n[lss]u’print "No ..."
\h’\n[lss]u’endif
\h’\n[lss]u’This
example prompts for an answer and removes any spaces, which
might precede
\h’\n[lss]u’the input; therefore it is even
prepared for the (albeit somewhat pathological
\h’\n[lss]u’case, that the user first hits space
before entering his answer.
\h’\n[lss]u’See also
\h’\n[lss]u’rtrim$, trim$
\h’\n[lss]u’M
\h’\n[lss]u’max()
? return the larger of its two arguments
\h’\n[lss]u’mid$() ? return (or change)
characters from within a string
\h’\n[lss]u’min() ? return the smaller of its
two arguments
\h’\n[lss]u’mod ? compute the remainder of a
division
\h’\n[lss]u’mouseb ? extract the state of the
mousebuttons from a string returned by inkey$
\h’\n[lss]u’mousemod ? return the state of the
modifier keys during a mouseclick
\h’\n[lss]u’mousex ? return the x-position of a
mouseclick
\h’\n[lss]u’mousey ? return the y-position of a
mouseclick
\h’\n[lss]u’Name
\h’\n[lss]u’max() ? return the larger of its two arguments
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print max(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’Return the maximum of its two arguments.
\h’\n[lss]u’Example
\h’\n[lss]u’dim
m(10)
\h’\n[lss]u’for a=1 to 1000
\h’\n[lss]u’m=0
\h’\n[lss]u’For b=1 to 10
\h’\n[lss]u’m=max(m,ran(10))
\h’\n[lss]u’next b
\h’\n[lss]u’m(m)=m(m)+1
\h’\n[lss]u’next a
\h’\n[lss]u’for
a=1 to 9
\h’\n[lss]u’print a,": ",m(a)
\h’\n[lss]u’next a
\h’\n[lss]u’Within
the inner for-loop (the one with the loop-variable b), the
example
\h’\n[lss]u’computes the maximum of 10 random
numbers. The outer loop (with the loop
\h’\n[lss]u’variable a) now repeats this process
1000 times and counts, how often each
\h’\n[lss]u’maximum appears. The last loop
finally reports the result.
\h’\n[lss]u’Now,
the interesting question would be, which will be approached,
when we
\h’\n[lss]u’increase the number of iterations
from thousand to infinity. Well, maybe
\h’\n[lss]u’someone could just tell me :-)
\h’\n[lss]u’See also
\h’\n[lss]u’min
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’mid$() ? return (or change) characters from within a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
mid$(a$,2,1)
\h’\n[lss]u’print mid$(a$,2)
\h’\n[lss]u’mid$(a$,5,3)="foo"
\h’\n[lss]u’mid$(a$,5)="foo"
\h’\n[lss]u’Description
\h’\n[lss]u’The
mid$-function requires three arguments: a string and two
numbers, where the
\h’\n[lss]u’first number specifies a position
within the string and the second one gives
\h’\n[lss]u’the number of characters to be
returned; if you omit the second argument, the
\h’\n[lss]u’mid$-function returns all characters
up to the end of the string.
\h’\n[lss]u’Note,
that you may assign to the mid$-function, i.e. mid$ may
appear on the
\h’\n[lss]u’left hand side of an assignment. In
this way it is possible to change a part of
\h’\n[lss]u’the variable used within the
mid$-function. Note, that that way the length of
\h’\n[lss]u’the string cannot be changed, i.e.
characters might be overwritten, but not
\h’\n[lss]u’added. For an example see below.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a string: " a$
\h’\n[lss]u’for a=1 to len(a$)
\h’\n[lss]u’if
(instr("aeiou",lower$(mid$(a$,a,1))))
mid$(a$,a,1)="e"
\h’\n[lss]u’next a
\h’\n[lss]u’print "When you turn everything
to lower case and"
\h’\n[lss]u’print "replace every vowel with
’e’, your input reads:"
\h’\n[lss]u’print
\h’\n[lss]u’print a$
\h’\n[lss]u’This
example transforms the input string a bit, using the
mid$-function to
\h’\n[lss]u’retrieve a character from within the
string as well as to change it.
\h’\n[lss]u’See also
\h’\n[lss]u’left$ and right$.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’min() ? return the smaller of its two arguments
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print min(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’Return the minimum of its two argument.
\h’\n[lss]u’Example
\h’\n[lss]u’dim
m(10)
\h’\n[lss]u’for a=1 to 1000
\h’\n[lss]u’m=min(ran(10),ran(10))
\h’\n[lss]u’m(m)=m(m)+1
\h’\n[lss]u’next a
\h’\n[lss]u’for
a=1 to 9
\h’\n[lss]u’print a,": ",m(a)
\h’\n[lss]u’next a
\h’\n[lss]u’For
each iteration of the loop, the lower of two random number
is recorded. The
\h’\n[lss]u’result is printed at the end.
\h’\n[lss]u’See also
\h’\n[lss]u’max
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’mod ? compute the remainder of a division
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print mod(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’The
mod-function divides its two arguments and computes the
remainder. Note,
\h’\n[lss]u’that a/b-int(a/b) and mod(a,b) are
always equal.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’print at(10,10) "Please wait
";
\h’\n[lss]u’p$="-/"
\h’\n[lss]u’for a=1 to 100
\h’\n[lss]u’rem ... do something lengthy here,
or simply sleep :-)
\h’\n[lss]u’pause(1)
\h’\n[lss]u’print at(22,10) mid$(p$,1+mod(a,4))
\h’\n[lss]u’next a
\h’\n[lss]u’This
example executes some time consuming action within a loop
(in fact, it
\h’\n[lss]u’simply sleeps) and gives the user
some indication of progress by displaying a
\h’\n[lss]u’turning bar (that’s where the
mod-function comes into play).
\h’\n[lss]u’See also
\h’\n[lss]u’int, frac
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’mouseb ? extract the state of the mousebuttons from a string returned by inkey$
\h’\n[lss]u’Synopsis
\h’\n[lss]u’inkey$
\h’\n[lss]u’print mouseb()
\h’\n[lss]u’print mouseb
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’print mouseb(a$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
mouseb-function is a helper function for decoding part of
the (rather
\h’\n[lss]u’complicated) strings, which are
returned by the inkey$-function. If a
\h’\n[lss]u’mousebutton has been pressed, the
mouseb-function returns the number (1,2 or 3)
\h’\n[lss]u’of the mousebutton, when it is
pressed and returns its negative (-1,-2 or -3),
\h’\n[lss]u’when it is released.
\h’\n[lss]u’The
mouseb-function accepts zero or one arguments. A single
argument should be
\h’\n[lss]u’a string returned by the
inkey$-function; if mouseb is called without any
\h’\n[lss]u’arguments, it returns the values
from the last call to inkey$, which are stored
\h’\n[lss]u’implicitly and internally by
yabasic.
\h’\n[lss]u’Note
\h’\n[lss]u’Note
however, that the value returned by the mouseb-function does
not reflect
\h’\n[lss]u’the current state of the
mousebuttons. It rather extracts the information from
\h’\n[lss]u’the string passed as an argument (or
from the last call to the inkey$-function,
\h’\n[lss]u’if no argument is passed). So the
value returned by mouseb reflects the state
\h’\n[lss]u’of the mousebuttons at the time the
inkey$-function has been called; as opposed
\h’\n[lss]u’to the time the mouseb-function is
called.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’clear screen
\h’\n[lss]u’print "Please draw lines; press
(and keep it pressed)"
\h’\n[lss]u’print "the left mousebutton for
the starting point,"
\h’\n[lss]u’print "release it for the
end-point."
\h’\n[lss]u’do
\h’\n[lss]u’if (mouseb(release$)=1)
press$=release$
\h’\n[lss]u’release$=inkey$
\h’\n[lss]u’if (mouseb(release$)=-1) then
\h’\n[lss]u’line mousex(press$),mousey(press$)
to mousex(release$),mousey(release$)
\h’\n[lss]u’endif
\h’\n[lss]u’loop
\h’\n[lss]u’This
is a maybe the most simplistic line-drawing program
possible, catching
\h’\n[lss]u’presses as well as releases of the
first mousebutton.
\h’\n[lss]u’See also
\h’\n[lss]u’inkey$, mousex, mousey and mousemod
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’mousemod ? return the state of the modifier keys during a mouseclick
\h’\n[lss]u’Synopsis
\h’\n[lss]u’inkey$
\h’\n[lss]u’print mousemod()
\h’\n[lss]u’print mousemod
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’print mousemod(a$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
mousemod-function is a helper function for decoding part of
the (rather
\h’\n[lss]u’complicated) strings, which are
returned by the inkey$-function if a
\h’\n[lss]u’mousebutton has been pressed. It
returns the state of the keyboard modifiers
\h’\n[lss]u’(shift, ctrl or alt): If the
shift-key is pressed, mousemod returns 1, for the
\h’\n[lss]u’alt-key 2 and for the ctrl-key 4. If
more than one key is pressed, the sum of
\h’\n[lss]u’these values is returned, e.g.
mousemod returns 5, if shift and ctrl are
\h’\n[lss]u’pressed simultaneously.
\h’\n[lss]u’The
mousemod-function accepts zero or one arguments. A single
argument should
\h’\n[lss]u’be a string returned by the
inkey$-function; if mousemod is called without any
\h’\n[lss]u’arguments, it returns the values
from the last call to inkey$ (which are stored
\h’\n[lss]u’implicitly and internally by
yabasic).
\h’\n[lss]u’Note
\h’\n[lss]u’Please see also the Note within the mouseb-function.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’clear screen
\h’\n[lss]u’do
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’if (left$(a$,2)="MB") then
\h’\n[lss]u’x=mousex(a$)
\h’\n[lss]u’y=mousey(a$)
\h’\n[lss]u’if (mousemod(a$)=0) then
\h’\n[lss]u’circle x,y,20
\h’\n[lss]u’else
\h’\n[lss]u’fill circle x,y,20
\h’\n[lss]u’endif
\h’\n[lss]u’endif
\h’\n[lss]u’loop
\h’\n[lss]u’This
program draws a circle, whenever a mousebutton is pressed;
the circles are
\h’\n[lss]u’filled, when any modifier is
pressed, and empty if not.
\h’\n[lss]u’See also
\h’\n[lss]u’inkey$, mousex, mousey and mouseb
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’mousex ? return the x-position of a mouseclick
\h’\n[lss]u’Synopsis
\h’\n[lss]u’inkey$
\h’\n[lss]u’print mousex()
\h’\n[lss]u’print mousex
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’print mousex(a$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
mousex-function is a helper function for decoding part of
the (rather
\h’\n[lss]u’complicated) strings, which are
returned by the inkey$-function; It returns the
\h’\n[lss]u’x-position of the mouse as encoded
within its argument.
\h’\n[lss]u’The
mousex-function accepts zero or one arguments. A single
argument should be
\h’\n[lss]u’a string returned by the
inkey$-function; if mousex is called without any
\h’\n[lss]u’arguments, it returns the values
from the last call to inkey$ (which are stored
\h’\n[lss]u’implicitly and internally by
yabasic).
\h’\n[lss]u’Note
\h’\n[lss]u’Please see also the Note within the mouseb-function.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’clear screen
\h’\n[lss]u’do
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’if (left$(a$,2)="MB") then
\h’\n[lss]u’line mousex,0 to mousex,200
\h’\n[lss]u’endif
\h’\n[lss]u’loop
\h’\n[lss]u’This
example draws vertical lines at the position, where the
mousebutton has
\h’\n[lss]u’been pressed.
\h’\n[lss]u’See also
\h’\n[lss]u’inkey$, mousemod, mousey and mouseb
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’mousey ? return the y-position of a mouseclick
\h’\n[lss]u’Synopsis
\h’\n[lss]u’inkey$
\h’\n[lss]u’print mousey()
\h’\n[lss]u’print mousey
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’print mousey(a$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
mousey-function is a helper function for decoding part of
the (rather
\h’\n[lss]u’complicated) strings, which are
returned by the inkey$-function. mousey returns
\h’\n[lss]u’the y-position of the mouse as
encoded within its argument.
\h’\n[lss]u’The
mousey-function accepts zero or one arguments. A single
argument should be
\h’\n[lss]u’a string returned by the
inkey$-function; if mousey is called without any
\h’\n[lss]u’arguments, it returns the values
from the last call to inkey$ (which are stored
\h’\n[lss]u’implicitly and internally by
yabasic).
\h’\n[lss]u’Note
\h’\n[lss]u’Please see also the Note within the mouseb-function.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’clear screen
\h’\n[lss]u’do
\h’\n[lss]u’a$=inkey$
\h’\n[lss]u’if (left$(a$,2)="MB") then
\h’\n[lss]u’line 0,mousey to 200,mousey
\h’\n[lss]u’endif
\h’\n[lss]u’loop
\h’\n[lss]u’This
example draws horizontal lines at the position, where the
mousebutton has
\h’\n[lss]u’been pressed.
\h’\n[lss]u’See also
\h’\n[lss]u’inkey$, mousemod, mousex and mouseb
\h’\n[lss]u’N
\h’\n[lss]u’new
curve ? start a new curve, that will be drawn with the
line-command
\h’\n[lss]u’next ? mark the end of a for loop
\h’\n[lss]u’not ? negate an expression; can be
written as !
\h’\n[lss]u’numparams ? return the number of
parameters, that have been passed to a
\h’\n[lss]u’subroutine
\h’\n[lss]u’Name
\h’\n[lss]u’new curve ? start a new curve, that will be drawn with the line-command
\h’\n[lss]u’Synopsis
\h’\n[lss]u’new
curve
\h’\n[lss]u’line to x,y
\h’\n[lss]u’Description
\h’\n[lss]u’The
new curve-function starts a new sequence of lines, that will
be drawn by
\h’\n[lss]u’repeated line to-commands.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’ellipse(100,50,30,60)
\h’\n[lss]u’ellipse(150,100,60,30)
\h’\n[lss]u’sub ellipse(x,y,xr,yr)
\h’\n[lss]u’new curve
\h’\n[lss]u’for a=0 to 2*pi step 0.2
\h’\n[lss]u’line to x+xr*cos(a),y+yr*sin(a)
\h’\n[lss]u’next a
\h’\n[lss]u’close curve
\h’\n[lss]u’end sub
\h’\n[lss]u’This
example defines a subroutine ellipse that draws an ellipse.
Within this
\h’\n[lss]u’subroutine, the ellipse is drawn as
a sequence of lines started with the new
\h’\n[lss]u’curve command and closed with close
curve.
\h’\n[lss]u’See also
\h’\n[lss]u’line, close curve
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’next ? mark the end of a for loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’for
a=1 to 10
\h’\n[lss]u’next a
\h’\n[lss]u’Description
\h’\n[lss]u’The
next-keyword marks the end of a for-loop. All statements up
to the
\h’\n[lss]u’next-keyword will be repeated as
specified with the for-clause. Note, that the
\h’\n[lss]u’name of the variable is optional; so
instead of next a you may write next.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 300000
\h’\n[lss]u’for b=1 to 21+20*sin(pi*a/20)
\h’\n[lss]u’print "*";
\h’\n[lss]u’next b
\h’\n[lss]u’print
\h’\n[lss]u’sleep 0.1
\h’\n[lss]u’next a
\h’\n[lss]u’This example simply plots a sine-curve until you fall asleep.
\h’\n[lss]u’See also
\h’\n[lss]u’for
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’not ? negate an expression; can be written as !
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(not a<b) then ?
\h’\n[lss]u’bad=!okay
\h’\n[lss]u’Description
\h’\n[lss]u’The
keyword not (or ! for short) is mostly used within
conditions (e.g. within
\h’\n[lss]u’if- or while-statements). There it
is employed to negate the condition or
\h’\n[lss]u’expression (i.e. turn TRUE into
FALSE and vice versa)
\h’\n[lss]u’However
not can be used within arithmetic calculations too., simply
because
\h’\n[lss]u’there is no difference between
arithmetic and logical expressions.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter three ascending numbers: " a,b,c
\h’\n[lss]u’if (not (a<b and b<c)) error
" the numbers you have entered are not ascending
..."
\h’\n[lss]u’See also
\h’\n[lss]u’and,or
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’numparams
? return the number of parameters, that have been passed to
a
\h’\n[lss]u’subroutine
\h’\n[lss]u’Synopsis
\h’\n[lss]u’sub
foo(a,b,c)
\h’\n[lss]u’if (numparams=1) ?
\h’\n[lss]u’?
\h’\n[lss]u’end sub
\h’\n[lss]u’Description
\h’\n[lss]u’Within
a subroutine the local variable numparam or numparams
contains the
\h’\n[lss]u’number of parameters, that have been
passed to the subroutine. This information
\h’\n[lss]u’can be useful, because the
subroutine may have been called with fewer
\h’\n[lss]u’parameters than actually declared.
The number of values that actually have been
\h’\n[lss]u’passed while calling the subroutine,
can be found in numparams.
\h’\n[lss]u’Note,
that arguments which are used in the definition of a
subroutine but are
\h’\n[lss]u’left out during a call to it
(thereby reducing the value of numparams) receive
\h’\n[lss]u’a value of 0 or "" (empty
string) respectively.
\h’\n[lss]u’Example
\h’\n[lss]u’a$="123456789"
\h’\n[lss]u’print part$(a$,4)
\h’\n[lss]u’print part$(a$,3,7)
\h’\n[lss]u’sub
part$(a$,f,t)
\h’\n[lss]u’if (numparams=2) then
\h’\n[lss]u’return mid$(a$,f)
\h’\n[lss]u’else
\h’\n[lss]u’return mid$(a$,f,t-f+1)
\h’\n[lss]u’end if
\h’\n[lss]u’end sub
\h’\n[lss]u’When
you run this example, it will print 456789 and 34567. Take a
look at the
\h’\n[lss]u’subroutine part$, which returns part
of the string which has been passed as an
\h’\n[lss]u’argument. If (besides the string)
two numbers are passed, they define the
\h’\n[lss]u’starting and end position of the
substring, that will be returned. However, if
\h’\n[lss]u’only one number is passed, the rest
of the string, starting from this position
\h’\n[lss]u’will be returned. Each of these
cases is recognized with the help of the
\h’\n[lss]u’numparams variable.
\h’\n[lss]u’See also
\h’\n[lss]u’sub
\h’\n[lss]u’O
\h’\n[lss]u’on
gosub ? jump to one of multiple gosub-targets
\h’\n[lss]u’on goto ? jump to one of many
goto-targets
\h’\n[lss]u’on interrupt ? change reaction on
keyboard interrupts
\h’\n[lss]u’open ? open a file
\h’\n[lss]u’open printer ? open printer for
printing graphics
\h’\n[lss]u’open window ? open a graphic window
\h’\n[lss]u’logical or ? logical or, used in
conditions
\h’\n[lss]u’or() ? arithmetic or, used for
bit-operations
\h’\n[lss]u’Name
\h’\n[lss]u’on goto ? jump to one of multiple gosub-targets
\h’\n[lss]u’Synopsis
\h’\n[lss]u’on
a gosub foo,bar,baz
\h’\n[lss]u’?
\h’\n[lss]u’label foo
\h’\n[lss]u’?
\h’\n[lss]u’return
\h’\n[lss]u’label
bar
\h’\n[lss]u’?
\h’\n[lss]u’return
\h’\n[lss]u’label
baz
\h’\n[lss]u’?
\h’\n[lss]u’return
\h’\n[lss]u’Description
\h’\n[lss]u’The
on gosub statement uses its numeric argument (the one
between on and gosub)
\h’\n[lss]u’to select an element from the list
of labels, which follows after the
\h’\n[lss]u’gosub-keyword: If the number is 1,
the program does a gosub to the first label;
\h’\n[lss]u’if the number is 2, to the second
and, so on. if the number is zero or less,
\h’\n[lss]u’the program continues at the
position of the first label; if the number is
\h’\n[lss]u’larger than the total count of
labels, the execution continues at the position
\h’\n[lss]u’of the last label; i.e. the first
and last label in the list constitute some
\h’\n[lss]u’kind of fallback-slot.
\h’\n[lss]u’Note,
that the on gosub-command can no longer be considered state
of the art;
\h’\n[lss]u’people (not me !) may even start to
mock you, if you use it.
\h’\n[lss]u’Example
\h’\n[lss]u’do
\h’\n[lss]u’print "Please enter a number
between 1 and 3: "
\h’\n[lss]u’print
\h’\n[lss]u’input "Your choice " a
\h’\n[lss]u’on a gosub bad,one,two,three,bad
\h’\n[lss]u’loop
\h’\n[lss]u’label
bad
\h’\n[lss]u’print "No. Please between 1 and
3"
\h’\n[lss]u’return
\h’\n[lss]u’label
one
\h’\n[lss]u’print "one"
\h’\n[lss]u’return
\h’\n[lss]u’label
two
\h’\n[lss]u’print "two"
\h’\n[lss]u’return
\h’\n[lss]u’label
three
\h’\n[lss]u’print "three"
\h’\n[lss]u’return
\h’\n[lss]u’Note,
how invalid input (a number less than 1, or larger than 3)
is
\h’\n[lss]u’automatically detected.
\h’\n[lss]u’See also
\h’\n[lss]u’goto, on gosub/function>
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’on goto ? jump to one of many goto-targets
\h’\n[lss]u’Synopsis
\h’\n[lss]u’on
a goto foo,bar,baz
\h’\n[lss]u’?
\h’\n[lss]u’label foo
\h’\n[lss]u’?
\h’\n[lss]u’label bar
\h’\n[lss]u’?
\h’\n[lss]u’label baz
\h’\n[lss]u’?
\h’\n[lss]u’Description
\h’\n[lss]u’The
on goto statement uses its numeric argument (the one between
on and goto to
\h’\n[lss]u’select an element from the list of
labels, which follows after the
\h’\n[lss]u’goto-keyword: If the number is 1,
the execution continues at the first label;
\h’\n[lss]u’if the number is 2, at the second,
and so on. if the number is zero or less,
\h’\n[lss]u’the program continues at the
position of the first label; if the number is
\h’\n[lss]u’larger than the total count of
labels, the execution continues at the position
\h’\n[lss]u’of the last label; i.e. the first
and last label in the list constitute some
\h’\n[lss]u’kind of fallback-slot.
\h’\n[lss]u’Note,
that (unlike the goto-command) the on goto-command can no
longer be
\h’\n[lss]u’considered state of the art; people
may (not me !) even start to mock you, if
\h’\n[lss]u’you use it.
\h’\n[lss]u’Example
\h’\n[lss]u’label
over
\h’\n[lss]u’print "Please Select one of
these choices: "
\h’\n[lss]u’print
\h’\n[lss]u’print " 1 -- show time"
\h’\n[lss]u’print " 2 -- show date"
\h’\n[lss]u’print " 3 -- exit"
\h’\n[lss]u’print
\h’\n[lss]u’input "Your choice " a
\h’\n[lss]u’on a goto
over,show_time,show_date,terminate,over
\h’\n[lss]u’label
show_time
\h’\n[lss]u’print time$()
\h’\n[lss]u’goto over
\h’\n[lss]u’label
show_date
\h’\n[lss]u’print date$()
\h’\n[lss]u’goto over
\h’\n[lss]u’label
terminate
\h’\n[lss]u’exit
\h’\n[lss]u’Note,
how invalid input (a number less than 1, or larger than 3)
is
\h’\n[lss]u’automatically detected; in such a
case the question is simply issued again.
\h’\n[lss]u’See also
\h’\n[lss]u’goto, on gosub/function>
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’on interrupt ? change reaction on keyboard interrupts
\h’\n[lss]u’Synopsis
\h’\n[lss]u’on
interrupt break
\h’\n[lss]u’?
\h’\n[lss]u’on interrupt continue
\h’\n[lss]u’Description
\h’\n[lss]u’With
the on interrupt-command you may change the way, how yabasic
reacts on a
\h’\n[lss]u’keyboard interrupt; it comes in two
variants: on interrupt break and on
\h’\n[lss]u’interrupt continue. A keyboard
interrupt is produced, if you press ctrl-C on
\h’\n[lss]u’your keyboard; normally (and
certainly after you have called on interrupt
\h’\n[lss]u’break), yabasic will terminate with
an error message. However after the command
\h’\n[lss]u’on interrupt continue yabasic
ignores any keyboard interrupt. This may be
\h’\n[lss]u’useful, if you do not want your
program being interruptible during certain
\h’\n[lss]u’critical operations (e.g. updating
of files).
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Please stand by while writing a file with random data
..."
\h’\n[lss]u’on interrupt continue
\h’\n[lss]u’open "random.data" for
writing as #1
\h’\n[lss]u’for a=1 to 100
\h’\n[lss]u’print #1 ran(100)
\h’\n[lss]u’print a," percent done."
\h’\n[lss]u’sleep 1
\h’\n[lss]u’next a
\h’\n[lss]u’close #1
\h’\n[lss]u’on interrupt continue
\h’\n[lss]u’This
program writes a file with 100 random numbers. The on
interrupt continue
\h’\n[lss]u’command insures, that the program
will not be terminated on a keyboard
\h’\n[lss]u’interrupt and the file will be
written entirely in any case. The sleep-command
\h’\n[lss]u’just stretches the process
artificially to give you a chance to try a ctrl-C.
\h’\n[lss]u’See also
\h’\n[lss]u’There is no related command.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’open ? open a file
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
a,"file","r"
\h’\n[lss]u’open
#a,"file","w"
\h’\n[lss]u’open #a,printer
\h’\n[lss]u’open "file" for reading as
a
\h’\n[lss]u’open "file" for writing as
#a
\h’\n[lss]u’a=open("file")
\h’\n[lss]u’a=open("file","r")
\h’\n[lss]u’if (open(a,"file")) ?
\h’\n[lss]u’if
(open(a,"file","w")) ?
\h’\n[lss]u’Description
\h’\n[lss]u’The
open-command opens a file for reading or writing or a
printer for printing
\h’\n[lss]u’text. open comes in a wide variety
of ways; it requires these arguments:
\h’\n[lss]u’filenumber
\h’\n[lss]u’In
the synopsis this is a or #a. In yabasic each file is
associated with a
\h’\n[lss]u’number between 1 and a maximum
value, which depends on the operating
\h’\n[lss]u’system. For historical reasons the
filenumber can be preceded by a hash (’#
\h’\n[lss]u’’). Note, that specifying a
filenumber is optional; if it is omitted, the
\h’\n[lss]u’open-function will return a
filenumber, which should then be stored in a
\h’\n[lss]u’variable for later reference. This
filenumber can be a simple number or an
\h’\n[lss]u’arbitrary complex arithmetic
expression, in which case braces might be
\h’\n[lss]u’necessary to save yabasic from
getting confused.
\h’\n[lss]u’filename
\h’\n[lss]u’In
the synopsis above this is "file". This string
specifies the name of the
\h’\n[lss]u’file to open (note the important
caveat on specifying these filenames).
\h’\n[lss]u’accessmode
\h’\n[lss]u’In
the synopsis this is "r", "w", for
reading or for writing. This string
\h’\n[lss]u’or clause specifies the mode in
which the file is opened; it may be one of:
\h’\n[lss]u’"r"
\h’\n[lss]u’Open
the file for reading (may also be written as for reading).
If the
\h’\n[lss]u’file does not exist, the command
will fail. This mode is the default,
\h’\n[lss]u’i.e. if no mode is specified with
the open-command, the file will be
\h’\n[lss]u’opened with this mode.
\h’\n[lss]u’"w"
\h’\n[lss]u’Open
the file for writing (may also be written as for writing).
If the
\h’\n[lss]u’file does not exist, it will be
created.
\h’\n[lss]u’"a"
\h’\n[lss]u’Open
the file for appending, i.e. what you write to the file will
be
\h’\n[lss]u’appended after its initial contents.
If the file does not exist, it
\h’\n[lss]u’will be created.
\h’\n[lss]u’"b"
\h’\n[lss]u’This
letter may not appear alone, but may be combined with the
other
\h’\n[lss]u’letters (e.g. "rb") to
open a file in binary mode (as opposed to text
\h’\n[lss]u’mode).
\h’\n[lss]u’As
you may see from the synopsis, the open-command may either
be called as a
\h’\n[lss]u’command (without braces) or as a
function (with braces). If called as a
\h’\n[lss]u’function, it will return the
filenumber or zero if the operation fails.
\h’\n[lss]u’Therefore the open-function may be
used within the condition of an
\h’\n[lss]u’if-statement.
\h’\n[lss]u’If
the open-command fails, you may use peek("error")
to retrieve the exact
\h’\n[lss]u’nature of the error.
\h’\n[lss]u’Furthermore
note, that there is another, somewhat separate usage of the
\h’\n[lss]u’open-command; if you specify the
bareword printer instead of a filename, the
\h’\n[lss]u’command opens a printer for printing
text. Every text (and only text) you print
\h’\n[lss]u’to this file will appear on your
printer. Note, that this is very different
\h’\n[lss]u’from printing graphics, as can be
done with open printer.
\h’\n[lss]u’Example
\h’\n[lss]u’open
"foo.bar" for writing as #1
\h’\n[lss]u’print #1 "Hallo !"
\h’\n[lss]u’close #1
\h’\n[lss]u’if (not open(1,"foo.bar"))
error "Could not open ’foo.bar’ for
reading"
\h’\n[lss]u’while(not eof(1))
\h’\n[lss]u’line input #1 a$
\h’\n[lss]u’print a$
\h’\n[lss]u’wend
\h’\n[lss]u’This
example simply opens the file foo.bar, writes a single line,
reopens it
\h’\n[lss]u’and reads its contents again.
\h’\n[lss]u’See also
\h’\n[lss]u’close, print, peek, peek("error") and open printer
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’open printer ? open printer for printing graphics
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
printer
\h’\n[lss]u’open printer "file"
\h’\n[lss]u’Description
\h’\n[lss]u’The
open printer-command opens a printer for printing graphics.
The command
\h’\n[lss]u’requires, that a graphic window has
been opened before. Everything that is
\h’\n[lss]u’drawn into this window will then be
sent to the printer too.
\h’\n[lss]u’A
new piece of paper may be started with the clear
window-command; the final
\h’\n[lss]u’(or only) page will appear after the
close printer-command.
\h’\n[lss]u’Note,
that you may specify a filename with open printer; in that
case the
\h’\n[lss]u’printout will be sent to a filename
instead to a printer. Your program or the
\h’\n[lss]u’user will be responsible for sending
this file to the printer afterwards.
\h’\n[lss]u’If
you use yabasic under Unix, you will need a postscript
printer (because
\h’\n[lss]u’yabasic produces postscript output).
Alternatively you may use ghostscript to
\h’\n[lss]u’transform the postscript file into a
form suitable for your printer; but that
\h’\n[lss]u’is beyond the responsibility of
yabasic.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’open printer
\h’\n[lss]u’line 0,0 to 200,200
\h’\n[lss]u’text 100,100,"Hallo"
\h’\n[lss]u’close window
\h’\n[lss]u’close printer
\h’\n[lss]u’This
example will open a window, draw a line and print some text
within;
\h’\n[lss]u’everything will appear on your
printer too.
\h’\n[lss]u’See also
\h’\n[lss]u’close printer
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’open window ? open a graphic window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
window x,y
\h’\n[lss]u’open window x,y,"font"
\h’\n[lss]u’Description
\h’\n[lss]u’The
open window-command opens a window of the specified size.
Only one window
\h’\n[lss]u’can be opened at any given moment of
time.
\h’\n[lss]u’An
optional third argument specifies a font to be used for any
text within the
\h’\n[lss]u’window. It can however be changed
with any subsequent text-command.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=200 to 400 step 10
\h’\n[lss]u’open window a,a
\h’\n[lss]u’for b=0 to a
\h’\n[lss]u’line 0,b to a,b
\h’\n[lss]u’line b,0 to b,a
\h’\n[lss]u’sleep 0.1
\h’\n[lss]u’close window
\h’\n[lss]u’next a
\h’\n[lss]u’See also
\h’\n[lss]u’close window, text
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’or ? logical or, used in conditions
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(a or b) ?
\h’\n[lss]u’while (a or b) ?
\h’\n[lss]u’Description
\h’\n[lss]u’Used
in conditions (e.g within if or while) to join two
expressions. Returns
\h’\n[lss]u’true, if either its left or its
right or both arguments are true; returns false
\h’\n[lss]u’otherwise.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a number"
\h’\n[lss]u’if (a>9 or a<1) print "a
is not between 1 and 9"
\h’\n[lss]u’See also
\h’\n[lss]u’and,not
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’or() ? arithmetic or, used for bit-operations
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=or(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’Used
to compute the bitwise or of both its argument. Both
arguments are treated
\h’\n[lss]u’as binary numbers (i.e. a series of
0 and 1); a bit of the resulting value will
\h’\n[lss]u’then be 1, if any of its arguments
has 1 at this position in their binary
\h’\n[lss]u’representation.
\h’\n[lss]u’Note,
that both arguments are silently converted to integer values
and that
\h’\n[lss]u’negative numbers have their own
binary representation and may lead to
\h’\n[lss]u’unexpected results when passed to
or.
\h’\n[lss]u’Example
\h’\n[lss]u’print or(14,3)
\h’\n[lss]u’This
will print 15. This result is clear, if you note, that the
binary
\h’\n[lss]u’representation of 14 and 3 are 1110
and 0011 respectively; this will yield 1111
\h’\n[lss]u’in binary representation or 15 as
decimal.
\h’\n[lss]u’See also
\h’\n[lss]u’oand, eor and not
\h’\n[lss]u’P
\h’\n[lss]u’pause
? pause, sleep, wait for the specified number of seconds
\h’\n[lss]u’peek ? retrieve various internal
information
\h’\n[lss]u’peek$ ? retrieve various internal
string-information
\h’\n[lss]u’pi ? a constant with the value
3.14159
\h’\n[lss]u’poke ? change selected internals of
yabasic
\h’\n[lss]u’print ? Write to terminal or file
\h’\n[lss]u’print color ? print with color
\h’\n[lss]u’print colour ? see print color
\h’\n[lss]u’putbit ? draw a rectangle of pixels
encoded within a string into the graphics
\h’\n[lss]u’window
\h’\n[lss]u’putscreen ? draw a rectangle of
characters into the text terminal
\h’\n[lss]u’Name
\h’\n[lss]u’pause ? pause, sleep, wait for the specified number of seconds
\h’\n[lss]u’Synopsis
\h’\n[lss]u’pause 5
\h’\n[lss]u’Description
\h’\n[lss]u’The
pause-command has many different names: You may write pause,
sleep or wait
\h’\n[lss]u’interchangeably; whatever you write,
yabasic will always do exactly the same.
\h’\n[lss]u’The
pause-command will simply wait for the specified number of
seconds. This
\h’\n[lss]u’may be a fractional number, so you
may well wait less than a second. However,
\h’\n[lss]u’if you try to pause for a smaller
and smaller interval (e.g. 0.1 seconds, 0.01
\h’\n[lss]u’seconds, 0.001 seconds and so on)
you will find that at some point yabasic will
\h’\n[lss]u’not wait at all. The minimal
interval that can be waited depends on the system
\h’\n[lss]u’(Unix, Windows) you are using.
\h’\n[lss]u’The
pause-command cannot be interrupted. However, sometimes you
may want the
\h’\n[lss]u’wait to be interruptible by simply
pressing a key on the keyboard. In such
\h’\n[lss]u’cases you should consider using the
inkey$-function, with a number of seconds
\h’\n[lss]u’as an argument).
\h’\n[lss]u’Example
\h’\n[lss]u’deg=0
\h’\n[lss]u’do
\h’\n[lss]u’maxx=44+40*sin(deg)
\h’\n[lss]u’for x=1 to maxx
\h’\n[lss]u’print "*";
\h’\n[lss]u’next x
\h’\n[lss]u’pause 0.1+(maxx*maxx/(4*84*84))
\h’\n[lss]u’print
\h’\n[lss]u’deg=deg+0.1
\h’\n[lss]u’loop
\h’\n[lss]u’This
example draws a sine-curve; due to the pause-statement the
speed of
\h’\n[lss]u’drawing varies in the same way as
the speed of a ball might vary, if it would
\h’\n[lss]u’roll along this curve under the
influence of gravity.
\h’\n[lss]u’See also
\h’\n[lss]u’sleep, wait
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’peek ? retrieve various internal information
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
peek("foo")
\h’\n[lss]u’a=peek(#1)
\h’\n[lss]u’Description
\h’\n[lss]u’The
peek-function has many different and mostly unrelated uses.
It is a kind of
\h’\n[lss]u’grab-bag for retrieving all kinds of
numerical information, internal to yabasic
\h’\n[lss]u’. The meaning of the numbers
returned be the peek-function depends on the
\h’\n[lss]u’string or number passed as an
argument.
\h’\n[lss]u’peek
always returns a number, however the closely related
peek$-function
\h’\n[lss]u’exists, which may be used to
retrieve string information from among the
\h’\n[lss]u’internals of yabasic. Finally note,
that some of the values which are retrieved
\h’\n[lss]u’with peek may even be changed, using
the poke-function.
\h’\n[lss]u’There
are two variants of the peek-function: One expects an
integer, positive
\h’\n[lss]u’number and is described within the
first entry of the list below. The other
\h’\n[lss]u’variant expects one of a well
defined set of strings as described in the second
\h’\n[lss]u’and all the following entries of the
list below.
\h’\n[lss]u’peek(a)
\h’\n[lss]u’Read a single character from the file a (which must be open of course).
\h’\n[lss]u’peek("argument")
\h’\n[lss]u’Return
the number of arguments, that have been passed to yabasic at
\h’\n[lss]u’invocation time. E.g. if yabasic has
been called like this: yabasic foo.yab
\h’\n[lss]u’bar baz, then
peek("argument") will return 2. This is because
foo.yab is
\h’\n[lss]u’treated as the name of the program
to run, whereas bar and baz are
\h’\n[lss]u’considered arguments to the program,
which are passed on the command line.
\h’\n[lss]u’Note, that for windows-users, who
tend to click on the icon (as opposed to
\h’\n[lss]u’starting yabasic on the command
line), this peekwill mostly return 0.
\h’\n[lss]u’The function peek("argument") can be written as peek("arguments") too.
\h’\n[lss]u’You
will want to check out the corresponding function
peek$("argument") to
\h’\n[lss]u’actually retrieve the arguments.
Note, that each call to peek$("argument")
\h’\n[lss]u’reduces the number returned by
peek("argument").
\h’\n[lss]u’peek("error")
\h’\n[lss]u’Return
a number specifying the nature of the last error in an open-
or
\h’\n[lss]u’seek-statement. Normally an error
within an open-statement immediately
\h’\n[lss]u’terminates your program with an
appropriate error-message, so there is no
\h’\n[lss]u’chance and no need to learn more
about the nature of the error. However, if
\h’\n[lss]u’you use open as a condition (e.g. if
(open(#1,"foo")) ?) the outcome
\h’\n[lss]u’(success or failure) of the
open-operation will determine, if the condition
\h’\n[lss]u’evaluates to true or false. If now
such an operation fails, your program
\h’\n[lss]u’will not be terminated and you might
want to learn the reason for failure.
\h’\n[lss]u’This reason will be returned by
peek("error") (as a number) or by peek$
\h’\n[lss]u’("error") (as a
string)
\h’\n[lss]u’The
table below shows the various error codes; the value
returned by peek$
\h’\n[lss]u’("error") explains the
nature of the error. Note, that the codes 10,11 and
\h’\n[lss]u’12 refer to the seek-command.
\h’\n[lss]u’Table 7.1. Error codes
\h’\n[lss]u’+-------------------------------------------------------------------------+
\h’\n[lss]u’| peek |peek$("error")|
Explanation |
\h’\n[lss]u’|("error")| | |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| 2 |Stream already|Do not try to
open one and the same filenumber |
\h’\n[lss]u’| |in use |twice; rather close it
first. |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| |’x’ is not a |The
optional filemode argument, which may be |
\h’\n[lss]u’| 3 |valid filemode|passed to the
open-function, has an invalid |
\h’\n[lss]u’| | |value |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| 4 |could not open|The open-call
did not work, no further |
\h’\n[lss]u’| |’foo’ |explanation is
available. |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| |reached |You have opened more
files than your operating |
\h’\n[lss]u’| 5 |maximum number|system permits.
|
\h’\n[lss]u’| |of open files | |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| |cannot open |The commands open
printer and open #1,printer |
\h’\n[lss]u’| |printer: |both open a printer
(refer to their description |
\h’\n[lss]u’| 6 |already |for the difference).
However, only one can be |
\h’\n[lss]u’| |printing |active at a time; if
you try to do both at the |
\h’\n[lss]u’| |graphics |same time, you will
receive this error. |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| 7 |could not open|Well, it simply
did not work. |
\h’\n[lss]u’| |line printer | |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| 9 |invalid stream|An attempt to
use an invalid (e.g. negative) |
\h’\n[lss]u’| |number |stream number; example:
open(-1,"foo") |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| |could not | |
\h’\n[lss]u’| 10 |position |seek did not work. |
\h’\n[lss]u’| |stream x to | |
\h’\n[lss]u’| |byte y | |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| 11 |stream x not |You have tried
to seek within a stream, that has|
\h’\n[lss]u’| |open |not been opened yet. |
\h’\n[lss]u’|---------+--------------+------------------------------------------------|
\h’\n[lss]u’| |seek mode ’x’ |The
argument, which has been passed to seek is |
\h’\n[lss]u’| 12 |is none of |invalid. |
\h’\n[lss]u’| |begin,end,here| |
\h’\n[lss]u’+-------------------------------------------------------------------------+
\h’\n[lss]u’peek("fontheight")
\h’\n[lss]u’Return
the height of the font used within the graphic window. If
none is
\h’\n[lss]u’open, this peek will return the
height of the last font used or 10, if no
\h’\n[lss]u’window has been opened yet.
\h’\n[lss]u’peek("screenheight")
\h’\n[lss]u’Return
the height in characters of the window, wherein yabasic
runs. If you
\h’\n[lss]u’have not called clear screen yet,
this peekwill return 0, regardless of the
\h’\n[lss]u’size of your terminal.
\h’\n[lss]u’peek("screenwidth")
\h’\n[lss]u’Return
the width in characters of the window, wherein yabasic runs.
If you
\h’\n[lss]u’have not called clear screen yet,
this peekwill return 0, regardless of the
\h’\n[lss]u’size of your terminal.
\h’\n[lss]u’peek("secondsrunning")
\h’\n[lss]u’Return the number of seconds that have passed since the start of yabasic.
\h’\n[lss]u’peek("millisrunning")
\h’\n[lss]u’Return
the number of milliseconds, that have passed since the start
of
\h’\n[lss]u’yabasic.
\h’\n[lss]u’peek("version")
\h’\n[lss]u’Return
the version number of yabasic, e.g. 2.77. See also the
related peek$
\h’\n[lss]u’("version"), which returns
nearly the same information (plus the
\h’\n[lss]u’patchlevel) as a string, e.g.
"2.77.1".
\h’\n[lss]u’peek("winheight")
\h’\n[lss]u’Return
the height of the graphic-window in pixels. If none is open,
this
\h’\n[lss]u’peek will return the height of the
last window opened or 100, if none has
\h’\n[lss]u’been opened yet.
\h’\n[lss]u’peek("winwidth")
\h’\n[lss]u’Return
the width of the graphic-window in pixels. If none is open,
this
\h’\n[lss]u’peek will return the width of the
last window opened or 100, if none has
\h’\n[lss]u’been opened yet.
\h’\n[lss]u’peek("isbound")
\h’\n[lss]u’Return
true, if the executing yabasic-program is part of a
standalone
\h’\n[lss]u’program; see the section about
creating a standalone-program for details.
\h’\n[lss]u’peek("version")
\h’\n[lss]u’Return the version number of yabasic (e.g. 2.72).
\h’\n[lss]u’Example
\h’\n[lss]u’open
"foo" for reading as #1
\h’\n[lss]u’open "bar" for writing as
#2
\h’\n[lss]u’while(not eof(#1))
\h’\n[lss]u’poke #2,chr$(peek(#1));
\h’\n[lss]u’wend
\h’\n[lss]u’This program will copy the file foo byte by byte to bar.
\h’\n[lss]u’Note,
that each peek does something entirely different, and only
one has been
\h’\n[lss]u’demonstrated above. Therefore you
need to make up examples yourself for all the
\h’\n[lss]u’other peeks.
\h’\n[lss]u’See also
\h’\n[lss]u’peek$, poke, open
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’peek$ ? retrieve various internal string-information
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print peek$("foo")
\h’\n[lss]u’Description
\h’\n[lss]u’The
peek$-function has many different and unrelated uses. It is
a kind of
\h’\n[lss]u’grab-bag for retrieving all kinds of
string information, internal to yabasic;
\h’\n[lss]u’the exact nature of the strings
returned be the peek$-function depends on the
\h’\n[lss]u’string passed as an argument.
\h’\n[lss]u’peek$
always returns a string, however the closely related
peek-function
\h’\n[lss]u’exists, which may be used to
retrieve numerical information from among the
\h’\n[lss]u’internals of yabasic. Finally note,
that some of the values which are retrieved
\h’\n[lss]u’with peek$ may even be changed,
using the poke-function.
\h’\n[lss]u’The following list shows all possible arguments to peek$:
\h’\n[lss]u’peek$("infolevel")
\h’\n[lss]u’Returns
either "debug", "note",
"warning", "error" or "fatal",
depending on
\h’\n[lss]u’the current infolevel. This value
can be specified with an option on the
\h’\n[lss]u’command line or changed during the
execution of the program with the
\h’\n[lss]u’corresponding poke; however,
normally only the author of yabasic (me !)
\h’\n[lss]u’would want to change this from its
default value "warning".
\h’\n[lss]u’peek$("textalign")
\h’\n[lss]u’Returns
one of nine possible strings, specifying the default
alignment of
\h’\n[lss]u’text within the graphics-window. The
alignment-string returned by this peek
\h’\n[lss]u’describes, how the text-command
aligns its string-argument with respect to
\h’\n[lss]u’the coordinates supplied. However,
this value does not apply, if the
\h’\n[lss]u’text-command explicitly specifies an
alignment. Each of these strings is
\h’\n[lss]u’two characters long. The first
character specifies the horizontal alignment
\h’\n[lss]u’and can be either l, r or c, which
stand for left, right or center. The
\h’\n[lss]u’second character specifies the
vertical alignment and can be one of t, b or
\h’\n[lss]u’c, which stand for top, bottom or
center respectively.
\h’\n[lss]u’You
may change this value with the corresponding command poke
\h’\n[lss]u’"textalign",?; the initial
value is lb, which means the top of the left and
\h’\n[lss]u’the top edge if the text will be
aligned with the coordinates, that are
\h’\n[lss]u’specified within the
text-command.
\h’\n[lss]u’peek$("windoworigin")
\h’\n[lss]u’This
peek returns a two character string, which specifies the
position of
\h’\n[lss]u’the origin of the coordinate system
of the window; this string might be
\h’\n[lss]u’changed with the corresponding
command poke "windoworigin",x,y or specified
\h’\n[lss]u’as the argument of the origin
command; see there for a detailed description
\h’\n[lss]u’of the string, which might be
returned by this peek.
\h’\n[lss]u’peek$("program_name")
\h’\n[lss]u’Returns
the name of the yabasic-program that is currently executing;
\h’\n[lss]u’typically this is the name, that you
have specified on the commandline, but
\h’\n[lss]u’without any path-components. So this
peek$ might return foo.yab. As a
\h’\n[lss]u’special case when yabasic has been
invoked without the name of a program to
\h’\n[lss]u’be executed this peek will return
the literal strings standard input or,
\h’\n[lss]u’when also the option -e has been
specified, command line. See also peek$
\h’\n[lss]u’("program_file_name") and
peek$("interpreter_path") for related
\h’\n[lss]u’information.
\h’\n[lss]u’peek$("program_file_name")
\h’\n[lss]u’Returns
the full file-name of the yabasic-program that is currently
\h’\n[lss]u’executing; typically this is the
name, that you have specified on the
\h’\n[lss]u’commandline, including any
path-components. For the special case, that you
\h’\n[lss]u’have bound your yabasic-program with
the interpreter to a single standalone
\h’\n[lss]u’executable, this peek$ will return
its name. See also peek$("program_name")
\h’\n[lss]u’and
peek$("interpreter_path") for related
information.
\h’\n[lss]u’peek$("interpreter_path")
\h’\n[lss]u’Return
the full file-name of the yabasic-interpreter that is
currently
\h’\n[lss]u’executing your program; typically
this will end on yabasic or yabasic.exe
\h’\n[lss]u’depending on your platform and the
path will be where you installed yabasic
\h’\n[lss]u’. For bound programs (see creating a
standalone-program) however, this may
\h’\n[lss]u’be different and will include
whatever you specified during the bind
\h’\n[lss]u’-command.
\h’\n[lss]u’See
also peek$("program_name") and
peek$("program_file_name") for related
\h’\n[lss]u’information. Employing these, it
would be possible for a yabasic-program to
\h’\n[lss]u’start itself:
system(peek$("interpreter_path") + " " +
peek$
\h’\n[lss]u’("program_file_name")). Of
course, in this simple form this would be a bad
\h’\n[lss]u’idea, because this would start
concurrent instances of yabasic without end.
\h’\n[lss]u’peek$("error")
\h’\n[lss]u’Return
a string describing the nature of the last error in an open-
or
\h’\n[lss]u’seek-statement. See the
corresponding peek("error") for a detailed
\h’\n[lss]u’description.
\h’\n[lss]u’peek$("library")
\h’\n[lss]u’Return
the name of the library, this statement is contained in. See
the
\h’\n[lss]u’import-command for a detailed
description or for more about libraries.
\h’\n[lss]u’peek$("version")
\h’\n[lss]u’Version
of yabasic as a string; e.g. 2.77.1. See also the related
peek
\h’\n[lss]u’("version"), which returns
nearly the same information (minus the
\h’\n[lss]u’patchlevel) as a number, e.g.
2.77.
\h’\n[lss]u’peek$("os")
\h’\n[lss]u’This
peek returns the name of the operating system, where your
program
\h’\n[lss]u’executes. This can be either windows
or unix.
\h’\n[lss]u’peek$("font")
\h’\n[lss]u’Return
the name of the font, which is used for text within the
graphic
\h’\n[lss]u’window; this value can be specified
as the third argument to the open
\h’\n[lss]u’window-command.
\h’\n[lss]u’peek$("env","NAME")
\h’\n[lss]u’Return
the environment variable specified by NAME (which may be any
string
\h’\n[lss]u’expression). Which kind of
environment variables are available on your
\h’\n[lss]u’system depends, as well as their
meaning, on your system; however typing
\h’\n[lss]u’env on the command line will produce
a list (for Windows and Unix alike).
\h’\n[lss]u’Note, that
peek$("env",...) can be written as
peek$("environment",...) too.
\h’\n[lss]u’peek$("argument")
\h’\n[lss]u’Return
one of the arguments, that have been passed to yabasic at
invocation
\h’\n[lss]u’time (the next call will return the
the second argument, and so on). E.g.
\h’\n[lss]u’if yabasic has been called like
this: yabasic foo.yab bar baz, then the
\h’\n[lss]u’first call to
peek$("argument") will return bar. This is because
foo.yab is
\h’\n[lss]u’treated as the name of the program
to run, whereas bar and baz are
\h’\n[lss]u’considered arguments to this
program, which are passed on the command line.
\h’\n[lss]u’The second call to
peek$("argument") will return baz. Note, that for
\h’\n[lss]u’windows-users, who tend to click on
the icon (as opposed to starting
\h’\n[lss]u’yabasic on the command line), this
peekwill mostly return the empty string.
\h’\n[lss]u’Note, that peek$("argument") can be written as peek$("arguments").
\h’\n[lss]u’Finally
you will want to check out the corresponding function peek
\h’\n[lss]u’("argument").
\h’\n[lss]u’Example
\h’\n[lss]u’print
"You have supplied these arguments: "
\h’\n[lss]u’while(peek("argument"))
\h’\n[lss]u’print
peek("argument"),peek$("argument")
\h’\n[lss]u’wend
\h’\n[lss]u’If
you save this program in a file foo.yab and execute it via
yabasic t.yab a b
\h’\n[lss]u’c (for windows users: please use the
command line for this), your will get this
\h’\n[lss]u’output:
\h’\n[lss]u’3a
\h’\n[lss]u’2b
\h’\n[lss]u’1c
\h’\n[lss]u’See also
\h’\n[lss]u’peek, poke, open
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’pi ? a constant with the value 3.14159
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print pi
\h’\n[lss]u’Description
\h’\n[lss]u’pi
is 3.14159265359 (well at least for yabasic); do not try to
assign to pi
\h’\n[lss]u’(e.g. pi=22/7) this would not only
be mathematically dubious, but would also
\h’\n[lss]u’result in a syntax error.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=0 to 180
\h’\n[lss]u’print "The sine of
",a," degrees is ",sin(a*pi/180)
\h’\n[lss]u’next a
\h’\n[lss]u’This program uses pi to transform an angle from degrees into radians.
\h’\n[lss]u’See also
\h’\n[lss]u’euler
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’poke ? change selected internals of yabasic
\h’\n[lss]u’Synopsis
\h’\n[lss]u’poke
"foo","bar"
\h’\n[lss]u’poke "foo",baz
\h’\n[lss]u’poke #a,"bar"
\h’\n[lss]u’poke #a,baz
\h’\n[lss]u’Description
\h’\n[lss]u’The
poke-command may be used to change details of
yabasic’s behaviour. Like the
\h’\n[lss]u’related function peek, poke does
many different things, depending on the
\h’\n[lss]u’arguments supplied.
\h’\n[lss]u’Here are the different things you can do with poke:
\h’\n[lss]u’poke 5,a
\h’\n[lss]u’Write
the given byte (a in the example above) to the specified
stream (5#a
\h’\n[lss]u’in the example).
\h’\n[lss]u’See also the related function function peek(1).
\h’\n[lss]u’poke "dump","filename.dump"
\h’\n[lss]u’Dump
the internal form of your basic-program to the named file;
this is
\h’\n[lss]u’only useful for debugging the
internals of yabasic itself.
\h’\n[lss]u’The
second argument ("filename.dump" in the example)
should be the name of
\h’\n[lss]u’a file, that gets overwritten with
the dump, please be careful.
\h’\n[lss]u’poke "fontheight",12
\h’\n[lss]u’This
poke changes the default fontheight. This can only have an
effect, if
\h’\n[lss]u’the fonts given in the commands text
or open window do not specify a
\h’\n[lss]u’fontheight on their own.
\h’\n[lss]u’poke "font","fontname"
\h’\n[lss]u’This
poke specifies the default font. This can only have an
effect, if you
\h’\n[lss]u’do not supply a fontname with the
commands text or open window.
\h’\n[lss]u’poke "infolevel","debug"
\h’\n[lss]u’Change
the amount of internal information, that yabasic outputs
during
\h’\n[lss]u’execution.
\h’\n[lss]u’The
second argument can be either "debug",
"note", "warning", "error" or
\h’\n[lss]u’"fatal". However, normally
you will not want to change this from its
\h’\n[lss]u’default value
"warning".
\h’\n[lss]u’See also the related peek$("infolevel").
\h’\n[lss]u’poke "random_seed",42
\h’\n[lss]u’Set
the seed for the random number generator; if you do this,
the ran
\h’\n[lss]u’-function will return the same
sequence of numbers every time the program
\h’\n[lss]u’is started.
\h’\n[lss]u’poke "stdout","some text"
\h’\n[lss]u’Send
the given text to standard output. Normally one would use
print for
\h’\n[lss]u’this purpose; however, sending e.g.
control characters to your terminal is
\h’\n[lss]u’easier with this poke.
\h’\n[lss]u’poke "textalign","cc"
\h’\n[lss]u’This
poke changes the default alignment of text with respect to
the
\h’\n[lss]u’coordinates supplied within the
text-command. However, this value does not
\h’\n[lss]u’apply, if the text-command
explicitly specifies an alignment. The second
\h’\n[lss]u’argument ("cc" in the
example) must always be two characters long; the
\h’\n[lss]u’first character can be one of l
(left), r (right) or c (center); the second
\h’\n[lss]u’character can be either t (top), b
(bottom) or c (center); see the
\h’\n[lss]u’corresponding
peek$("textalign") for a detailed description of
this
\h’\n[lss]u’argument.
\h’\n[lss]u’poke "windoworigin","lt"
\h’\n[lss]u’This
poke moves the origin of the coordinate system of the window
to the
\h’\n[lss]u’specified position. The second
argument ("lt" in the example) must always
\h’\n[lss]u’be two characters long; the first
character can be one of l (left), r (
\h’\n[lss]u’right) or c (center); the second
character can be either t (top), b (bottom
\h’\n[lss]u’) or c (center). Together those two
characters specify the new position of
\h’\n[lss]u’the coordinate-origin. See the
corresponding peek$("windoworigin") for a
\h’\n[lss]u’more in depth description of this
argument.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Hello, now you will see, how much work"
\h’\n[lss]u’print "a simple for-loop
involves ..."
\h’\n[lss]u’input "Please press return
" a$
\h’\n[lss]u’poke
"infolevel","debug"
\h’\n[lss]u’for a=1 to 10:next a
\h’\n[lss]u’This
example only demonstrates one of the many pokes, which are
described
\h’\n[lss]u’above: The program switches the
infolevel to debug, which makes yabasic produce
\h’\n[lss]u’a lot of debug-messages during the
subsequent for-loop.
\h’\n[lss]u’See also
\h’\n[lss]u’peek, peek$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’print ? Write to terminal or file
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
"foo",a$,b
\h’\n[lss]u’print "foo",a$,b;
\h’\n[lss]u’print #a "foo",a$
\h’\n[lss]u’print #a "foo",a$;
\h’\n[lss]u’print foo using "##.###"
\h’\n[lss]u’print reverse "foo"
\h’\n[lss]u’print at(10,10) a$,b
\h’\n[lss]u’print @(10,10) a$,b
\h’\n[lss]u’print
color("red","blue") a$,b
\h’\n[lss]u’print color("magenta")
a$,b
\h’\n[lss]u’print
color("green","yellow") at(5,5) a$,b
\h’\n[lss]u’Description
\h’\n[lss]u’The
print-statement outputs strings or characters, either to
your terminal
\h’\n[lss]u’(also known as console) or to an
open file.
\h’\n[lss]u’To
understand all those uses of the print-statement,
let’s go through the
\h’\n[lss]u’various lines in the synopsis
above:
\h’\n[lss]u’print "foo",a$,b
\h’\n[lss]u’Print
the string foo as well as the contents of the variables a$
and b onto
\h’\n[lss]u’the screen, silently adding a
newline.
\h’\n[lss]u’print "foo",a$,b;
\h’\n[lss]u’(Note
the trailing semicolon !) This statement does the same as
the one
\h’\n[lss]u’above; only the implicit newline is
skipped, which means that the next
\h’\n[lss]u’print-statement will append
seamlessly.
\h’\n[lss]u’print #a "foo",a$
\h’\n[lss]u’This
is the way to write to files. The file with the number a
must be open
\h’\n[lss]u’already, an implicit newline is
added. Note the file-number #a, which
\h’\n[lss]u’starts with a hash (’#’)
amd is separated from the rest of the statement by
\h’\n[lss]u’a space only. The file-number
(contained in the variable a) must have been
\h’\n[lss]u’returned by a previous
open-statement (e.g. a=open("bar")).
\h’\n[lss]u’print #a "foo",a$;
\h’\n[lss]u’The same as above, but without the implicit newline.
\h’\n[lss]u’print foo using "##.###"
\h’\n[lss]u’Print
the number foo with as many digits before and after the
decimal dot
\h’\n[lss]u’as given by the number of
’#’-signs. See the entries for using and str$
for
\h’\n[lss]u’a detailed description of this
format.
\h’\n[lss]u’print reverse "foo"
\h’\n[lss]u’As
all the print-variants to follow, this form of the
print-statement can
\h’\n[lss]u’only be issued after clear screen
has been called. The strings and numbers
\h’\n[lss]u’after the reverse-clause are simply
printed inverse (compared to the normal
\h’\n[lss]u’print-statement).
\h’\n[lss]u’print at(10,10) a$,b
\h’\n[lss]u’Print
at the specified (x,y)-position. This is only allowed after
clear
\h’\n[lss]u’screen has been called. You may want
to query peek$("screenwidth") or peek$
\h’\n[lss]u’("screenheight") to learn
the actual size of your screen. You may add a
\h’\n[lss]u’semicolon to suppress the implicit
newline.
\h’\n[lss]u’print @(10,10) a$,b
\h’\n[lss]u’This is exactly the same as above, however, at may be written as @.
\h’\n[lss]u’print color("red","blue") at(5,5) a$,b
\h’\n[lss]u’Print
with the specified fore- ("red") and background
("blue") color (or
\h’\n[lss]u’colour). The possible values are
"black", "white", "red",
"blue", "green",
\h’\n[lss]u’"yellow", "cyan"
or "magenta". Again, you need to call clear screen
first
\h’\n[lss]u’and add a semicolon if you want to
suppress the implicit newline.
\h’\n[lss]u’print color("magenta") a$,b
\h’\n[lss]u’You may specify the foreground color only.
\h’\n[lss]u’print color("green","yellow") a$,b
\h’\n[lss]u’A
color and a position (in this sequence, not the other way
around) may be
\h’\n[lss]u’specified at once.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’columns=peek("screenwidth")
\h’\n[lss]u’lines=peek("screenheight")
\h’\n[lss]u’dim col$(7)
\h’\n[lss]u’for a=0 to 7:read col$(a):next a
\h’\n[lss]u’data
"black","white","red","blue","green","yellow","cyan","magenta"
\h’\n[lss]u’for
a=0 to 2*pi step 0.1
\h’\n[lss]u’print colour(col$(mod(i,8)))
at(columns*(0.8*sin(a)+0.9)/2,lines*(0.8*cos(a)+0.9)/2)
"*"
\h’\n[lss]u’i=i+1
\h’\n[lss]u’next a
\h’\n[lss]u’This example draws a colored ellipse within the text window.
\h’\n[lss]u’See also
\h’\n[lss]u’at, print color, input, clear screen, using, ;
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’print color ? print with color
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
color(fore$) text$
\h’\n[lss]u’print color(fore$,back$) text$
\h’\n[lss]u’Description
\h’\n[lss]u’Not
a separate command, but part of the print-command; may be
included just
\h’\n[lss]u’after print and can only be issued
after clear screen has been executed.
\h’\n[lss]u’color()
takes one or two string-arguments, specifying the color of
the text and
\h’\n[lss]u’(optionally) the background.
\h’\n[lss]u’The
one or two strings passed to color() can be one of these:
"black", "white",
\h’\n[lss]u’"red", "blue",
"green", "yellow", "cyan" and
"magenta" (which can be
\h’\n[lss]u’abbreviated as "bla",
"whi", "red", "blu",
"gre", "yel", "cya" and
"mag"
\h’\n[lss]u’respectively).
\h’\n[lss]u’color() can only be used, if clear scren has been issued at least once.
\h’\n[lss]u’Note, that color() can be written as colour() too.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’dim col$(7):for a=0 to 7:read
col$(a):next a
\h’\n[lss]u’do
\h’\n[lss]u’print
color(col$(ran(7)),col$(ran(7))) " Hallo ";
\h’\n[lss]u’pause 0.01
\h’\n[lss]u’loop
\h’\n[lss]u’data
"black","white","red","blue"
\h’\n[lss]u’data
"green","yellow","cyan","magenta"
\h’\n[lss]u’This prints the word " Hallo " in all colors across your screen.
\h’\n[lss]u’See also
\h’\n[lss]u’print, clear screen, at
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’print colour ? see print color
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
colour(fore$) text$
\h’\n[lss]u’print colour(fore$,back$) text$
\h’\n[lss]u’See also
\h’\n[lss]u’color
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’putbit
? draw a rectangle of pixels encoded within a string into
the graphics
\h’\n[lss]u’window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’?
\h’\n[lss]u’a$=getbit(20,20,50,50)
\h’\n[lss]u’?
\h’\n[lss]u’putbit a$,30,30
\h’\n[lss]u’putbit a$ to 30,30
\h’\n[lss]u’putbit a$,30,30,"or"
\h’\n[lss]u’Description
\h’\n[lss]u’The
putbit-command is the counterpart of the getbit$-function.
putbit requires
\h’\n[lss]u’a string as returned by the
getbit-function. Such a string contains a rectangle
\h’\n[lss]u’from the graphic window; the
putbit-function puts such a rectangular region
\h’\n[lss]u’back into the graphic-window.
\h’\n[lss]u’Note,
that the putbit-command currently accepts a fourth argument.
However only
\h’\n[lss]u’the string value "or" is
supported here. The effect is, that only those pixel,
\h’\n[lss]u’which are set in the string will be
set in the graphic window. Those pixels,
\h’\n[lss]u’which are not set in the string,
will not change in the window (as opposed to
\h’\n[lss]u’being cleared).
\h’\n[lss]u’Example
\h’\n[lss]u’c$="rgb 21,21:0000000000000000000000000000000000000000000000000000000000000032c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c8c8ff000032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000000000032c80032c80032c80032c80032c8c8ff00c8ff00c8ff00c8ff00c8ff00c8ff00c8ff000032c80032c80032c80032c80032c80000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80032c80000000000000000000000000000000000000000000000000000000000000000000032c80032c80032c80032c80032c80032c80032c80032c80032c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
\h’\n[lss]u’open window 200,200
\h’\n[lss]u’do
\h’\n[lss]u’x=ran(220)-10
\h’\n[lss]u’y=ran(220)-10
\h’\n[lss]u’putbit
c$,x,y,"transparent"
\h’\n[lss]u’loop
\h’\n[lss]u’This
program uses a precanned string (containing the image of a
blue circle
\h’\n[lss]u’with a yellow centre) and draws it
repeatedly into the graphic-window. The mode
\h’\n[lss]u’"transparent" ensures,
that no pixels will be cleared.
\h’\n[lss]u’There
are two possible values for the third argument of putbit.
Both modes
\h’\n[lss]u’differ in the way, they replace (or
not) any pixels from the window with pixels
\h’\n[lss]u’from the bitmap having the
background colour.
\h’\n[lss]u’transparent or t
\h’\n[lss]u’With
this mode the pixels from the window will be kept, if the
bitmap
\h’\n[lss]u’contains pixels with background
colour at this position; i.e. the bitmap is
\h’\n[lss]u’transparent
\h’\n[lss]u’solid or s
\h’\n[lss]u’With
this mode the pixels from the window will be overpainted
with the
\h’\n[lss]u’pixels from the bitmap in any case;
i.e. the bitmap is solid
\h’\n[lss]u’If you omit this argument, the default transparent applies.
\h’\n[lss]u’See also
\h’\n[lss]u’getbit$, open window
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’putscreen ? draw a rectangle of characters into the text terminal
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear
screen
\h’\n[lss]u’?
\h’\n[lss]u’a$=getscreen$(5,5,10,10)
\h’\n[lss]u’?
\h’\n[lss]u’putscreen a$,7,7
\h’\n[lss]u’Description
\h’\n[lss]u’The
putscreen-command is the counterpart of the
getscreen$-function. putscreen
\h’\n[lss]u’requires a string as returned by the
getscreen-function. Such a string contains
\h’\n[lss]u’a rectangular detail from the
terminal; the putscreen-function puts such a
\h’\n[lss]u’region back into the
terminal-window.
\h’\n[lss]u’Note, that clear screen must have been called before.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’for a=1 to 200
\h’\n[lss]u’print color("red")
"Hallo !";
\h’\n[lss]u’print color("blue")
"Welt !";
\h’\n[lss]u’next a
\h’\n[lss]u’r$=getscreen$(0,0,20,20)
\h’\n[lss]u’for x=0 to 60
\h’\n[lss]u’putscreen r$,x,0
\h’\n[lss]u’sleep 0.1
\h’\n[lss]u’next x
\h’\n[lss]u’This
example prints the string "Hallo !Welt !" all over
the screen and then
\h’\n[lss]u’moves a rectangle from one side to
the other.
\h’\n[lss]u’See also
\h’\n[lss]u’getscreen$, clear screen
\h’\n[lss]u’R
\h’\n[lss]u’ran()
? return a random number
\h’\n[lss]u’read ? read data from
data-statements
\h’\n[lss]u’rectangle ? draw a rectangle
\h’\n[lss]u’redim ? create an array prior to its
first use. A synonym for dim
\h’\n[lss]u’rem ? start a comment
\h’\n[lss]u’repeat ? start a repeat-loop
\h’\n[lss]u’restore ? reposition the
data-pointer
\h’\n[lss]u’return ? return from a subroutine or
a gosub
\h’\n[lss]u’reverse ? print reverse (background
and foreground colors exchanged)
\h’\n[lss]u’right$() ? return (or change) the
right end of a string
\h’\n[lss]u’rinstr() ? find the rightmost
occurrence of one string within the other
\h’\n[lss]u’rtrim$() ? trim spaces at the right
end of a string
\h’\n[lss]u’Name
\h’\n[lss]u’ran() ? return a random number
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
ran()
\h’\n[lss]u’x=ran(y)
\h’\n[lss]u’Description
\h’\n[lss]u’The
ran-function returns a random number. If no argument is
given, the number
\h’\n[lss]u’returned is in the range from 0 to
1; where only 0 is a possible value; 1 will
\h’\n[lss]u’never be returned. If an argument is
supplied, the number returned will be in
\h’\n[lss]u’the range from 0 up to this
argument, whereas this argument itself is not a
\h’\n[lss]u’possible return value. Regardless of
the range, ran is guaranteed to have
\h’\n[lss]u’exactly 2**30 different return
values.
\h’\n[lss]u’If
you call ran multiple times during your program, the
sequence of random
\h’\n[lss]u’numbers will be different each time
you invoke your program; however, if, e.g.
\h’\n[lss]u’for testing you prefer to always
have the same sequence of random numbers you
\h’\n[lss]u’may issue poke
"random_seed",123.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’c=peek("screenwidth")-1
\h’\n[lss]u’l=peek("screenheight")
\h’\n[lss]u’dim
col$(8)
\h’\n[lss]u’for a=0 to 7:read col$(a):next a
\h’\n[lss]u’data
"black","white","red","blue","green","yellow","cyan","magenta"
\h’\n[lss]u’do
\h’\n[lss]u’x=ran(c)
\h’\n[lss]u’y=l-ran(l*exp(-32*((x/c-1/2)**2)))
\h’\n[lss]u’i=i+1
\h’\n[lss]u’print color(col$(mod(i,8))) at(x,y)
"*";
\h’\n[lss]u’loop
\h’\n[lss]u’This example will print a colored bell-curve.
\h’\n[lss]u’See also
\h’\n[lss]u’int
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’read ? read data from data-statements
\h’\n[lss]u’Synopsis
\h’\n[lss]u’read
a$,a
\h’\n[lss]u’?
\h’\n[lss]u’data "Hello !",7
\h’\n[lss]u’Description
\h’\n[lss]u’The
read-statement retrieves literal data, which is stored
within
\h’\n[lss]u’data-statements elsewhere in your
program.
\h’\n[lss]u’Example
\h’\n[lss]u’read
num
\h’\n[lss]u’dim col$(num)
\h’\n[lss]u’for a=1 to num:read col$(a):next a
\h’\n[lss]u’clear screen
\h’\n[lss]u’print "These are the colours
known to yabasic:\n"
\h’\n[lss]u’for a=1 to num
\h’\n[lss]u’print colour(col$(a)) col$(a)
\h’\n[lss]u’next a
\h’\n[lss]u’data
8,"black","white","red","blue"
\h’\n[lss]u’data
"green","yellow","cyan","magenta"
\h’\n[lss]u’This
program prints the names of the colors known to yabasic in
those very
\h’\n[lss]u’colors.
\h’\n[lss]u’See also
\h’\n[lss]u’data, restore
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’rectangle ? draw a rectangle
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
window 100,100
\h’\n[lss]u’rectangle 10,10 to 90,90
\h’\n[lss]u’rectangle 20,20,80,80
\h’\n[lss]u’rect 20,20,80,80
\h’\n[lss]u’box 30,30,70,70
\h’\n[lss]u’clear rectangle 30,30,70,70
\h’\n[lss]u’fill rectangle 40,40,60,60
\h’\n[lss]u’clear fill rectangle 60,60,40,40
\h’\n[lss]u’Description
\h’\n[lss]u’The
rectangle-command (also known as box or rect, for short)
draws a rectangle;
\h’\n[lss]u’it accepts four parameters: The x-
and y-coordinates of two facing corners of
\h’\n[lss]u’the rectangle. With the optional
clauses clear and fill (which may appear
\h’\n[lss]u’together and in any sequence) the
rectangle can be cleared and filled
\h’\n[lss]u’respectively.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’c=1
\h’\n[lss]u’do
\h’\n[lss]u’for phi=0 to pi step 0.1
\h’\n[lss]u’if (c) then
\h’\n[lss]u’rectangle
100+100*sin(phi),100+100*cos(phi) to
100-100*sin(phi),100-100*cos(phi)
\h’\n[lss]u’else
\h’\n[lss]u’clear rectangle
100+100*sin(phi),100+100*cos(phi) to
100-100*sin(phi),100-100*cos(phi)
\h’\n[lss]u’endif
\h’\n[lss]u’sleep 0.1
\h’\n[lss]u’next phi
\h’\n[lss]u’c=not c
\h’\n[lss]u’loop
\h’\n[lss]u’This
example draws a nice animated pattern; watch it for a couple
of hours, to
\h’\n[lss]u’see how it develops.
\h’\n[lss]u’See also
\h’\n[lss]u’open window, open printer, line, circle, triangle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’redim ? create an array prior to its first use. A synonym for dim
\h’\n[lss]u’Synopsis
\h’\n[lss]u’See the dim-command.
\h’\n[lss]u’Description
\h’\n[lss]u’The
redim-command does exactly the same as the dim-command; it
is just a
\h’\n[lss]u’synonym. redim has been around in
older versions of basic (not even yabasic)
\h’\n[lss]u’for many years; therefore it is
supported in yabasic for compatibility reasons.
\h’\n[lss]u’Please refer to the entry for the dim-command for further information.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’rem ? start a comment
\h’\n[lss]u’Synopsis
\h’\n[lss]u’rem
Hey, this is a comment
\h’\n[lss]u’# the hash-sign too (at beginning of
line)
\h’\n[lss]u’// even the double slash
\h’\n[lss]u’’ and the single quote (at
beginning of line)
\h’\n[lss]u’print "Not a comment" #
This is an error !!
\h’\n[lss]u’print "Not a comment"://
But this is again a valid comment
\h’\n[lss]u’print "Not a comment" //
even this.
\h’\n[lss]u’print "Not a comment" rem
and this !
\h’\n[lss]u’Description
\h’\n[lss]u’rem
introduces a comment (like # or //), that extends up to the
end of the
\h’\n[lss]u’line.
\h’\n[lss]u’Those
comments do not even need a colon (’:’) in front
of them; they (rem, #, ’
\h’\n[lss]u’(single quite) and //) all behave
alike except for # and ’, which may only
\h’\n[lss]u’appear at the very beginning of a
line; therefore the fourth example in the
\h’\n[lss]u’synopsis above (print "Not a
comment" # This is an error !!) is indeed an
\h’\n[lss]u’error.
\h’\n[lss]u’Note,
that rem is an abbreviation for remark. remark however is
not a valid
\h’\n[lss]u’command in yabasic.
\h’\n[lss]u’Finally
note, that a comment introduced with ’#’ may
have a special meaning
\h’\n[lss]u’under unix; see the entry for # for
details.
\h’\n[lss]u’Example
\h’\n[lss]u’#
\h’\n[lss]u’rem comments on data structures
\h’\n[lss]u’# are more useful than
\h’\n[lss]u’// comments on algorithms.
\h’\n[lss]u’rem
\h’\n[lss]u’This program does nothing, but in a splendid and well commented way.
\h’\n[lss]u’See also
\h’\n[lss]u’#, //
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’repeat ? start a repeat-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’repeat
\h’\n[lss]u’?
\h’\n[lss]u’until (?)
\h’\n[lss]u’Description
\h’\n[lss]u’The
repeat-loop executes all the statements up to the final
until-keyword over
\h’\n[lss]u’and over. The loop is executed as
long as the condition, which is specified
\h’\n[lss]u’with the until-clause, becomes true.
By construction, the statements within the
\h’\n[lss]u’loop are executed at least once.
\h’\n[lss]u’Example
\h’\n[lss]u’x=0
\h’\n[lss]u’clear screen
\h’\n[lss]u’print "This program will print
the numbers from 1 to 10"
\h’\n[lss]u’repeat
\h’\n[lss]u’x=x+1
\h’\n[lss]u’print x
\h’\n[lss]u’print "Press any key for the
next number, or ’q’ to quit"
\h’\n[lss]u’if (inkey$="q") break
\h’\n[lss]u’until(x=10)
\h’\n[lss]u’This program is pretty much useless, but self-explanatory.
\h’\n[lss]u’See also
\h’\n[lss]u’until, break, while, do
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’restore ? reposition the data-pointer
\h’\n[lss]u’Synopsis
\h’\n[lss]u’read
a,b,c,d,e,f
\h’\n[lss]u’restore
\h’\n[lss]u’read g,h,i
\h’\n[lss]u’restore foo
\h’\n[lss]u’data 1,2,3
\h’\n[lss]u’label foo
\h’\n[lss]u’data 4,5,6
\h’\n[lss]u’Description
\h’\n[lss]u’The
restore-command may be used to reset the reading of
data-statements, so
\h’\n[lss]u’that the next read-statement will
read data from the first data-statement.
\h’\n[lss]u’You
may specify a label with the restore-command; in that case,
the next
\h’\n[lss]u’read-statement will read data
starting at the given label. If the label is
\h’\n[lss]u’omitted, reading data will begin
with the first data-statement within your
\h’\n[lss]u’program.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Which language (german/english) ? " l$
\h’\n[lss]u’if
(instr("german",l$)>0) then
\h’\n[lss]u’restore german
\h’\n[lss]u’else
\h’\n[lss]u’restore english
\h’\n[lss]u’endif
\h’\n[lss]u’for
a=1 to 3
\h’\n[lss]u’read x,x$
\h’\n[lss]u’print x,"=",x$
\h’\n[lss]u’next a
\h’\n[lss]u’label
english
\h’\n[lss]u’data
1,"one",2,"two",3,"three"
\h’\n[lss]u’label german
\h’\n[lss]u’data
1,"eins",2,"zwei",3,"drei"
\h’\n[lss]u’This
program asks to select one of those languages known to me
(i.e. english or
\h’\n[lss]u’german) and then prints the numbers
1,2 and 3 and their textual equivalents in
\h’\n[lss]u’the chosen language.
\h’\n[lss]u’See also
\h’\n[lss]u’read, data, label
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’return ? return from a subroutine or a gosub
\h’\n[lss]u’Synopsis
\h’\n[lss]u’gosub
foo
\h’\n[lss]u’?
\h’\n[lss]u’label foo
\h’\n[lss]u’?
\h’\n[lss]u’return
\h’\n[lss]u’sub
bar(baz)
\h’\n[lss]u’?
\h’\n[lss]u’return quertz
\h’\n[lss]u’end sub
\h’\n[lss]u’Description
\h’\n[lss]u’The
return-statement serves two different (albeit somewhat
related) purposes.
\h’\n[lss]u’The probably more important use of
return is to return control from within a
\h’\n[lss]u’subroutine to the place in your
program, where the subroutine has been called.
\h’\n[lss]u’If the subroutine is declared to
return a value, the return-statement might be
\h’\n[lss]u’accompanied by a string or number,
which constitutes the return value of the
\h’\n[lss]u’subroutine.
\h’\n[lss]u’However,
even if the subroutine should return a value, the
return-statement
\h’\n[lss]u’need not carry a value; in that case
the subroutine will return 0 or the empty
\h’\n[lss]u’string (depending on the type of the
subroutine). Moreover, feel free to place
\h’\n[lss]u’multiple return-statements within
your subroutine; it’s a nice way of
\h’\n[lss]u’controlling the flow of
execution.
\h’\n[lss]u’The
second (but historically first) use of return is to return
to the position,
\h’\n[lss]u’where a prior gosub has left off. In
that case return may not carry a value.
\h’\n[lss]u’Example
\h’\n[lss]u’do
\h’\n[lss]u’read a$
\h’\n[lss]u’if (a$="") then
\h’\n[lss]u’print
\h’\n[lss]u’end
\h’\n[lss]u’endif
\h’\n[lss]u’print mark$(a$)," ";
\h’\n[lss]u’loop
\h’\n[lss]u’data
"The","quick","brown","fox","jumped"
\h’\n[lss]u’data
"over","the","lazy","dog",""
\h’\n[lss]u’sub
mark$(a$)
\h’\n[lss]u’if (instr(lower$(a$),"q"))
return upper$(a$)
\h’\n[lss]u’return a$
\h’\n[lss]u’end sub
\h’\n[lss]u’This
example features a subroutine mark$, that returns its
argument in upper
\h’\n[lss]u’case, if it contains the letter
"q", or unchanged otherwise. In the test-text
\h’\n[lss]u’the word quick will end up being
marked as QUICK.
\h’\n[lss]u’The
example above demonstrates return within subroutines; please
see gosub for
\h’\n[lss]u’an example of how to use return in
this context.
\h’\n[lss]u’See also
\h’\n[lss]u’sub, gosub
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’reverse ? print reverse (background and foreground colors exchanged)
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear
screen
\h’\n[lss]u’?
\h’\n[lss]u’print reverse "foo"
\h’\n[lss]u’Description
\h’\n[lss]u’reverse
may be used to print text in reverse. reverse is not a
separate
\h’\n[lss]u’command, but part of the
print-command; it may be included just after the print
\h’\n[lss]u’and can only be issued once that
clear screen has been issued.
\h’\n[lss]u’Example
\h’\n[lss]u’clear screen
\h’\n[lss]u’print
"1 ";
\h’\n[lss]u’c=3
\h’\n[lss]u’do
\h’\n[lss]u’prim=true
\h’\n[lss]u’for a=2 to sqrt(c)
\h’\n[lss]u’if (frac(c/a)=0) then
\h’\n[lss]u’prim=false
\h’\n[lss]u’break
\h’\n[lss]u’endif
\h’\n[lss]u’next a
\h’\n[lss]u’if (prim) then
\h’\n[lss]u’print
\h’\n[lss]u’print reverse c;
\h’\n[lss]u’else
\h’\n[lss]u’print c;
\h’\n[lss]u’endif
\h’\n[lss]u’print " ";
\h’\n[lss]u’c=c+1
\h’\n[lss]u’loop
\h’\n[lss]u’This program prints numbers from 1 on and marks each prime number in reverse.
\h’\n[lss]u’See also
\h’\n[lss]u’at, print color, print, clear screen
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’right$() ? return (or change) the right end of a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
right$(a$,2)
\h’\n[lss]u’right$(b$,2)="baz"
\h’\n[lss]u’Description
\h’\n[lss]u’The
right$-function requires two arguments (a string and a
number) and returns
\h’\n[lss]u’the part from the right end of the
string, whose length is specified by its
\h’\n[lss]u’second argument. So, right$ simply
returns the requested number of chars from
\h’\n[lss]u’the right end of the given
string.
\h’\n[lss]u’Note,
that the right$-function can be assigned to, i.e. it may
appear on the
\h’\n[lss]u’left hand side of an assignment. In
this way it is possible to change a part of
\h’\n[lss]u’the variable used within the
right$-function. Note, that that way the length of
\h’\n[lss]u’the string cannot be changed, i.e.
characters might be overwritten, but not
\h’\n[lss]u’added. For an example see below.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Please enter a length either in inch or
centimeter"
\h’\n[lss]u’print "please add
’in’ or ’cm’ to mark the unit."
\h’\n[lss]u’input "Length: " a$
\h’\n[lss]u’if (right$(a$,2)="in")
then
\h’\n[lss]u’length=val(a$)*2.56
\h’\n[lss]u’elsif (right$(a$,2)="cm")
then
\h’\n[lss]u’length=val(a$)
\h’\n[lss]u’else
\h’\n[lss]u’error "Invalid input: "+a$
\h’\n[lss]u’endif
\h’\n[lss]u’This
program allows the user to enter a length qualified with a
unit (either
\h’\n[lss]u’inch or centimeter).
\h’\n[lss]u’This
second example demonstrates the capability to assign to the
\h’\n[lss]u’right$-function.
\h’\n[lss]u’a$="Heiho
World !"
\h’\n[lss]u’print a$
\h’\n[lss]u’right$(a$,7)="dwarfs."
\h’\n[lss]u’print a$
\h’\n[lss]u’See also
\h’\n[lss]u’right$ and mid$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’rinstr() ? find the rightmost occurrence of one string within the other
\h’\n[lss]u’Synopsis
\h’\n[lss]u’pos=rinstr("Thequickbrownfox","equi")
\h’\n[lss]u’pos=rinstr(a$,b$,x)
\h’\n[lss]u’Description
\h’\n[lss]u’The
rinstr-function accepts two string-arguments and tries to
find the second
\h’\n[lss]u’within the first. However, unlike
the instr, the rinstr-function finds the
\h’\n[lss]u’rightmost (or last) occurrence of
the string; whereas the instr-function finds
\h’\n[lss]u’the leftmost (or first) occurrence.
In any case however, the position is
\h’\n[lss]u’counted from the left.
\h’\n[lss]u’If
you supply a third, numeric argument to the rinstr-function,
it will be used
\h’\n[lss]u’as a starting point for the search.
Therefore
rinstr("abcdeabcdeabcde","e",8)
\h’\n[lss]u’will return 5, because the search
for an "e" starts at position 8 and finds the
\h’\n[lss]u’first one at position 5.
\h’\n[lss]u’Example
\h’\n[lss]u’print rinstr("foofoofoobar","foo")
\h’\n[lss]u’This
simple example will print 7, because it finds the rightmost
among the
\h’\n[lss]u’three occurrences of foo within the
string. Note, that
\h’\n[lss]u’print instr("foofoofoobar","foo")
\h’\n[lss]u’would have printed 1.
\h’\n[lss]u’See also
\h’\n[lss]u’instr
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’rtrim$() ? trim spaces at the right end of a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=rtrim$(b$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
rtrim$-function removes all whitespace from the right end of
a string and
\h’\n[lss]u’returns the result.
\h’\n[lss]u’Example
\h’\n[lss]u’open
1,"foo"
\h’\n[lss]u’dim lines$(100)
\h’\n[lss]u’l=1
\h’\n[lss]u’while(not eof(1))
\h’\n[lss]u’input #1 a$
\h’\n[lss]u’a$=rtrim$(a$)
\h’\n[lss]u’if (right$(line$,1)="\\")
then
\h’\n[lss]u’line$=line$+" "+a$
\h’\n[lss]u’else
\h’\n[lss]u’lines$(l)=line$
\h’\n[lss]u’l=l+1
\h’\n[lss]u’line$=a$
\h’\n[lss]u’endif
\h’\n[lss]u’end while
\h’\n[lss]u’print "Read ",l,"
lines"
\h’\n[lss]u’This
example reads the file foo allowing for continuation lines,
which are
\h’\n[lss]u’marked by a \, which appears as the
last character on a line. For convenience
\h’\n[lss]u’whitespace at the right end of a
line is trimmed with rtrim.
\h’\n[lss]u’See also
\h’\n[lss]u’ltrim$, trim$
\h’\n[lss]u’S
\h’\n[lss]u’screen
? as clear screen clears the text window
\h’\n[lss]u’seek() ? change the position within
an open file
\h’\n[lss]u’sig() ? return the sign of its
argument
\h’\n[lss]u’sin() ? return the sine of its
single argument
\h’\n[lss]u’sleep ? pause, sleep, wait for the
specified number of seconds
\h’\n[lss]u’split() ? split a string into many
strings
\h’\n[lss]u’sqr() ? compute the square of its
argument
\h’\n[lss]u’sqrt() ? compute the square root of
its argument
\h’\n[lss]u’static ? preserves the value of a
variable between calls to a subroutine
\h’\n[lss]u’step ? specifies the increment step
in a for-loop
\h’\n[lss]u’str$() ? convert a number into a
string
\h’\n[lss]u’sub ? declare a user defined
subroutine
\h’\n[lss]u’switch ? select one of many
alternatives depending on a value
\h’\n[lss]u’system() ? hand a statement over to
your operating system and return its
\h’\n[lss]u’exitcode
\h’\n[lss]u’system$() ? hand a statement over to
your operating system and return its
\h’\n[lss]u’output
\h’\n[lss]u’Name
\h’\n[lss]u’screen ? as clear screen clears the text window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear screen
\h’\n[lss]u’Description
\h’\n[lss]u’The
keyword screen appears only within the sequence clear
screen; please see
\h’\n[lss]u’there for a description.
\h’\n[lss]u’See also
\h’\n[lss]u’clear screen
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’seek() ? change the position within an open file
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
1,"foo"
\h’\n[lss]u’seek #1,q
\h’\n[lss]u’seek #1,x,"begin"
\h’\n[lss]u’seek #1,y,"end"
\h’\n[lss]u’seek #1,z,"here"
\h’\n[lss]u’Description
\h’\n[lss]u’The
seek-command changes the position, where the next input (or
peek) statement
\h’\n[lss]u’will read from an open file. Usually
files are read from the beginning to the
\h’\n[lss]u’end sequentially; however sometimes
you may want to depart from this simple
\h’\n[lss]u’scheme. This can be done with the
seek-command, allowing you to change the
\h’\n[lss]u’position, where the next piece of
data will be read from the file.
\h’\n[lss]u’seek
accepts two or three arguments: The first one is the number
of an already
\h’\n[lss]u’open file. The second one is the
position where the next read from the file
\h’\n[lss]u’will start. The third argument is
optional and specifies the the point from
\h’\n[lss]u’where the position (the second
argument) will count. It can be one of:
\h’\n[lss]u’begin
\h’\n[lss]u’Count from the beginning of the file.
\h’\n[lss]u’end
\h’\n[lss]u’Count from the end of the file.
\h’\n[lss]u’here
\h’\n[lss]u’Count from the current position within the file.
\h’\n[lss]u’Example
\h’\n[lss]u’open
#1,"count.dat","w"
\h’\n[lss]u’for a=1 to 10
\h’\n[lss]u’print #1,"00000000";
\h’\n[lss]u’if (a<10) print #1,";";
\h’\n[lss]u’next a
\h’\n[lss]u’dim
count(10)
\h’\n[lss]u’do
\h’\n[lss]u’x=int(ran(10))
\h’\n[lss]u’i=i+1
\h’\n[lss]u’if (mod(i,1000)=0) print
".";
\h’\n[lss]u’count(x)=count(x)+1
\h’\n[lss]u’curr$=right$("00000000"+str$(count(x)),8)
\h’\n[lss]u’seek #1,9*x,"begin"
\h’\n[lss]u’print #1,curr$;
\h’\n[lss]u’loop
\h’\n[lss]u’This
example increments randomly one of ten counters (in the
array count());
\h’\n[lss]u’however, the result is always kept
and updated within the file count.dat, so
\h’\n[lss]u’even in case of an unexpected
interrupt, the result will not be lost.
\h’\n[lss]u’See also
\h’\n[lss]u’tell, open, print, peek
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’sig() ? return the sign of its argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a=sig(b)
\h’\n[lss]u’Description
\h’\n[lss]u’Return +1, -1 or 0, if the single argument is positive, negative or zero.
\h’\n[lss]u’Example
\h’\n[lss]u’clear
screen
\h’\n[lss]u’dim
c$(3):c$(1)="red":c$(2)="white":c$(3)="green"
\h’\n[lss]u’do
\h’\n[lss]u’num=ran(100)-50
\h’\n[lss]u’print color(c$(2+sig(num))) num
\h’\n[lss]u’loop
\h’\n[lss]u’This
program prints an infinite sequence of random number;
positive numbers are
\h’\n[lss]u’printed in green, negative numbers
are printed red (an exact zero would be
\h’\n[lss]u’printed white). (With a little extra
work, this program could be easily
\h’\n[lss]u’extended into a brokerage
system)
\h’\n[lss]u’See also
\h’\n[lss]u’abs, int, frac
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’sin() ? return the sine of its single argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’y=sin(angle)
\h’\n[lss]u’Description
\h’\n[lss]u’The
sin-function expects an angle (in radians, not degrees) and
returns its
\h’\n[lss]u’sine.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’new curve
\h’\n[lss]u’for phi=0 to 2*pi step 0.1
\h’\n[lss]u’line to
100+90*sin(phi),100+90*cos(phi)
\h’\n[lss]u’next phi
\h’\n[lss]u’close curve
\h’\n[lss]u’This program draws a circle (ignoring the existence of the circle-command).
\h’\n[lss]u’See also
\h’\n[lss]u’asin, cos
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’sleep ? pause, sleep, wait for the specified number of seconds
\h’\n[lss]u’Synopsis
\h’\n[lss]u’sleep 4
\h’\n[lss]u’Description
\h’\n[lss]u’The
sleep-command has many different names: You may write pause,
sleep or wait
\h’\n[lss]u’interchangeably; whatever you write,
yabasic will always do exactly the same.
\h’\n[lss]u’Therefore
you should refer to the entry for the pause-function for
further
\h’\n[lss]u’information.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’split() ? split a string into many strings
\h’\n[lss]u’Synopsis
\h’\n[lss]u’dim
w$(10)
\h’\n[lss]u’?
\h’\n[lss]u’num=split(a$,w$())
\h’\n[lss]u’num=split(a$,w$(),s$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
split-function requires a string (containing the text to be
split), a
\h’\n[lss]u’reference to a string-array (which
will receive the resulting strings, i.e. the
\h’\n[lss]u’tokens) and an optional string (with
a set of characters, at which to split,
\h’\n[lss]u’i.e. the delimiters).
\h’\n[lss]u’The
split-function regards its first argument (a string) as a
list of tokens
\h’\n[lss]u’separated by delimiters and it will
store the list of tokens within the
\h’\n[lss]u’array-reference you have supplied.
Note, that the array, which is passed as a
\h’\n[lss]u’reference (w$() in the synopsis),
will be resized accordingly, so that you
\h’\n[lss]u’don’t have to figure out the
number of tokens in advance. The element at
\h’\n[lss]u’position zero (i.e. w$(0)) will not
be used.
\h’\n[lss]u’normally
(i.e. if you omit the third, which is the
delimiter-argument) the
\h’\n[lss]u’function will regard space or tab as
delimiters for tokens; however by
\h’\n[lss]u’supplying a third argument, you may
split at any single of the characters
\h’\n[lss]u’within this string. E.g. if you
supply ":;" as the third argument, then colon
\h’\n[lss]u’(:) or semicolon (;) will delimit
tokens.
\h’\n[lss]u’Note,
that a sequence of separator-characters will produce a
sequence of empty
\h’\n[lss]u’tokens; that way, the number of
tokens returned will always be one plus the
\h’\n[lss]u’number of separator characters
contained within the string. Refer to the
\h’\n[lss]u’closely related token-function, if
you do not like this behaviour. In some way,
\h’\n[lss]u’the split-function focuses on the
separators (other than the token-function,
\h’\n[lss]u’which focuses on the tokens), hence
its name.
\h’\n[lss]u’The
second argument is a reference on a string-array, where the
tokens will be
\h’\n[lss]u’stored; this array will be expanded
(or shrunk) to have room for all tokens, if
\h’\n[lss]u’necessary.
\h’\n[lss]u’The
first argument finally contains the text, that will be split
into tokens.
\h’\n[lss]u’The split-function returns the
number of tokens that have been found.
\h’\n[lss]u’Please
see the examples below for some hints on the exact behaviour
of the
\h’\n[lss]u’split-function and how it differs
from the token-function:
\h’\n[lss]u’Example
\h’\n[lss]u’print
"This program will help you to understand, how
the"
\h’\n[lss]u’print "split()-function exactly
works and how it behaves"
\h’\n[lss]u’print "in certain special
cases."
\h’\n[lss]u’print
\h’\n[lss]u’print "Please enter a line
containing tokens separated"
\h’\n[lss]u’print "by either
’=’ or ’-’"
\h’\n[lss]u’dim t$(10)
\h’\n[lss]u’do
\h’\n[lss]u’print
\h’\n[lss]u’input "Please enter a line:
" l$
\h’\n[lss]u’num=split(l$,t$(),"=-")
\h’\n[lss]u’print num," Tokens: ";
\h’\n[lss]u’for a=1 to num
\h’\n[lss]u’if (t$(a)="") then
\h’\n[lss]u’print "(EMPTY)";
\h’\n[lss]u’else
\h’\n[lss]u’print t$(a);
\h’\n[lss]u’endif
\h’\n[lss]u’if (a<num) print ",";
\h’\n[lss]u’next a
\h’\n[lss]u’print
\h’\n[lss]u’loop
\h’\n[lss]u’This program prints the following output:
\h’\n[lss]u’Please
enter a line: a
\h’\n[lss]u’1 Tokens: a
\h’\n[lss]u’Please
enter a line:
\h’\n[lss]u’0 Tokens:
\h’\n[lss]u’Please
enter a line: ab
\h’\n[lss]u’1 Tokens: ab
\h’\n[lss]u’Please
enter a line: a=b
\h’\n[lss]u’2 Tokens: a,b
\h’\n[lss]u’Please
enter a line: a-
\h’\n[lss]u’2 Tokens: a,(EMPTY)
\h’\n[lss]u’Please
enter a line: a-=
\h’\n[lss]u’3 Tokens: a,(EMPTY),(EMPTY)
\h’\n[lss]u’Please
enter a line: =a-
\h’\n[lss]u’3 Tokens: (EMPTY),a,(EMPTY)
\h’\n[lss]u’Please
enter a line: a=-b
\h’\n[lss]u’3 Tokens: a,(EMPTY),b
\h’\n[lss]u’Please
enter a line: a--b-
\h’\n[lss]u’4 Tokens: a,(EMPTY),b,(EMPTY)
\h’\n[lss]u’Please
enter a line: -a==b-c==
\h’\n[lss]u’7 Tokens:
(EMPTY),a,(EMPTY),b,c,(EMPTY),(EMPTY)
\h’\n[lss]u’See also
\h’\n[lss]u’token
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’sqr() ? compute the square of its argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a=sqr(b)
\h’\n[lss]u’Description
\h’\n[lss]u’The
sqr-function computes the square of its numerical argument
(i.e. it
\h’\n[lss]u’multiplies its argument with
itself).
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 10
\h’\n[lss]u’print a,sqr(a),a**2
\h’\n[lss]u’next a
\h’\n[lss]u’As you may see from the output, sqr can be written as **2 (or ˆ2) too.
\h’\n[lss]u’See also
\h’\n[lss]u’sqrt, **, ˆ
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’sqrt() ? compute the square root of its argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’to be written
\h’\n[lss]u’Description
\h’\n[lss]u’The sqrt-function computes the square root of its numerical argument.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 5
\h’\n[lss]u’print a,sqrt(a),a**(1/2)
\h’\n[lss]u’next a
\h’\n[lss]u’As you may see from the output, sqrt can be written as **(1/2) (or ˆ(1/2)) too.
\h’\n[lss]u’See also
\h’\n[lss]u’sqr, **, ˆ
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’static ? preserves the value of a variable between calls to a subroutine
\h’\n[lss]u’Synopsis
\h’\n[lss]u’sub foo()
\h’\n[lss]u’static a
\h’\n[lss]u’?
\h’\n[lss]u’end sub
\h’\n[lss]u’Description
\h’\n[lss]u’The
static keyword can be used within subroutines to mark
variables as static.
\h’\n[lss]u’This has two effects: First, the
variable is local to the subroutine, i.e. its
\h’\n[lss]u’value is not know outside the
subroutine (this is the effect of the local
\h’\n[lss]u’keyword). Second, the static-keyword
arranges things, so that the variable
\h’\n[lss]u’keeps its value between invocations
of the subroutine (this is different from
\h’\n[lss]u’the local-keyword).
\h’\n[lss]u’Example
\h’\n[lss]u’foo()
\h’\n[lss]u’foo()
\h’\n[lss]u’foo()
\h’\n[lss]u’sub
foo()
\h’\n[lss]u’static a
\h’\n[lss]u’local b
\h’\n[lss]u’a=a+1
\h’\n[lss]u’b=b+1
\h’\n[lss]u’print a,b
\h’\n[lss]u’end sub
\h’\n[lss]u’This
program shows the difference between static and local
variables within a
\h’\n[lss]u’subroutine; it produces this
output:
\h’\n[lss]u’1
1
\h’\n[lss]u’2 1
\h’\n[lss]u’3 1
\h’\n[lss]u’The
output shows, that the static variable a keeps its value
between subroutine
\h’\n[lss]u’calls, whereas b is initialized with
the value 0 at every call to the
\h’\n[lss]u’subroutine foo.
\h’\n[lss]u’See also
\h’\n[lss]u’sub, local
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’step ? specifies the increment step in a for-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’for
a=1 to 10 step 3
\h’\n[lss]u’?
\h’\n[lss]u’next a
\h’\n[lss]u’Description
\h’\n[lss]u’Specify,
by which amount the loop-variable of a for-loop will be
incremented at
\h’\n[lss]u’each step.
\h’\n[lss]u’The
step (as well as the lower and upper bound) are computed
anew in each step;
\h’\n[lss]u’this is not common, but possible, as
the example below demonstrates.
\h’\n[lss]u’Example
\h’\n[lss]u’for
x=1 to 1000 step y
\h’\n[lss]u’y=x+y
\h’\n[lss]u’print x," ",y,"
";
\h’\n[lss]u’next x
\h’\n[lss]u’print
\h’\n[lss]u’This program computes the fibonacci numbers between 1 and 1000.
\h’\n[lss]u’See also
\h’\n[lss]u’for
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’str$() ? convert a number into a string
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=str$(a)
\h’\n[lss]u’b$=str$(x,"##.###")
\h’\n[lss]u’b$=str$(x,"###,###.##")
\h’\n[lss]u’b$=str$(x,"###,###.##","_.")
\h’\n[lss]u’Description
\h’\n[lss]u’The
str$-function accepts a numeric argument and returns it as a
string. This
\h’\n[lss]u’conversion between number and string
can be controlled with the optional third
\h’\n[lss]u’argument (the format argument). See
the following table of examples to learn
\h’\n[lss]u’about valid values of this argument.
Note, that those examples fall in one of
\h’\n[lss]u’two categories: C-style and
basic-style; the first 4 examples in the table
\h’\n[lss]u’below are C-style, the rest of the
examples are basic-style. For more
\h’\n[lss]u’information on the C-style formats,
you may refer to your favorite
\h’\n[lss]u’documentation on the C programming
language. The basic-style formats are much
\h’\n[lss]u’simpler, they just depict the
desired output, marking digits with ’#’; groups
\h’\n[lss]u’of (usually three) digits may be
separated with colons (’,’), the decimal dot
\h’\n[lss]u’must be marked by a literal dot
(’.’). Moreover these characters (colons and
\h’\n[lss]u’dot) may be replaced by other
characters to satisfy the needs of non-english
\h’\n[lss]u’(e.g. german) languages; see the
examples below.
\h’\n[lss]u’Note,
that for clarity, each space in the result has been replaced
by the
\h’\n[lss]u’letter ’x’, because it
would be hard to figure out, how many spaces are
\h’\n[lss]u’produced exactly otherwise.
\h’\n[lss]u’Table 7.2. Examples for the format argument
\h’\n[lss]u’+-----------------------------------------------------------------------------+
\h’\n[lss]u’| Example | Result for | |
\h’\n[lss]u’| string | converting | Description
|
\h’\n[lss]u’| | 1000*pi | |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’| | |The ’2’ determines
the minimum length of the |
\h’\n[lss]u’|%2.5f |3141.59265 |output; but if
needed (as in the example) the |
\h’\n[lss]u’| | |output can be longer. The
’5’ is the number of |
\h’\n[lss]u’| | |digits after the decimal point.
|
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’| | |Two spaces (which appear as
’x’) are added to pad |
\h’\n[lss]u’|%12.5f |xx3141.59265|the output to
the requested length of 12 |
\h’\n[lss]u’| | |characters. |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’| | |The ’g’ requests,
that the precision (’5’) |
\h’\n[lss]u’|%012.5g |0000003141.6|specifies the
overall number of digits (before and|
\h’\n[lss]u’| | |after the decimal point). |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’| | |The ’-’ requests
the output to be left-centered |
\h’\n[lss]u’|%-12.5f |3141.59265xx|(therefore
the filling space appears at the |
\h’\n[lss]u’| | |right). |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’| | |Each ’#’ specifies
a digit (either before or after|
\h’\n[lss]u’| | |the dot), the ’.’
specifies the position of the |
\h’\n[lss]u’|#####.## |x3141.59 |dot. As 1000*pi
does not have enough digits, the 5|
\h’\n[lss]u’| | |requested digits before the dot
are filled up with|
\h’\n[lss]u’| | |a space (which shows up as an
’x’). |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’|##,###.## |x3,141.59 |Nearly the
same as above, but the colon from the |
\h’\n[lss]u’| | |format shows up within the
result. |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’|##,###.## and| | |
\h’\n[lss]u’|an additional|x3.141,59 |Similar to
the example above, but colon and dot |
\h’\n[lss]u’|argument of | |are replaced with
dot and colon respectively. |
\h’\n[lss]u’|".," | | |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’|##,###.## and| |Similar to the
example above, but colon and dot |
\h’\n[lss]u’|an additional|x3_141,59 |are
replaced with underscore and colon |
\h’\n[lss]u’|argument of | |respectively. |
\h’\n[lss]u’|"_," | | |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’| | |The format string does not
contain a dot, and |
\h’\n[lss]u’|##### |x3142 |therefore the result
does not have any fractional |
\h’\n[lss]u’| | |digits. |
\h’\n[lss]u’|-------------+------------+--------------------------------------------------|
\h’\n[lss]u’| | |As 1000*pi has 4 digits in
front of the decimal |
\h’\n[lss]u’|##.### |##.### |dot and the format
only specifies 2, yabasic does |
\h’\n[lss]u’| | |not know what to do; therefore
it chooses just to |
\h’\n[lss]u’| | |reproduce the format string. |
\h’\n[lss]u’+-----------------------------------------------------------------------------+
\h’\n[lss]u’Example
\h’\n[lss]u’do
\h’\n[lss]u’input "Please enter a format
string: " f$
\h’\n[lss]u’a$=str$(1000*pi,f$)
\h’\n[lss]u’for a=1 to len(a$)
\h’\n[lss]u’if (mid$(a$,a,1)=" ")
mid$(a$,a,1)="x"
\h’\n[lss]u’next a
\h’\n[lss]u’print a$
\h’\n[lss]u’loop
\h’\n[lss]u’This
is the program, that has been used to get the results shown
in the table
\h’\n[lss]u’above.
\h’\n[lss]u’See also
\h’\n[lss]u’print, using
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’sub ? declare a user defined subroutine
\h’\n[lss]u’Synopsis
\h’\n[lss]u’foo(2,"hello")
\h’\n[lss]u’?
\h’\n[lss]u’sub
foo(bar,baz$)
\h’\n[lss]u’?
\h’\n[lss]u’return qux
\h’\n[lss]u’?
\h’\n[lss]u’end sub
\h’\n[lss]u’Description
\h’\n[lss]u’The
sub-keyword starts the definition of a user defined
subroutine. With user
\h’\n[lss]u’defined subroutines you are able to
somewhat extend yabasic with your own
\h’\n[lss]u’commands or functions. A subroutine
accepts arguments (numbers or strings) and
\h’\n[lss]u’returns a number or a string
(however, you are not required to assign the value
\h’\n[lss]u’returned to a variable).
\h’\n[lss]u’The
name of the subroutine follows after the keyword sub. If the
name (in the
\h’\n[lss]u’synopsis: foo) ends on a
’$’, the subroutine should return a string (with
the
\h’\n[lss]u’return-statement), otherwise a
number.
\h’\n[lss]u’After
the name of the subroutine yabasic requires a pair of
braces; within
\h’\n[lss]u’those braces you may specify a list
of parameters, for which values can (but
\h’\n[lss]u’need not) be included when calling
the subroutine. If you omit one of those
\h’\n[lss]u’parameters when calling such a
subroutine, it assumes the value zero (for
\h’\n[lss]u’numeric parameters) or the empty
string (for string-parameters). However from
\h’\n[lss]u’the special variable numparams you
may find out, how many arguments have really
\h’\n[lss]u’been passed when calling the
subroutine.
\h’\n[lss]u’Parameters
of a subroutine are always local variables (see the keyword
local
\h’\n[lss]u’for more explanation).
\h’\n[lss]u’From
within the subroutine you may return any time with the
keyword return;
\h’\n[lss]u’along with the return-keyword you
may specify the return value. Note that more
\h’\n[lss]u’than one return is allowed within a
single subroutine.
\h’\n[lss]u’Finally,
the keyword end sub ends the subroutine definition. Note,
that the
\h’\n[lss]u’definition of a subroutine need not
appear within the program before the first
\h’\n[lss]u’call to this sub.
\h’\n[lss]u’Note
\h’\n[lss]u’As
braces have two uses in yabasic (i.e. for supplying
arguments to a
\h’\n[lss]u’subroutine as well as to list the
indices of an array). yabasic can not tell
\h’\n[lss]u’apart an array from a subroutine
with the same name. Therefore you cannot
\h’\n[lss]u’define a subroutine with the same
name as an array !
\h’\n[lss]u’Example
\h’\n[lss]u’p=2
\h’\n[lss]u’do
\h’\n[lss]u’if (is_prime(p)) print p
\h’\n[lss]u’p=p+1
\h’\n[lss]u’loop
\h’\n[lss]u’sub
is_prime(a)
\h’\n[lss]u’local b
\h’\n[lss]u’for b=2 to sqrt(a)
\h’\n[lss]u’if (frac(a/b)=0) return false
\h’\n[lss]u’next b
\h’\n[lss]u’return true
\h’\n[lss]u’end sub
\h’\n[lss]u’This
example is not the recommended way to compute prime numbers.
However it
\h’\n[lss]u’gives a nice demonstration of using
a subroutine.
\h’\n[lss]u’See also
\h’\n[lss]u’local, static, peek
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’switch ? select one of many alternatives depending on a value
\h’\n[lss]u’Synopsis
\h’\n[lss]u’switch
a
\h’\n[lss]u’case 1
\h’\n[lss]u’case 2
\h’\n[lss]u’?
\h’\n[lss]u’end switch
\h’\n[lss]u’?
\h’\n[lss]u’switch
a$
\h’\n[lss]u’case "a"
\h’\n[lss]u’case "b"
\h’\n[lss]u’end switch
\h’\n[lss]u’Description
\h’\n[lss]u’The
switch-statement selects one of many codepaths depending on
a numerical or
\h’\n[lss]u’string expression. I.e. it takes an
expression (either numeric or string) and
\h’\n[lss]u’compares it with a series of values,
each wrapped within a case-clause. If the
\h’\n[lss]u’expression equals the value given in
a case-clause, the subsequent statements
\h’\n[lss]u’are executed.
\h’\n[lss]u’The
default-clause allows one to specify commands, which should
be executed, if
\h’\n[lss]u’none of case-clauses matches.
\h’\n[lss]u’Note,
that many case-clauses might be clustered (e.g. case
"a":case "b":case
\h’\n[lss]u’"c"). Or put another way:
You need a break-statement at the end of a
\h’\n[lss]u’case-branch, if you do not want to
run into the next case.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a single digit: " n
\h’\n[lss]u’switch n
\h’\n[lss]u’case 0:print "zero":break
\h’\n[lss]u’case 1:print "one":break
\h’\n[lss]u’case 2:print "two":break
\h’\n[lss]u’case 3:print "three":break
\h’\n[lss]u’case 4:print "four":break
\h’\n[lss]u’case 5:case 6: case 7:case 8:case 9
\h’\n[lss]u’print "Much !":break
\h’\n[lss]u’default:print "Hey ! That was
more than a single digit !"
\h’\n[lss]u’end switch
\h’\n[lss]u’This
example translates a single digit into a string; note, how
the cases 5 to
\h’\n[lss]u’7 are clustered.
\h’\n[lss]u’See also
\h’\n[lss]u’switch, case, break
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’system()
? hand a statement over to your operating system and return
its
\h’\n[lss]u’exitcode
\h’\n[lss]u’Synopsis
\h’\n[lss]u’ret=system("foo")
\h’\n[lss]u’system("bar")
\h’\n[lss]u’Description
\h’\n[lss]u’The
system-command accepts a single string argument, which
specifies a command
\h’\n[lss]u’to be executed. The function will
return the exitcode of the command; its
\h’\n[lss]u’output (if any) will be lost.
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Please enter the name of the file, that should be
deleted."
\h’\n[lss]u’input f$
\h’\n[lss]u’if (system("rm "+f$+"
>/dev/null 2>&1")) then
\h’\n[lss]u’print "Error !"
\h’\n[lss]u’else
\h’\n[lss]u’print "okay."
\h’\n[lss]u’endif
\h’\n[lss]u’This program is Unix-specific: It uses the Unix-command rm to remove a file.
\h’\n[lss]u’See also
\h’\n[lss]u’system$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’system$()
? hand a statement over to your operating system and return
its
\h’\n[lss]u’output
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print system$("dir")
\h’\n[lss]u’Description
\h’\n[lss]u’The
system$-command accepts a single string argument, specifying
a command,
\h’\n[lss]u’that can be found and executed by
your operating system. It returns the output
\h’\n[lss]u’of this command as one big
string.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter the name of a directory: " d$
\h’\n[lss]u’print
\h’\n[lss]u’print "This is the contents of
the ’"+d$+"’:"
\h’\n[lss]u’print system$("dir
"+d$)
\h’\n[lss]u’This
example lists the contents of a directory, employing the
dir-command
\h’\n[lss]u’(which is about the only program,
that is known under Unix as well as Windows).
\h’\n[lss]u’See also
\h’\n[lss]u’system, chomp
\h’\n[lss]u’T
\h’\n[lss]u’tan()
? return the tangent of its argument
\h’\n[lss]u’tell ? get the current position
within an open file
\h’\n[lss]u’text ? write text into your
graphic-window
\h’\n[lss]u’then ? tell the long from the short
form of the if-statement
\h’\n[lss]u’time$ ? return a string containing
the current time
\h’\n[lss]u’to ? this keyword appears as part of
other statements
\h’\n[lss]u’token() ? split a string into
multiple strings
\h’\n[lss]u’triangle ? draw a triangle
\h’\n[lss]u’trim$() ? remove leading and
trailing spaces from its argument
\h’\n[lss]u’true ? a constant with the value of
1
\h’\n[lss]u’Name
\h’\n[lss]u’tan() ? return the tangent of its argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’foo=tan(bar)
\h’\n[lss]u’Description
\h’\n[lss]u’The
tan-function computes the tangent of its arguments (which
should be
\h’\n[lss]u’specified in radians).
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=0 to 45
\h’\n[lss]u’print tan(a*pi/180)
\h’\n[lss]u’next a
\h’\n[lss]u’This example simply prints the tangent of all angles between 0 and 45 degrees.
\h’\n[lss]u’See also
\h’\n[lss]u’atan, sin
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’tell ? get the current position within an open file
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
#1,"foo"
\h’\n[lss]u’?
\h’\n[lss]u’position=tell(#1)
\h’\n[lss]u’Description
\h’\n[lss]u’The
tell-function requires the number of an open file as an
argument. It
\h’\n[lss]u’returns the position (counted in
bytes, starting from the beginning of the
\h’\n[lss]u’file) where the next read will
start.
\h’\n[lss]u’Example
\h’\n[lss]u’open
#1,"foo","w"
\h’\n[lss]u’print #1 "Hello World !"
\h’\n[lss]u’close #1
\h’\n[lss]u’open
#1,"foo"
\h’\n[lss]u’seek #1,0,"end"
\h’\n[lss]u’print tell(#1)
\h’\n[lss]u’close 1
\h’\n[lss]u’This
example (mis)uses tell to get the size of the file. The seek
positions the
\h’\n[lss]u’file pointer at the end of the file,
therefore the call to tell returns the
\h’\n[lss]u’total length of the file.
\h’\n[lss]u’See also
\h’\n[lss]u’tell, open
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’text ? write text into your graphic-window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’text
x,y,"foo"
\h’\n[lss]u’text
x,y,"foo","lb"
\h’\n[lss]u’text
x,y,"foo","cc","font"
\h’\n[lss]u’text
x,y,"foo","font","rt"
\h’\n[lss]u’Description
\h’\n[lss]u’The
text-commands displays a text-string (the third argument) at
the given
\h’\n[lss]u’position (the first two arguments)
within an already opened window. The font to
\h’\n[lss]u’be used can be optionally specified
as either the fourth or fifth argument
\h’\n[lss]u’("font" in the example
above). A font specified this way will also be used for
\h’\n[lss]u’any subsequent text-commands, as
long as they do not specify a font themselves.
\h’\n[lss]u’The
fourth or fifth optional argument ("lb" in the
example above) can be used
\h’\n[lss]u’to specify the alignment of the text
with respect to the specified position.
\h’\n[lss]u’This argument is always two
characters long: The first character specifies the
\h’\n[lss]u’horizontal alignment and can be
either l, r or c, which stand for left, right
\h’\n[lss]u’or center. The second character
specifies the vertical alignment and can be one
\h’\n[lss]u’of t, b or c, which stand for top,
bottom or center respectively. If you omit
\h’\n[lss]u’this alignment argument, the default
"lb" applies; however this default may be
\h’\n[lss]u’changed with poke
"textalign","xx"
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 500,200
\h’\n[lss]u’clear screen
\h’\n[lss]u’data
"lt","lc","lb","ct","cc","cb","rt","rc","rb"
\h’\n[lss]u’for a=1 to 9
\h’\n[lss]u’read align$
\h’\n[lss]u’print "Alignment: ",align$
\h’\n[lss]u’line 50*a-15,100,50*a+15,100
\h’\n[lss]u’line 50*a,85,50*a,115
\h’\n[lss]u’text
50*a,100,"Test",align$
\h’\n[lss]u’inkey$
\h’\n[lss]u’next a
\h’\n[lss]u’This
program draws nine crosses and writes the same text at each;
however it
\h’\n[lss]u’goes through all possible nine
alignment strings, showing their effect.
\h’\n[lss]u’See also
\h’\n[lss]u’open window, peek, poke
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’then ? tell the long from the short form of the if-statement
\h’\n[lss]u’Synopsis
\h’\n[lss]u’if
(a<b) then
\h’\n[lss]u’?
\h’\n[lss]u’endif
\h’\n[lss]u’Description
\h’\n[lss]u’The
keyword then is part of the if-statement; please see there
for further
\h’\n[lss]u’explanations. However, not every
if-statement requires the keyword then: If the
\h’\n[lss]u’keyword then is present, the
if-clause may extend over more than one line, and
\h’\n[lss]u’the keyword endif is required to end
it. If the keyword then is not present,
\h’\n[lss]u’the if-statement extends up to the
end of the line, and any endif would be an
\h’\n[lss]u’error.
\h’\n[lss]u’Example
\h’\n[lss]u’if
(1<2) then
\h’\n[lss]u’print "Hello ";
\h’\n[lss]u’endif
\h’\n[lss]u’if
(2<3) print "world"
\h’\n[lss]u’if (2<1)
\h’\n[lss]u’print "!"
\h’\n[lss]u’This
example prints Hello world. Note, that no exclamation mark
(!) is printed,
\h’\n[lss]u’which might come as a surprise and
may be changed in future versions of yabasic
\h’\n[lss]u’.
\h’\n[lss]u’See also
\h’\n[lss]u’if
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’time$ ? return a string containing the current time
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
time$
\h’\n[lss]u’print time$()
\h’\n[lss]u’Description
\h’\n[lss]u’The
time$ function returns the current time in four fields
separated by hyphens
\h’\n[lss]u’’-’. The fields are:
\h’\n[lss]u’*
The current hour in the range from 0 to 23, padded with
zeroes (e.g. 00 or
\h’\n[lss]u’04) to a length of two
characters.
\h’\n[lss]u’* The number of minutes, padded with zeroes.
\h’\n[lss]u’* The number of seconds, padded with zeroes.
\h’\n[lss]u’*
The number of seconds, that have elapsed since the program
has been
\h’\n[lss]u’started. This value increases as
long as your program runs and is therefore
\h’\n[lss]u’unbound and not padded with
zeroes.
\h’\n[lss]u’At
the time of writing this documentation, time$ returns
22-58-53-0. Note, that
\h’\n[lss]u’the first three of the four fields
returned by time$ have a fixed width;
\h’\n[lss]u’therefore it is easy to extract some
fields with the usual string-functions
\h’\n[lss]u’mid$ (and others).
\h’\n[lss]u’Example
\h’\n[lss]u’print
"Hello it is ",time$
\h’\n[lss]u’print "An empty for-loop with
ten million iterations takes ";
\h’\n[lss]u’for a=1 to 10000000:next a
\h’\n[lss]u’print "Now it is ",time$
\h’\n[lss]u’print
peek("secondsrunning")," seconds have
passed."
\h’\n[lss]u’This
program benchmarks the for-loop; however, it does not use
the fourth field
\h’\n[lss]u’of the string returned by time$,
because that string wraps around every 60
\h’\n[lss]u’seconds; rather the peek
"secondsrunning" is queried.
\h’\n[lss]u’See also
\h’\n[lss]u’date
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’to ? this keyword appears as part of other statements
\h’\n[lss]u’Synopsis
\h’\n[lss]u’for
a=1 to 100 step 2
\h’\n[lss]u’?
\h’\n[lss]u’next a
\h’\n[lss]u’line x,y to a,b
\h’\n[lss]u’Description
\h’\n[lss]u’The to-keyword serves two purposes (which are not related at all):
\h’\n[lss]u’* within for-statements, to specify the upper bound of the loop.
\h’\n[lss]u’*
Within any graphical command (e.g. line), that requires two
points (i.e.
\h’\n[lss]u’four numbers) as arguments, a comma
’,’ might be replaced with the keyword
\h’\n[lss]u’to. I.e. instead of 100,100,200,200
you may write 100,100 to 200,200 in
\h’\n[lss]u’such commands.
\h’\n[lss]u’Example
\h’\n[lss]u’Please see the command listed under "See also" for examples.
\h’\n[lss]u’See also
\h’\n[lss]u’for, line, rectangle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’token() ? split a string into multiple strings
\h’\n[lss]u’Synopsis
\h’\n[lss]u’dim
w$(10)
\h’\n[lss]u’?
\h’\n[lss]u’num=token(a$,w$())
\h’\n[lss]u’num=token(a$,w$(),s$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
token-function accepts a string (containing the text to be
split), a
\h’\n[lss]u’reference to a string-array (which
will receive the resulting strings, i.e. the
\h’\n[lss]u’tokens) and an optional string (with
a set of characters, at which to split,
\h’\n[lss]u’i.e. the delimiters).
\h’\n[lss]u’The
token-function regards its first argument as a list of
tokens separated by
\h’\n[lss]u’delimiters and it will store the
list of tokens within the array-reference that
\h’\n[lss]u’has been supplied. Note, that the
array, which is passed as a reference (w$()
\h’\n[lss]u’in the synopsis), will be resized
accordingly, so that you don’t have to figure
\h’\n[lss]u’out the number of tokens in advance.
The element at position zero (i.e. w$(0))
\h’\n[lss]u’will not be used.
\h’\n[lss]u’Normally
(i.e. if you omit the third, the delimiter-argument) the
function will
\h’\n[lss]u’regard space or tab as delimiters
for tokens; however by supplying a third
\h’\n[lss]u’argument, you may split at any
single of the characters within this string.
\h’\n[lss]u’E.g. if you supply ":;" as
the third argument, then colon (:) or semicolon (;)
\h’\n[lss]u’will delimit tokens.
\h’\n[lss]u’Note,
that token will never produce empty tokens, even if two or
more
\h’\n[lss]u’separators follow in sequence. Refer
to the closely related split-function, if
\h’\n[lss]u’you do not like this behaviour. In
some way, the token-function focuses on the
\h’\n[lss]u’tokens and not on the separators
(other than the split-function, which focuses
\h’\n[lss]u’on the separators).
\h’\n[lss]u’The
second argument is a reference on a string-array, where the
tokens will be
\h’\n[lss]u’stored; this array will be expanded
(or shrunk) as necessary to have room for
\h’\n[lss]u’all tokens.
\h’\n[lss]u’The
first argument finally contains the text, that will be split
into tokens.
\h’\n[lss]u’The token-function returns the
number of tokens, that have been found.
\h’\n[lss]u’Please
see the examples below for some hints on the exact behaviour
of the
\h’\n[lss]u’token-function and how it differs
from the split-function:
\h’\n[lss]u’Example
\h’\n[lss]u’print
"This program will help you to understand, how
the"
\h’\n[lss]u’print "token()-function exactly
works and how it behaves"
\h’\n[lss]u’print "in certain special
cases."
\h’\n[lss]u’print
\h’\n[lss]u’print "Please enter a line
containing tokens separated"
\h’\n[lss]u’print "by either
’=’ or ’-’"
\h’\n[lss]u’dim t$(10)
\h’\n[lss]u’do
\h’\n[lss]u’print
\h’\n[lss]u’input "Please enter a line:
" l$
\h’\n[lss]u’num=token(l$,t$(),"=-")
\h’\n[lss]u’print num," Tokens: ";
\h’\n[lss]u’for a=1 to num
\h’\n[lss]u’if (t$(a)="") then
\h’\n[lss]u’print "(EMPTY)";
\h’\n[lss]u’else
\h’\n[lss]u’print t$(a);
\h’\n[lss]u’endif
\h’\n[lss]u’if (a<num) print ",";
\h’\n[lss]u’next a
\h’\n[lss]u’print
\h’\n[lss]u’loop
\h’\n[lss]u’This program prints the following output:
\h’\n[lss]u’Please
enter a line: a
\h’\n[lss]u’1 Tokens: a
\h’\n[lss]u’Please
enter a line:
\h’\n[lss]u’0 Tokens:
\h’\n[lss]u’Please
enter a line: ab
\h’\n[lss]u’1 Tokens: ab
\h’\n[lss]u’Please
enter a line: a=b
\h’\n[lss]u’2 Tokens: a,b
\h’\n[lss]u’Please
enter a line: a-
\h’\n[lss]u’1 Tokens: a
\h’\n[lss]u’Please
enter a line: a-=
\h’\n[lss]u’1 Tokens: a
\h’\n[lss]u’Please
enter a line: =a-
\h’\n[lss]u’1 Tokens: a
\h’\n[lss]u’Please
enter a line: a=-b
\h’\n[lss]u’2 Tokens: a,b
\h’\n[lss]u’Please
enter a line: a--b-
\h’\n[lss]u’2 Tokens: a,b
\h’\n[lss]u’Please
enter a line: -a==b-c==
\h’\n[lss]u’3 Tokens: a,b,c
\h’\n[lss]u’See also
\h’\n[lss]u’split
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’triangle ? draw a triangle
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
window 100,100
\h’\n[lss]u’triangle 100,100,50,50,100,50
\h’\n[lss]u’fill triangle 50,100,100,50,200,200
\h’\n[lss]u’clear fill triangle
20,20,10,10,200,200
\h’\n[lss]u’Description
\h’\n[lss]u’The
triangle-command draws a triangle; it requires 6 parameters:
The x- and
\h’\n[lss]u’y-coordinates of the three points
making up the triangle. With the optional
\h’\n[lss]u’keywords clear and fill (which may
appear both and in any sequence) the
\h’\n[lss]u’triangle can be cleared and filled
respectively.
\h’\n[lss]u’Example
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’do
\h’\n[lss]u’phi=phi+0.2
\h’\n[lss]u’i=i+2
\h’\n[lss]u’color
mod(i,255),mod(85+2*i,255),mod(170+3*i,255)
\h’\n[lss]u’dx=100*sin(phi):dy=20*cos(phi)
\h’\n[lss]u’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)
\h’\n[lss]u’sleep 0.1
\h’\n[lss]u’loop
\h’\n[lss]u’This example draws a colored triangles until you get exhausted.
\h’\n[lss]u’See also
\h’\n[lss]u’open window, open printer, line, circle, rectangle
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’trim$() ? remove leading and trailing spaces from its argument
\h’\n[lss]u’Synopsis
\h’\n[lss]u’a$=trim$(b$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
trim$-function removes all whitespace from the left and from
the right end
\h’\n[lss]u’of a string and returns the result.
Calling trim$ is equivalent to calling
\h’\n[lss]u’rtrim$(ltrim$()).
\h’\n[lss]u’Example
\h’\n[lss]u’do
\h’\n[lss]u’input "Continue ? Please answer
yes or no: " a$
\h’\n[lss]u’a$=lower$(trim$(a$))
\h’\n[lss]u’if (len(a$)>0 and
a$=left$("no",len(a$)) exit
\h’\n[lss]u’loop
\h’\n[lss]u’This
example asks for an answer (yes or no) and removes spaces
with trim$ to
\h’\n[lss]u’make the comparison with the string
"no" more bulletproof.
\h’\n[lss]u’See also
\h’\n[lss]u’ltrim$, rtrim$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’true ? a constant with the value of 1
\h’\n[lss]u’Synopsis
\h’\n[lss]u’okay=true
\h’\n[lss]u’Description
\h’\n[lss]u’The
constant true can be assigned to variables which will later
appear in
\h’\n[lss]u’conditions (e.g. an
if-statement.
\h’\n[lss]u’true may also be written as TRUE or even TrUe.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a string of all upper letters: " a$
\h’\n[lss]u’if (is_upper(a$)) print
"Okay"
\h’\n[lss]u’sub
is_upper(a$)
\h’\n[lss]u’if (a$=upper$(a$)) return true
\h’\n[lss]u’return false
\h’\n[lss]u’end sub
\h’\n[lss]u’See also
\h’\n[lss]u’false
\h’\n[lss]u’U
\h’\n[lss]u’until
? end a repeat-loop
\h’\n[lss]u’upper$() ? convert a string to upper
case
\h’\n[lss]u’using ? Specify the format for
printing a number
\h’\n[lss]u’Name
\h’\n[lss]u’until ? end a repeat-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’repeat
\h’\n[lss]u’?
\h’\n[lss]u’until (?)
\h’\n[lss]u’Description
\h’\n[lss]u’The
until-keyword ends a loop, which has been introduced by the
repeat-keyword.
\h’\n[lss]u’until requires a condition in braces
(or an expression, see here for details)
\h’\n[lss]u’as an argument; the loop will
continue until this condition evaluates to true.
\h’\n[lss]u’Example
\h’\n[lss]u’c=1
\h’\n[lss]u’s=1
\h’\n[lss]u’repeat
\h’\n[lss]u’l=c
\h’\n[lss]u’s=-(s+sig(s))
\h’\n[lss]u’c=c+1/s
\h’\n[lss]u’print c
\h’\n[lss]u’until(abs(l-c)<0.000001)
\h’\n[lss]u’This
program calculates the sequence
1/1-1/2+1/3-1/4+1/5-1/6+1/7-1/8+ ? ;
\h’\n[lss]u’please let me know, if you know
against which value this converges.
\h’\n[lss]u’See also
\h’\n[lss]u’repeat
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’upper$() ? convert a string to upper case
\h’\n[lss]u’Synopsis
\h’\n[lss]u’u$=upper$(a$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
upper$-function accepts a single string argument and
converts it to all
\h’\n[lss]u’upper case.
\h’\n[lss]u’Example
\h’\n[lss]u’line
input "Please enter a sentence without the letter
’e’: " l$
\h’\n[lss]u’p=instr(upper$(l$),"E")
\h’\n[lss]u’if (p) then
\h’\n[lss]u’l$=lower$(l$)
\h’\n[lss]u’mid$(l$,p,1)="E"
\h’\n[lss]u’print "Hey, you are wrong, see
here!"
\h’\n[lss]u’print l$
\h’\n[lss]u’else
\h’\n[lss]u’print "Thanks."
\h’\n[lss]u’endif
\h’\n[lss]u’This
program asks for a sentence and marks the first (if any)
occurrence of the
\h’\n[lss]u’letter ’e’ by converting
it to upper case (in contrast to the rest of the
\h’\n[lss]u’sentence, which is converted to
lower case).
\h’\n[lss]u’See also
\h’\n[lss]u’lower$
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’using ? Specify the format for printing a number
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
a using "##.###"
\h’\n[lss]u’print a
using("##.###",",.")
\h’\n[lss]u’Description
\h’\n[lss]u’The
using-keyword may appear as part of the print-statement and
specifies the
\h’\n[lss]u’format (e.g. the number of digits
before and after the decimal dot), which
\h’\n[lss]u’should be used to print the
number.
\h’\n[lss]u’The
possible values for the format argument ("##.###"
in the synopsis above)
\h’\n[lss]u’are described within the entry for
the str$-function; especially the second
\h’\n[lss]u’line in the synopsis (print a
using("##.###",",.")) will become clear
after
\h’\n[lss]u’referring to str$. In fact the using
clause is closely related to the
\h’\n[lss]u’str$-function; the former can always
be rewritten using the latter; i.e. print
\h’\n[lss]u’foo using bar$ is always equivalent
to print str$(foo,bar$). Therefore you
\h’\n[lss]u’should check out str$ to learn
more.
\h’\n[lss]u’Example
\h’\n[lss]u’for
a=1 to 10
\h’\n[lss]u’print sqrt(ran(10000*a)) using
"#########.#####"
\h’\n[lss]u’next a
\h’\n[lss]u’This
example prints a column of square roots of random number,
nicely aligned
\h’\n[lss]u’at the decimal dot.
\h’\n[lss]u’See also
\h’\n[lss]u’print, str$
\h’\n[lss]u’V
\h’\n[lss]u’val() ? converts a string to a number
\h’\n[lss]u’Name
\h’\n[lss]u’val() ? converts a string to a number
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=val(x$)
\h’\n[lss]u’Description
\h’\n[lss]u’The
val-function checks, if the start of its string argument
forms a floating
\h’\n[lss]u’point number and then returns this
number. The string therefore has to start
\h’\n[lss]u’with digits (only whitespace in
front is allowed), otherwise the val-function
\h’\n[lss]u’returns zero.
\h’\n[lss]u’Example
\h’\n[lss]u’input
"Please enter a length, either in inches (in) or
centimeters (cm) " l$
\h’\n[lss]u’if (right$(l$,2)="in")
then
\h’\n[lss]u’l=val(l$)*2.51
\h’\n[lss]u’else
\h’\n[lss]u’l=val(l$)
\h’\n[lss]u’print "You have entered
",l,"cm."
\h’\n[lss]u’This
example queries for a length and checks, if it has been
specified in
\h’\n[lss]u’inches or centimeters. The length is
then converted to centimeters.
\h’\n[lss]u’See also
\h’\n[lss]u’str$
\h’\n[lss]u’W
\h’\n[lss]u’wait
? pause, sleep, wait for the specified number of seconds
\h’\n[lss]u’wend ? end a while-loop
\h’\n[lss]u’while ? start a while-loop
\h’\n[lss]u’window origin ? move the origin of a
window
\h’\n[lss]u’Name
\h’\n[lss]u’wait ? pause, sleep, wait for the specified number of seconds
\h’\n[lss]u’Synopsis
\h’\n[lss]u’wait 4
\h’\n[lss]u’Description
\h’\n[lss]u’The
wait-command has many different names: You may write pause,
sleep or wait
\h’\n[lss]u’interchangeably; whatever you write,
yabasic will always do exactly the same.
\h’\n[lss]u’Therefore
you should refer to the entry for the pause-function for
further
\h’\n[lss]u’information.
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’wend ? end a while-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’while(a<b)
\h’\n[lss]u’?
\h’\n[lss]u’wend
\h’\n[lss]u’Description
\h’\n[lss]u’The
wend-keyword marks the end of a while-loop. Please see the
while-keyword
\h’\n[lss]u’for more details.
\h’\n[lss]u’wend can be written as end while or even end-while.
\h’\n[lss]u’Example
\h’\n[lss]u’line
input "Please enter a sentence: " a$
\h’\n[lss]u’p=instr(a$,"e")
\h’\n[lss]u’while(p)
\h’\n[lss]u’mid$(a$,p,1)="E"
\h’\n[lss]u’p=instr(a$,"e")
\h’\n[lss]u’wend
\h’\n[lss]u’print a$
\h’\n[lss]u’This
example reads a sentence and converts every occurrence of
the letter e
\h’\n[lss]u’into uppercase (E).
\h’\n[lss]u’See also
\h’\n[lss]u’while (which is just the following entry).
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’while ? start a while-loop
\h’\n[lss]u’Synopsis
\h’\n[lss]u’while(?)
\h’\n[lss]u’?
\h’\n[lss]u’wend
\h’\n[lss]u’Description
\h’\n[lss]u’The
while-keyword starts a while-loop, i.e. a loop that is
executed as long as
\h’\n[lss]u’the condition (which is specified in
braces after the keyword while) evaluates
\h’\n[lss]u’to true.
\h’\n[lss]u’Note,
that the body of such a while-loop will not be executed at
all, if the
\h’\n[lss]u’condition following the
while-keyword is not true initially.
\h’\n[lss]u’If you want to leave the loop prematurely, you may use the break-statement.
\h’\n[lss]u’Example
\h’\n[lss]u’open
#1,"foo"
\h’\n[lss]u’while(!eof(1))
\h’\n[lss]u’line input #1 a$
\h’\n[lss]u’print a$
\h’\n[lss]u’wend
\h’\n[lss]u’This program reads the file foo and prints it line by line.
\h’\n[lss]u’See also
\h’\n[lss]u’until, break, wend, do
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’origin ? move the origin of a window
\h’\n[lss]u’Synopsis
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’origin "cc"
\h’\n[lss]u’Description
\h’\n[lss]u’The
origin-command applies to graphic windows and moves the
origin of the
\h’\n[lss]u’coordinate system to one of nine
point within the window. The normal position
\h’\n[lss]u’of the origin is in the upper left
corner of the window; however in some cases
\h’\n[lss]u’this is inconvenient and moving the
origin may save you from subtracting a
\h’\n[lss]u’constant offset from all of your
coordinates.
\h’\n[lss]u’However,
you may not move the origin to an arbitrary position; in
horizontal
\h’\n[lss]u’position there are only three
positions: left, center and right, which are
\h’\n[lss]u’decoded by the letters l, c and r.
In vertical position the allowed positions
\h’\n[lss]u’are top, center and bottom; encoded
by the letters t, c and b. Taking the
\h’\n[lss]u’letters together, you arrive at a
string, which might be passed as an argument
\h’\n[lss]u’to the command; e.g. "cc"
or "rt".
\h’\n[lss]u’Example
\h’\n[lss]u’100,100
\h’\n[lss]u’open
window 200,200
\h’\n[lss]u’window origin "cc"
\h’\n[lss]u’circle 0,0,60
\h’\n[lss]u’This example draws a circle, centered at the center of the window.
\h’\n[lss]u’See also
\h’\n[lss]u’open window
\h’\n[lss]u’X
\h’\n[lss]u’xor() ? compute the exclusive or
\h’\n[lss]u’Name
\h’\n[lss]u’xor() ? compute the exclusive or
\h’\n[lss]u’Synopsis
\h’\n[lss]u’x=xor(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’The
xor computes the bitwise exclusive or of its two numeric
arguments. To
\h’\n[lss]u’understand the result, both
arguments should be viewed as binary numbers (i.e.
\h’\n[lss]u’a series of 0 and 1); a bit of the
result will then be 1, if exactly one
\h’\n[lss]u’argument has a 1 and the other has a
0 at this position in their binary
\h’\n[lss]u’representation.
\h’\n[lss]u’Note,
that both arguments are silently converted to integer values
and that
\h’\n[lss]u’negative numbers have their own
binary representation and may lead to
\h’\n[lss]u’unexpected results when passed to
and.
\h’\n[lss]u’Example
\h’\n[lss]u’print xor(7,4)
\h’\n[lss]u’This
will print 3. This result is obvious, if you note, that the
binary
\h’\n[lss]u’representation of 7 and 4 are 111
and 100 respectively; this will yield 011 in
\h’\n[lss]u’binary representation or 2 as
decimal.
\h’\n[lss]u’The
eor-function is the same as the xor function; both are
synonymous; however
\h’\n[lss]u’they have each their own
description, so you may check out the entry of eor for
\h’\n[lss]u’a slightly different view.
\h’\n[lss]u’See also
\h’\n[lss]u’and, or, eor, not
\h’\n[lss]u’Special characters
\h’\n[lss]u’#
? either a comment or a marker for a file-number
\h’\n[lss]u’// ? starts a comment
\h’\n[lss]u’@ ? synonymous to at
\h’\n[lss]u’: ? separate commands from each
other
\h’\n[lss]u’; ? suppress the implicit newline
after a print-statement
\h’\n[lss]u’** or ˆ ? raise its first argument
to the power of its second
\h’\n[lss]u’Name
\h’\n[lss]u’# ? either a comment or a marker for a file-number
\h’\n[lss]u’Synopsis
\h’\n[lss]u’#
This is a comment, but the line below not !
\h’\n[lss]u’open #1,"foo"
\h’\n[lss]u’Description
\h’\n[lss]u’The hash (’#’) has two totally unrelated uses:
\h’\n[lss]u’*
A hash might appear in commands related with file-io.
yabasic uses simple
\h’\n[lss]u’numbers to refer to open files
(within input, print, peek or eof). In those
\h’\n[lss]u’commands the hash may precede the
number, which species the file. Please
\h’\n[lss]u’see those commands for further
information and examples; the rest of this
\h’\n[lss]u’entry is about the second use (as a
comment).
\h’\n[lss]u’*
As the very first character within a line, a hash introduces
comments
\h’\n[lss]u’(similar to rem).
\h’\n[lss]u’’#’
as a comment is common in most scripting languages and has a
special use
\h’\n[lss]u’under Unix: If the very first line
of any Unix-program begins with the
\h’\n[lss]u’character sequence ’#!’
("she-bang", no spaces allowed), the rest of the
line
\h’\n[lss]u’is taken as the program that should
be used to execute the script. I.e. if your
\h’\n[lss]u’yabasic-program starts with
’#!/usr/local/bin/yabasic’, the program
/usr/local/
\h’\n[lss]u’bin/yabasic will be invoked to
execute the rest of the program. As a remark for
\h’\n[lss]u’windows-users: This mechanism
ensures, that yabasic will be invoked to execute
\h’\n[lss]u’your program; the ending of the file
(e.g. .yab) will be ignored by Unix.
\h’\n[lss]u’Example
\h’\n[lss]u’#
This line is a valid comment
\h’\n[lss]u’print "Hello " : # But
this is a syntax error, because
\h’\n[lss]u’print "World!" : # the
hash is not the first character !
\h’\n[lss]u’Note,
that this example will produce a syntax error and is not a
valid program
\h’\n[lss]u’!
\h’\n[lss]u’See also
\h’\n[lss]u’input, print, peek or eof, //, rem
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’// ? starts a comment
\h’\n[lss]u’Synopsis
\h’\n[lss]u’// This is a comment !
\h’\n[lss]u’Description
\h’\n[lss]u’The
double-slash (’//’) is (besides REM and
’#’) the third way to start a
\h’\n[lss]u’comment. ’//’ is the
latest and greatest in the field of commenting and allows
\h’\n[lss]u’yabasic to catch up with such cool
languages like C++ and Java.
\h’\n[lss]u’Example
\h’\n[lss]u’//
Another comment.
\h’\n[lss]u’print "Hello world !" //
Another comment
\h’\n[lss]u’Unlike
the example given for ’#’ this example is
syntactically correct and will
\h’\n[lss]u’not produce an error.
\h’\n[lss]u’See also
\h’\n[lss]u’#, rem
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’@ ? synonymous to at
\h’\n[lss]u’Synopsis
\h’\n[lss]u’clear
screen
\h’\n[lss]u’?
\h’\n[lss]u’print @(a,b)
\h’\n[lss]u’Description
\h’\n[lss]u’As ’@’ is simply a synonym for at, please see at for further information.
\h’\n[lss]u’See also
\h’\n[lss]u’at
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’: ? separate commands from each other
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print "Hello ":print "World"
\h’\n[lss]u’Description
\h’\n[lss]u’The colon (’:’) separates multiple commands on a single line.
\h’\n[lss]u’The
colon and the newline-character have mostly the same effect,
only that the
\h’\n[lss]u’latter, well, starts a new line too.
The only other difference is their effect
\h’\n[lss]u’within the (so-called) short if,
which is an if-statement without the keyword
\h’\n[lss]u’then. Please see the entry for if
for more details.
\h’\n[lss]u’Example
\h’\n[lss]u’if (a<10) print "Hello ":print "World !"
\h’\n[lss]u’This
example demonstrates the difference between colon and
newline as described
\h’\n[lss]u’above.
\h’\n[lss]u’See also
\h’\n[lss]u’if
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’; ? suppress the implicit newline after a print-statement
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print "foo",bar;
\h’\n[lss]u’Description
\h’\n[lss]u’The
semicolon (’;’) may only appear at the last
position within a print
\h’\n[lss]u’-statement. It suppresses the
implicit newline, which yabasic normally adds
\h’\n[lss]u’after each print-statement.
\h’\n[lss]u’Put
another way: Normally the output of each print-statement
appears on a line
\h’\n[lss]u’by itself. If you rather want the
output of many print-statements to appear on
\h’\n[lss]u’a single line, you should end the
print-statement with a semicolon.
\h’\n[lss]u’Example
\h’\n[lss]u’print "Hello ";:print "World !"
\h’\n[lss]u’This example prints Hello World ! in a single line.
\h’\n[lss]u’See also
\h’\n[lss]u’print
\h’\n[lss]u’-------------------------------------------------------------------------------
\h’\n[lss]u’Name
\h’\n[lss]u’** or ˆ ? raise its first argument to the power of its second
\h’\n[lss]u’Synopsis
\h’\n[lss]u’print
2**b
\h’\n[lss]u’print 3ˆ4
\h’\n[lss]u’Description
\h’\n[lss]u’**
(or ˆ, which is an exact synonym), is the arithmetic
operator of
\h’\n[lss]u’exponentiation; it requires one
number to its left and a second one to its
\h’\n[lss]u’right; ** then raises the first
argument to the power of the second and returns
\h’\n[lss]u’the result. The result will only be
computed if it yields a real number (as
\h’\n[lss]u’opposed to a complex number); this
means, that the power can not be computed,
\h’\n[lss]u’if the first argument is negative
and the second one is fractional. On the
\h’\n[lss]u’other hand, the second argument can
be fractional, if the first one ist
\h’\n[lss]u’positive; this means, that ** may be
used to compute arbitrary roots: e.g.
\h’\n[lss]u’x**0.5 computes the square root of
x.
\h’\n[lss]u’Example
\h’\n[lss]u’print 2**0.5
\h’\n[lss]u’See also
\h’\n[lss]u’sqrt
\h’\n[lss]u’Reserved Words
\h’\n[lss]u’Here
is a list of all reserved words in yabasic. Please make
sure, that you do
\h’\n[lss]u’not try to use one of them as the
name of a variable or subroutine. Or, the
\h’\n[lss]u’other way around: If you get some
mysterious error from yabasic and you just
\h’\n[lss]u’can’t figure out why, then you
might be using one of the reserved words below,
\h’\n[lss]u’without knowing.
\h’\n[lss]u’Anyway, here is the list:
\h’\n[lss]u’ABS
ACOS AND ARRAYDIM ARRAYDIMENSION
\h’\n[lss]u’ARRAYSIZE AS ASC ASIN AT
\h’\n[lss]u’ATAN BEEP BELL BIN$ BIND
\h’\n[lss]u’BITBLIT BITBLIT$ BITBLT BITBLT$ BOX
\h’\n[lss]u’BREAK CASE CHR$ CIRCLE CLEAR
\h’\n[lss]u’CLOSE COLOR COLOUR COMPILE CONTINUE
\h’\n[lss]u’COS CURVE DATA DATE$ DEC
\h’\n[lss]u’DEFAULT DIM DO DOT ELSE
\h’\n[lss]u’ELSEIF ELSIF END ENDIF EOF
\h’\n[lss]u’EOR ERROR EXECUTE EXECUTE$ EXIT
\h’\n[lss]u’EXP EXPORT FI FILL FILLED
\h’\n[lss]u’FOR FRAC GETBIT$ GETSCREEN$ GLOB
\h’\n[lss]u’GOSUB GOTO HEX$ IF INKEY$
\h’\n[lss]u’INPUT INSTR INT INTERRUPT LABEL
\h’\n[lss]u’LEFT$ LEN LET LINE LOCAL
\h’\n[lss]u’LOG LOOP LOWER$ LTRIM$ MAX
\h’\n[lss]u’MID$ MIN MOD MOUSEB MOUSEBUTTON
\h’\n[lss]u’MOUSEMOD MOUSEMODIFIER MOUSEX MOUSEY
NEW
\h’\n[lss]u’NEXT NOT NUMPARAM ON OPEN
\h’\n[lss]u’OR ORIGIN PAUSE PEEK PEEK$
\h’\n[lss]u’POKE PRINT PRINTER PUTBIT PUTSCREEN
\h’\n[lss]u’RAN READ READING RECT RECTANGLE
\h’\n[lss]u’REDIM REPEAT RESTORE RETURN REVERSE
\h’\n[lss]u’RIGHT$ RINSTR RTRIM$ SCREEN SEEK
\h’\n[lss]u’SIG SIN SLEEP SPLIT SPLIT$
\h’\n[lss]u’SQR SQRT STATIC STEP STR$
\h’\n[lss]u’SUB SUBROUTINE SWITCH SYSTEM SYSTEM$
\h’\n[lss]u’TAN TELL TEXT THEN TIME$
\h’\n[lss]u’TO TOKEN TOKEN$ TRIANGLE TRIM$
\h’\n[lss]u’UNTIL UPPER$ USING VAL WAIT
\h’\n[lss]u’WEND WHILE WINDOW WRITING XOR
\h’\n[lss]u’Please see here for explanations on how to use these words in yabasic.
\h’\n[lss]u’Chapter 8. Some general concepts and terms
\h’\n[lss]u’Logical
shortcuts
\h’\n[lss]u’Conditions and expressions
\h’\n[lss]u’References on arrays
\h’\n[lss]u’Specifying Filenames under Windows
\h’\n[lss]u’Escape-sequences
\h’\n[lss]u’Creating a standalone program from
your yabasic-program
\h’\n[lss]u’This
chapter presents some general concepts and terms, which
deserve a
\h’\n[lss]u’description on their own, but are
not associated with a single command or
\h’\n[lss]u’function in yabasic. Most of these
topics do not lend themselves to be read
\h’\n[lss]u’alone, rather they might be read (or
skimmed) as background material if an
\h’\n[lss]u’entry from the alphabetical list of
commands refers to them.
\h’\n[lss]u’Logical shortcuts
\h’\n[lss]u’Logical
shortcuts are no special language construct and there is no
keyword for
\h’\n[lss]u’them; they are just a way to
evaluate logical expressions. Logical expressions
\h’\n[lss]u’(i.e. a series of conditions or
comparisons joined by and or or) are only
\h’\n[lss]u’evaluated until the final result of
the expression can be determined. An
\h’\n[lss]u’example:
\h’\n[lss]u’if (a<>0 and b/a>2) print "b is at least twice as big as a"
\h’\n[lss]u’The
logical expression a<>0 and b/a>2 consists of two
comparisons, both of
\h’\n[lss]u’which must be true, if the print
statement should be executed. Now, if the
\h’\n[lss]u’first comparison (a<>0) is
false, the whole logical expression can never be
\h’\n[lss]u’true and the second comparison
(b/a>2) need not be evaluated.
\h’\n[lss]u’This
is exactly, how yabasic behaves: The evaluation of a
composed logical
\h’\n[lss]u’expressions is terminated
immediately, as soon as the final result can be
\h’\n[lss]u’deduced from the already evaluated
parts.
\h’\n[lss]u’In practice, this has the following consequences:
\h’\n[lss]u’*
If two or more comparisons are joined with and and one
comparison results
\h’\n[lss]u’in false, the logical expression is
evaluated no further and the overall
\h’\n[lss]u’result is false.
\h’\n[lss]u’*
If two or more comparisons are joined with or and one
comparison results in
\h’\n[lss]u’true, the logical expression is
evaluated no further and the result is
\h’\n[lss]u’true.
\h’\n[lss]u’?Nice,
but whats this good for ??, I hear you say. Well, just have
another look
\h’\n[lss]u’at the example, especially the
second comparison (b/a>2); dividing b by a is
\h’\n[lss]u’potentially hazardous: If a equals
zero, the expression will cause an error and
\h’\n[lss]u’your program will terminate. To
avoid this, the first part of the comparison (a
\h’\n[lss]u’<>0) checks, if the second one
can be evaluated without risk. This pre-checking
\h’\n[lss]u’is the most common usage and primary
motivation for logical shortcuts (and the
\h’\n[lss]u’reason why most programming
languages implement them).
\h’\n[lss]u’Conditions and expressions
\h’\n[lss]u’Well,
bottomline there is no difference or distinction between
conditions and
\h’\n[lss]u’expressions, at least as yabasic is
concerned. So you may assign the result of
\h’\n[lss]u’comparisons to variables or use an
arithmetic expression or a simple variable
\h’\n[lss]u’within a condition (e.g. within an
if-statement). So the constructs shown in
\h’\n[lss]u’the example below are all totally
valid:
\h’\n[lss]u’input "Please enter a number between 1 and 10: " a
\h’\n[lss]u’rem
Assigning the result of a comparison to a variable
\h’\n[lss]u’okay=a>=1 and a<=10
\h’\n[lss]u’rem
Use a variable within an if-statement
\h’\n[lss]u’if (not okay) error "Wrong,
wrong !"
\h’\n[lss]u’So
conditions and expressions are really the same thing (at
least as long as
\h’\n[lss]u’yabasic is concerned). Therefore the
terms conditions and expression can really
\h’\n[lss]u’be used interchangeably, at least in
theory. In reality the term condition is
\h’\n[lss]u’used in connection with if or while
whereas the term expression tends to be
\h’\n[lss]u’used more often within arithmetic
context.
\h’\n[lss]u’References on arrays
\h’\n[lss]u’References
on arrays are the only way to refer to an array as a whole
and to
\h’\n[lss]u’pass it to subroutines or functions
like arraydim or arraysize. Whereas (for
\h’\n[lss]u’example) a(2) designates the second
element of the array a, a() (with empty
\h’\n[lss]u’braces) refers to the array a
itself. a() is called an array reference.
\h’\n[lss]u’If
you pass an array reference to one of your own subroutines,
you need to be
\h’\n[lss]u’aware, that the subroutine will be
able to modify the array you have passed in.
\h’\n[lss]u’So passing an array reference does
not create a copy of the array; this has
\h’\n[lss]u’some interesting consequences:
\h’\n[lss]u’*
Speed and space: Creating a copy of an array would be a time
(and resource)
\h’\n[lss]u’consuming operation; passing just a
reference is cheap and fast.
\h’\n[lss]u’*
Returning many values: A subroutine, that wants to give back
more than one
\h’\n[lss]u’value, may require an array
reference among its arguments and then store
\h’\n[lss]u’its many return values within this
array. This is the only way to return
\h’\n[lss]u’more than one value from a
subroutine.
\h’\n[lss]u’Specifying Filenames under Windows
\h’\n[lss]u’As
you probably know, windows uses the character
’\’ to separate the
\h’\n[lss]u’directories within a pathname; an
example would be C:\yabasic\yabasic.exe (the
\h’\n[lss]u’usual location of the yabasic
executable). However, the very same character
’\’
\h’\n[lss]u’is used to construct escape
sequences, not only in yabasic but in most other
\h’\n[lss]u’programming languages.
\h’\n[lss]u’Therefore
the string "C:\t.dat" does not specify the file
t.dat within the
\h’\n[lss]u’directory C:; this is because the
sequence ’\t’ is translated into the
\h’\n[lss]u’tab-character. To specify this
filename, you need to use the string "C:\\t.dat"
\h’\n[lss]u’(note the double slash
’\\’).
\h’\n[lss]u’Escape-sequences
\h’\n[lss]u’Escape-sequences
are the preferred way of specifying ’special’
characters. They
\h’\n[lss]u’are introduced by the
’\’-character and followed by one of a few
regular
\h’\n[lss]u’letters, e.g. ’\n’ or
’\r’ (see the table below).
\h’\n[lss]u’Escape-sequences
may occur within any string at any position; they are
replaced
\h’\n[lss]u’at parsetime (opposed to runtime),
i.e. as soon as yabasic discovers the
\h’\n[lss]u’string, with their corresponding
special character. As a consequence of this
\h’\n[lss]u’len("\a") returns 1,
because yabasic replaces "\a" with the matching
special
\h’\n[lss]u’character just before the program
executes.
\h’\n[lss]u’Table 8.1. Escape sequences
\h’\n[lss]u’+--------------------------------------------+
\h’\n[lss]u’|Escape Sequence| Matching special
character |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\n |newline |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\t |tabulator |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\v |vertical tabulator |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\b |backspace |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\r |carriage return |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\f |formfeed |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\a |alert (i.e. a beeping sound)|
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\\ |backslash |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\’ |single quote |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\" |double quote |
\h’\n[lss]u’|---------------+----------------------------|
\h’\n[lss]u’|\xHEX |chr$(HEX) (see below) |
\h’\n[lss]u’+--------------------------------------------+
\h’\n[lss]u’Note,
that an escape sequences of the form \xHEX allows one to
encode arbitrary
\h’\n[lss]u’characters as long as you know their
position (as a hex-number) within the
\h’\n[lss]u’ascii-charset: For example \x012 is
transformed into the character chr$(18) (or
\h’\n[lss]u’chr$(dec("12",16)). Note
that \x requires a hexa-decimal number (and the
\h’\n[lss]u’hexa-decimal string "12"
corresponds to the decimal number 18).
\h’\n[lss]u’Creating a standalone program from your yabasic-program
\h’\n[lss]u’Creating
a standalone-program from the command line
\h’\n[lss]u’Creating a standalone-program from
within your program
\h’\n[lss]u’Downsides of creating a standalone
program
\h’\n[lss]u’See also
\h’\n[lss]u’Note
\h’\n[lss]u’The
bind-feature, which is described below, is at an
experimental stage right
\h’\n[lss]u’now. It works (at least for me !)
under Windows and Linux, but I cannot even
\h’\n[lss]u’promise it for other variants of
Unix. However, if it does not work for your
\h’\n[lss]u’Unix, I will at least try to make it
work, if you give me sufficient
\h’\n[lss]u’information of your system.
\h’\n[lss]u’Sometimes
you may want to give one of your yabasic-programs to other
people.
\h’\n[lss]u’However, what if those other people
do not have yabasic installed ? In that
\h’\n[lss]u’case you may create a
standalone-program from your yabasic-program, i.e. an
\h’\n[lss]u’executable, that may be executed on
its own, standalone, even (and especially
\h’\n[lss]u’!) on computers, that do not have
yabasic installed. Having created a
\h’\n[lss]u’standalone program, you may pass it
around like any other program (e.g. one
\h’\n[lss]u’written in C) and you can be sure
that your program will execute right away.
\h’\n[lss]u’Such
a standalone-program is simply created by copying the full
yabasic
\h’\n[lss]u’-interpreter and your
yabasic-program (plus all the libraries it does import)
\h’\n[lss]u’together into a single, new program,
whose name might be chosen at will (under
\h’\n[lss]u’windows of course it should have the
ending .exe). If you decide to create a
\h’\n[lss]u’standalone-program, there are three
bits in yabasic, that you may use:
\h’\n[lss]u’*
The bind-command, which does the actual job of creating the
standalone
\h’\n[lss]u’program from the yabasic-interpreter
and your program.
\h’\n[lss]u’*
The command-line Option --bind (see options), which does the
same from the
\h’\n[lss]u’command-line.
\h’\n[lss]u’*
The special peek("isbound"), which may be used to
check, if the yabasic
\h’\n[lss]u’-program containing this peek is
bound to the interpreter as part of a
\h’\n[lss]u’standalone program.
\h’\n[lss]u’With
these bits you know enough to create a standalone-program.
Actually there
\h’\n[lss]u’are two ways to do this: on the
command line and from within your program.
\h’\n[lss]u’Creating a standalone-program from the command line
\h’\n[lss]u’Let’s say you have the following very simple program within the file foo.yab:
\h’\n[lss]u’print "Hello World !"
\h’\n[lss]u’Normally
you would start this yabasic-program by typing yabasic
foo.yab and as
\h’\n[lss]u’a result the string Hello World !
would appear on your screen. However, to
\h’\n[lss]u’create a standalone-program from
foo.yab you would type:
\h’\n[lss]u’yabasic -bind foo.exe foo.yab
\h’\n[lss]u’This
command does not execute your program foo.yab but rather
create a
\h’\n[lss]u’standalone-program foo.exe. Note:
under Unix you would probably name the
\h’\n[lss]u’standalone program foo or such,
omitting the windows-specific ending .exe.
\h’\n[lss]u’Yabasic
will confirm by printing something like: ---Info:
Successfully bound
\h’\n[lss]u’’yabasic’ and
’foo.yab’ into ’foo.exe’.
\h’\n[lss]u’After
that you will find a program foo.exe (which must be made
executable with
\h’\n[lss]u’the chmod-command under Unix first).
Now, executing this program foo.exe (or
\h’\n[lss]u’foo under Unix) will produce the
output Hello World !.
\h’\n[lss]u’This
newly created program foo.exe might be passed around to
anyone, even if he
\h’\n[lss]u’does not have yabasic installed.
\h’\n[lss]u’Creating a standalone-program from within your program
\h’\n[lss]u’It
is possible to write a yabasic-program, that binds itself to
the yabasic
\h’\n[lss]u’-interpreter. Here is an
example:
\h’\n[lss]u’if
(!peek("isbound")) then
\h’\n[lss]u’bind "foo"
\h’\n[lss]u’print "Successfully created the
standalone executable ’foo’ !"
\h’\n[lss]u’exit
\h’\n[lss]u’endif
\h’\n[lss]u’print "Hello World !"
\h’\n[lss]u’If
you run this program (which may be saved in the file
foo.yab) via yabasic
\h’\n[lss]u’foo.yab, the
peek("isbound") in the first line will check, if
the program is
\h’\n[lss]u’already part of a
standalone-program. If not (i.e. if the yabasic-interpreter
\h’\n[lss]u’and the yabasic-program are separate
files) the bind-command will create a
\h’\n[lss]u’standalone program foo containing
both. As a result you would see the output
\h’\n[lss]u’Successfully created the standalone
executable ’foo’ !. Note: Under Windows you
\h’\n[lss]u’would probably choose the filename
foo.exe.
\h’\n[lss]u’Now,
if you run this standalone executable foo (or foo.exe), the
very same
\h’\n[lss]u’yabasic-program that is shown above
will be executed again. However, this time
\h’\n[lss]u’the peek("isbound") will
return TRUE and therefore the condition of the
\h’\n[lss]u’if-statement is false and the three
lines after then are not executed. Rather
\h’\n[lss]u’the last print-statement will run,
and you will see the output Hello World !.
\h’\n[lss]u’That way a yabasic-program may turn itself into a standalone-program.
\h’\n[lss]u’Downsides of creating a standalone program
\h’\n[lss]u’Now,
before you go out and turn all your yabasic-programs into
standalone
\h’\n[lss]u’programs, please take a second to
consider the downsides of doing so:
\h’\n[lss]u’*
The new standalone program will be at least as big as the
interpreter
\h’\n[lss]u’itself, so you need to pass a few
hundred kilobytes around, just to save
\h’\n[lss]u’people from having to install
yabasic themselves.
\h’\n[lss]u’*
There is no easy way to extract your yabasic-program from
within the
\h’\n[lss]u’standalone program: If you ever want
to change it, you need to have it
\h’\n[lss]u’around separately.
\h’\n[lss]u’*
If a new version of yabasic becomes available, again you
need to recreate
\h’\n[lss]u’all of your standalone programs to
take advantage of bugfixes and
\h’\n[lss]u’improvements.
\h’\n[lss]u’So,
being able to create a standalone program is certainly a
good thing, but
\h’\n[lss]u’certainly not a silver bullet.
\h’\n[lss]u’See also
\h’\n[lss]u’The bind-command, the peek-function and the command line options.
\h’\n[lss]u’Chapter 9. A few example programs
\h’\n[lss]u’A
very simple program
\h’\n[lss]u’The demo of yabasic
\h’\n[lss]u’A very simple program
\h’\n[lss]u’The program below is a very simple program:
\h’\n[lss]u’repeat
\h’\n[lss]u’input "Please enter the first
number, to add " a
\h’\n[lss]u’input "Please enter the second
number, to add " b
\h’\n[lss]u’print a+b
\h’\n[lss]u’until(a=0 and b=0)
\h’\n[lss]u’This
program requests two numbers, which it than adds. The
process is repeated
\h’\n[lss]u’until you enter zero (or nothing)
twice.
\h’\n[lss]u’The demo of yabasic
\h’\n[lss]u’The
listing below is the demo of yabasic. Note, that parts of
this demo have
\h’\n[lss]u’been written before some of the more
advanced features (e.g subroutines) of
\h’\n[lss]u’yabasic have been implemented. So
please do not take this as a particular good
\h’\n[lss]u’example of yabasic-code.
\h’\n[lss]u’//
\h’\n[lss]u’// This program demos yabasic
\h’\n[lss]u’//
\h’\n[lss]u’//
Check, if screen is large enough
\h’\n[lss]u’clear screen
\h’\n[lss]u’sw=peek("screenwidth"):sh=peek("screenheight")
\h’\n[lss]u’if (sw<78 or sh<24) then
\h’\n[lss]u’print
\h’\n[lss]u’print " Sorry, but your screen
is to small to run this demo !"
\h’\n[lss]u’print
\h’\n[lss]u’end
\h’\n[lss]u’endif
\h’\n[lss]u’sw=78:sh=24
\h’\n[lss]u’//
Initialize everything
\h’\n[lss]u’restore mmdata
\h’\n[lss]u’read mmnum:dim mmtext$(mmnum)
\h’\n[lss]u’for a=1 to mmnum:read
mmtext$(a):next a
\h’\n[lss]u’//
Main loop selection of demo
\h’\n[lss]u’ysel=1
\h’\n[lss]u’label mainloop
\h’\n[lss]u’clear screen
\h’\n[lss]u’print
colour("cyan","magenta") at(7,2)
"################################"
\h’\n[lss]u’print
colour("cyan","magenta") at(7,3)
"################################"
\h’\n[lss]u’print
colour("cyan","magenta") at(7,4)
"################################"
\h’\n[lss]u’print
colour("yellow","blue") at(8,3) "
This is the demo for yabasic "
\h’\n[lss]u’yoff=7
\h’\n[lss]u’for a=1 to mmnum
\h’\n[lss]u’if (a=mmnum) then ydisp=1:else
ydisp=0:fi
\h’\n[lss]u’if (a=ysel) then
\h’\n[lss]u’print
colour("blue","green")
at(5,yoff+ydisp+a) mmtext$(a);
\h’\n[lss]u’else
\h’\n[lss]u’print at(5,yoff+ydisp+a) mmtext$(a);
\h’\n[lss]u’endif
\h’\n[lss]u’next a
\h’\n[lss]u’print at(3,sh-3) "Move
selection with CURSOR KEYS (or u and d),"
\h’\n[lss]u’print at(3,sh-2) "Press RETURN
or SPACE to choose, ESC to quit."
\h’\n[lss]u’do
// loop for keys pressed
\h’\n[lss]u’rev=1
\h’\n[lss]u’do // loop for blinking
\h’\n[lss]u’k$=inkey$(0.4)
\h’\n[lss]u’if (k$="") then
\h’\n[lss]u’if (ysel=mmnum) then
\h’\n[lss]u’if (rev=1) then
\h’\n[lss]u’print
colour("blue","green")
at(5,yoff+mmnum+1) mmtext$(mmnum);
\h’\n[lss]u’rev=0
\h’\n[lss]u’else
\h’\n[lss]u’print
colour("yellow","red")
at(5,yoff+mmnum+1) mmtext$(mmnum);
\h’\n[lss]u’rev=1
\h’\n[lss]u’endif
\h’\n[lss]u’endif
\h’\n[lss]u’else // key has been pressed, leave
loop
\h’\n[lss]u’break
\h’\n[lss]u’endif
\h’\n[lss]u’loop // loop for blinking
\h’\n[lss]u’yalt=ysel
\h’\n[lss]u’if (k$="up" or
k$="u") then
\h’\n[lss]u’if (ysel=1) then ysel=mmnum else
ysel=ysel-1 fi
\h’\n[lss]u’redraw():heal():continue
\h’\n[lss]u’fi
\h’\n[lss]u’if (k$="down" or
k$="d") then
\h’\n[lss]u’if (ysel=mmnum) then ysel=1 else
ysel=ysel+1 fi
\h’\n[lss]u’redraw():heal():continue
\h’\n[lss]u’fi
\h’\n[lss]u’if (k$=" " or
k$="enter" or k$="right") then
\h’\n[lss]u’on ysel gosub
overview,bitmap,tetraeder,endit
\h’\n[lss]u’goto mainloop
\h’\n[lss]u’fi
\h’\n[lss]u’if (k$="esc") then
\h’\n[lss]u’endit()
\h’\n[lss]u’fi
\h’\n[lss]u’beep
\h’\n[lss]u’print at(3,sh-5) "Invalid key:
",k$," "
\h’\n[lss]u’loop // loop for keys pressed
\h’\n[lss]u’//
redraw line
\h’\n[lss]u’sub redraw()
\h’\n[lss]u’if (yalt=mmnum) then ydisp=1:else
ydisp=0:fi
\h’\n[lss]u’print at(5,yoff+yalt+ydisp)
mmtext$(yalt);
\h’\n[lss]u’if (ysel=mmnum) then ydisp=1:else
ydisp=0:fi
\h’\n[lss]u’print
colour("blue","green")
at(5,yoff+ysel+ydisp) mmtext$(ysel);
\h’\n[lss]u’return
\h’\n[lss]u’end sub
\h’\n[lss]u’//
erase a line
\h’\n[lss]u’sub heal()
\h’\n[lss]u’print at(3,sh-5) " "
\h’\n[lss]u’return
\h’\n[lss]u’end sub
\h’\n[lss]u’//
Go here to exit
\h’\n[lss]u’label endit
\h’\n[lss]u’print at(3,sh-8) "Hope you
liked it ...\n ";
\h’\n[lss]u’exit
\h’\n[lss]u’return
\h’\n[lss]u’//
Present a short overview
\h’\n[lss]u’label overview
\h’\n[lss]u’clear screen
\h’\n[lss]u’print
\h’\n[lss]u’print " Yabasic is a quite
traditional basic: It comes with"
\h’\n[lss]u’print " print, input,
for-next-loops, goto, gosub, while and"
\h’\n[lss]u’print " repeat. It has user
defined procedures and libraries,"
\h’\n[lss]u’print " however, it is not
object oriented.\n"
\h’\n[lss]u’print " Yabasic makes it easy
to open a window, draw lines"
\h’\n[lss]u’print " and print the resulting
picture.\n"
\h’\n[lss]u’print " Yabasic programs are
interpreted and run under Unix"
\h’\n[lss]u’print " and Windows. The
Yabasic interpreter (around 200K)"
\h’\n[lss]u’print " and any Yabasic program
can be glued together to"
\h’\n[lss]u’print " form a standalone
executable.\n"
\h’\n[lss]u’print " Yabasic is free
software, i.e. subject to the"
\h’\n[lss]u’print " MIT License.\n"
\h’\n[lss]u’print "\n\n\n While you read
this, I am calculating prime numbers,\n"
\h’\n[lss]u’print " Press any key to return
to main menu ..."
\h’\n[lss]u’can=1
\h’\n[lss]u’print at(6,17) "This is a prime
number: "
\h’\n[lss]u’label nextcan
\h’\n[lss]u’can=can+2
\h’\n[lss]u’for i=2 to sqrt(can):if
(frac(can/i)=0) then goto notprime:fi:next i
\h’\n[lss]u’print at(32,17) can;
\h’\n[lss]u’label notprime
\h’\n[lss]u’if
(lower$(inkey$(0))<>"") then
\h’\n[lss]u’print at(10,sh) "Wrapping
around once ...";
\h’\n[lss]u’for x=1 to sw
\h’\n[lss]u’a$=getscreen$(0,0,1,sh-2)
\h’\n[lss]u’b$=getscreen$(1,0,sw-1,sh-2)
\h’\n[lss]u’putscreen b$,0,0
\h’\n[lss]u’putscreen a$,sw-1,0
\h’\n[lss]u’next x
\h’\n[lss]u’sleep 2
\h’\n[lss]u’return
\h’\n[lss]u’fi
\h’\n[lss]u’goto nextcan
\h’\n[lss]u’//
Show some animated bitmaps
\h’\n[lss]u’label bitmap
\h’\n[lss]u’clear screen
\h’\n[lss]u’print
\h’\n[lss]u’print "Yabasic offers some
commands for drawing simple graphics."
\h’\n[lss]u’print reverse at(5,12) " Press
any key to return to main menu ... "
\h’\n[lss]u’n=20
\h’\n[lss]u’open window 400,400
\h’\n[lss]u’for
b=20 to 0 step -1
\h’\n[lss]u’color 255-b*12,0,b*12
\h’\n[lss]u’fill circle 200,200,b
\h’\n[lss]u’next b
\h’\n[lss]u’c$=getbit$(179,179,221,221)
\h’\n[lss]u’for a=1 to 2000
\h’\n[lss]u’color ran(255),ran(255),ran(255)
\h’\n[lss]u’x=ran(500)-100:y=ran(500)-100
\h’\n[lss]u’fill rectangle
ran(500)-100,ran(500)-100,ran(500)-100,ran(500)-100
\h’\n[lss]u’next a
\h’\n[lss]u’x=200:y=200:phi=ran(2*pi):dx=2*sin(phi):dy=2*cos(phi)
\h’\n[lss]u’o$=""
\h’\n[lss]u’count=0
\h’\n[lss]u’label pong
\h’\n[lss]u’count=count+1
\h’\n[lss]u’if (o$<>"") putbit
o$,xo-2,yo-2
\h’\n[lss]u’if (count>1000) then
\h’\n[lss]u’phi=ran(2*pi):dx=2*sin(phi):dy=2*cos(phi)
\h’\n[lss]u’sleep 2
\h’\n[lss]u’count=0
\h’\n[lss]u’endif
\h’\n[lss]u’xo=x:yo=y
\h’\n[lss]u’x=x+dx:y=y+dy
\h’\n[lss]u’o$=getbit$(x-2,y-2,x+46,y+46)
\h’\n[lss]u’putbit c$,x,y,"t"
\h’\n[lss]u’if (x<0 or x>360) dx=-dx
\h’\n[lss]u’if (y<0 or y>360) dy=-dy
\h’\n[lss]u’if (inkey$(0)<>"")
then
\h’\n[lss]u’close window
\h’\n[lss]u’return
\h’\n[lss]u’endif
\h’\n[lss]u’goto pong
\h’\n[lss]u’return
\h’\n[lss]u’label tetraeder
\h’\n[lss]u’open
window 400,400
\h’\n[lss]u’clear window
\h’\n[lss]u’clear screen
\h’\n[lss]u’print reverse at(5,12) " Press
any key to return to main menu ... "
\h’\n[lss]u’dim
opoints(4,3)
\h’\n[lss]u’restore points
\h’\n[lss]u’for n=1 to 4:for p=1 to 3:read
opoints(n,p):next p:next n
\h’\n[lss]u’dim
triangles(4,3)
\h’\n[lss]u’restore triangles
\h’\n[lss]u’for n=1 to 4:for p=1 to 3:read
triangles(n,p):next p:next n
\h’\n[lss]u’phi=0:dphi=0.1:psi=0:dpsi=0.05
\h’\n[lss]u’dim points(4,3)
\h’\n[lss]u’r=60:g=20
\h’\n[lss]u’dr=0.5:dg=1.2:db=3
\h’\n[lss]u’label main
\h’\n[lss]u’phi=phi+dphi
\h’\n[lss]u’psi=psi+dpsi
\h’\n[lss]u’for n=1 to 4
\h’\n[lss]u’points(n,1)=opoints(n,1)*cos(phi)-opoints(n,2)*sin(phi)
\h’\n[lss]u’points(n,2)=opoints(n,2)*cos(phi)+opoints(n,1)*sin(phi)
\h’\n[lss]u’p2=
points(n,2)*cos(psi)-opoints(n,3)*sin(psi)
\h’\n[lss]u’points(n,3)=opoints(n,3)*cos(psi)+
points(n,2)*sin(psi)
\h’\n[lss]u’points(n,2)=p2
\h’\n[lss]u’next n
\h’\n[lss]u’r=r+dr:if
(r<0 or r>60) dr=-dr
\h’\n[lss]u’g=g+dg:if (g<0 or g>60) dg=-dg
\h’\n[lss]u’b=b+db:if (b<0 or b>60) db=-db
\h’\n[lss]u’dm=dm+0.01
\h’\n[lss]u’m=120-80*sin(dm)
\h’\n[lss]u’for n=1 to 4
\h’\n[lss]u’p1=triangles(n,1)
\h’\n[lss]u’p2=triangles(n,2)
\h’\n[lss]u’p3=triangles(n,3)
\h’\n[lss]u’n1=points(p1,1)+points(p2,1)+points(p3,1)
\h’\n[lss]u’n2=points(p1,2)+points(p2,2)+points(p3,2)
\h’\n[lss]u’n3=points(p1,3)+points(p2,3)+points(p3,3)
\h’\n[lss]u’if (n3>0) then
\h’\n[lss]u’sp=n1*0.5-n2*0.7-n3*0.6
\h’\n[lss]u’color
60+r+30*sp,60+g+30*sp,60+b+30*sp
\h’\n[lss]u’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)
\h’\n[lss]u’endif
\h’\n[lss]u’next n
\h’\n[lss]u’if (inkey$(0.1)<>"")
close window:return
\h’\n[lss]u’clear window
\h’\n[lss]u’goto main
\h’\n[lss]u’label
points
\h’\n[lss]u’data -1,-1,+1, +1,-1,-1, +1,+1,+1,
-1,+1,-1
\h’\n[lss]u’label triangles
\h’\n[lss]u’data 1,2,4, 2,3,4, 1,3,4, 1,2,3
\h’\n[lss]u’//
Data section ...
\h’\n[lss]u’label mmdata
\h’\n[lss]u’// Data for main menu: Number and
text of entries in main menu
\h’\n[lss]u’data 4
\h’\n[lss]u’data " Yabasic in a nutshell
"
\h’\n[lss]u’data " Some graphics "
\h’\n[lss]u’data " A rotating Tetraeder
"
\h’\n[lss]u’data " Exit this demo
"
\h’\n[lss]u’Chapter 10. The Copyright of yabasic
\h’\n[lss]u’yabasic
may be copied under the terms of the MIT License, which is
distributed
\h’\n[lss]u’with yabasic in the file
LICENSE.
\h’\n[lss]u’The
MIT License grants extensive rights as long as you keep the
copyright
\h’\n[lss]u’notice present in most files
untouched. Here is a list of things that are
\h’\n[lss]u’possible under the terms of the MIT
License:
\h’\n[lss]u’*
Put yabasic on your own homepage or CD and even charge for
the service of
\h’\n[lss]u’distributing yabasic.
\h’\n[lss]u’*
Write your own yabasic-programs, pack your program and
yabasic into a
\h’\n[lss]u’package and sell the whole
thing.
\h’\n[lss]u’*
Modify yabasic and add or remove features, sell the modified
version
\h’\n[lss]u’without adding the sources.
AUTHOR
Marc Ihm, with the input and suggestions from many others.
SEE ALSO
yabasic.htm - for the hyperlinked version of the text that is presented above.
www.yabasic.de - for further information on yabasic.
BUGS
Still some.