698 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			698 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| \input texinfo   @c -*-texinfo-*-
 | |
| @comment %**start of header
 | |
| @setfilename enigma-documentation.info
 | |
| @finalout
 | |
| @settitle Enigma
 | |
| @afourpaper
 | |
| @syncodeindex pg cp
 | |
| @comment %**end of header
 | |
| @copying
 | |
| This manual is for Enigma, version 0.1.
 | |
| Copyright @copyright{} 2010 Niels Serup
 | |
| @quotation
 | |
| Permission is granted to copy, distribute and/or modify this document
 | |
| under the terms of the GNU Free Documentation License, Version 1.3 or
 | |
| any later version published by the Free Software Foundation; with no
 | |
| Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A
 | |
| copy of the license is included in the section entitled "GNU Free
 | |
| Documentation License".
 | |
| 
 | |
| This document is also available under the terms of the Creative Commons
 | |
| Attribution-Share Alike 3.0 (or any later version) Unported license. A
 | |
| copy of the license is available at
 | |
| @url{http://creativecommons.org/@/licenses/@/by-sa/@/3.0/@/legalcode}.
 | |
| @end quotation
 | |
| @end copying
 | |
| @titlepage
 | |
| @title Enigma
 | |
| @subtitle A programming language @hskip 0pt plus 1filll Version 0.1
 | |
| @sp 8
 | |
| @center @image{../art/enigma-logo,11cm,,Enigma logo}
 | |
| @author Niels Serup (@email{ns@@metanohi.org})
 | |
| @page
 | |
| @vskip 0pt plus 1filll
 | |
| @insertcopying
 | |
| @end titlepage
 | |
| @contents
 | |
| @ifnottex
 | |
| @node Top, Introduction, (dir), (dir)
 | |
| @top Enigma
 | |
| @insertcopying
 | |
| 
 | |
| New versions of this manual will be available at
 | |
| @url{http://metanohi.org/@/projects/@/enigma/}.
 | |
| @end ifnottex
 | |
| @menu
 | |
| * Introduction::                
 | |
| * Language::                    
 | |
| * Future::                      
 | |
| * Implementations::             
 | |
| * Comparison::                  
 | |
| * Built-In::                    
 | |
| * Copying This Manual::         
 | |
| * Index::                       
 | |
| @end menu
 | |
| 
 | |
| @node Introduction, Language, Top, Top
 | |
| @chapter A short introduction
 | |
| Today, in the world of programming, the commonly used programming
 | |
| languages have --- to some extent --- adapted the same basic
 | |
| syntax. Both C, C++, Java, Python and Ruby (and others) all share
 | |
| several paradigms, even though they are still very different. Enigma, on
 | |
| the other hand, is very different from the ``common'' languages. See
 | |
| this small program to get an idea of Enigma:
 | |
| 
 | |
| @verbatim
 | |
| {/a,b/
 | |
|     a 2 ! multiply = c;
 | |
|     b c ! add = return;
 | |
| } = odd-add;
 | |
| 
 | |
| 9 4 ! odd-add | stdout temp ! write;
 | |
| @end verbatim
 | |
| 
 | |
| @noindent Here, 9 is first multiplied with 2 and then added to 4. The
 | |
| program then prints the result (22).
 | |
| 
 | |
| With only a few constructs and built-in variables, Enigma is quite small
 | |
| and relatively simple. Any logic can be expressed in Enigma. The above
 | |
| example may seem odd, but its aspects will be dealt with in the next
 | |
| chapter.
 | |
| 
 | |
| Enigma is @emph{not} the kind of programming language that likes to
 | |
| control programmers. When programming in Enigma, one creates functions
 | |
| that call other functions --- instead of creating functions that are
 | |
| called by built-in functions.
 | |
| 
 | |
| On the other hand, Enigma is very restrictive. There are limits to
 | |
| certain things. If these limits were not present, chaos would
 | |
| ensue. Perhaps.
 | |
| 
 | |
| @cindex pointers
 | |
| Like many other languages, Enigma is quite fond of pointers. In Enigma,
 | |
| all variables are pointers. When @code{x} is assigned to @code{a}, and
 | |
| @code{b} is assigned to @code{a}, changing @code{b} also changes
 | |
| @code{a}. As a matter of fact, when two pointers points to the same
 | |
| place, they are @strong{forever} linked together.
 | |
| 
 | |
| Enigma is not recommended for serious use. Use with @strong{caution}!
 | |
| 
 | |
| 
 | |
| @node Language, Future, Introduction, Top
 | |
| @chapter The language
 | |
| Enigma consists of functions. Any file being parsed is a
 | |
| function. Within functions there can be local variables. These variables
 | |
| are to disappear when the function exits.
 | |
| 
 | |
| Functions have return values. These values can be determined by the
 | |
| programmer.
 | |
| 
 | |
| Within functions, there are commands. These commands constitute the very
 | |
| base of Enigma. Commands can interact with built-in functions, meaning
 | |
| that writing to and reading from files, calculating, as well as
 | |
| manipulating strings and lists, is possible.
 | |
| 
 | |
| There are no simple types. Enigma lies in the world of objects. Numbers,
 | |
| strings, lists.. It's just objects. Also, all commands must end with a
 | |
| semicolon@code{;}
 | |
| 
 | |
| 
 | |
| @menu
 | |
| * Operators::                   
 | |
| * Numbers::                     
 | |
| * Strings::                     
 | |
| * Lists::                       
 | |
| * Booleans::                    
 | |
| * Files::                       
 | |
| * Functions::                   
 | |
| * Conditionals::                
 | |
| * Loops::                       
 | |
| * Undefined::                   
 | |
| @end menu
 | |
| 
 | |
| 
 | |
| @node Operators, Numbers, Language, Language
 | |
| @section Operators
 | |
| @cindex operators
 | |
| Enigma has 4 operators: @code{!}, @code{=}, @code{|}, and
 | |
| @code{*}. @code{!} and @code{=} are the most important ones.
 | |
| 
 | |
| To assign values to variables, use the @code{=} operator. For example:
 | |
| @verbatim
 | |
| obj = hello-string;
 | |
| @end verbatim
 | |
| Here, the variable @code{hello-string} receives the object @code{obj}. Note
 | |
| the syntax. The objects comes first. Unless @code{hello-string} is
 | |
| already defined, it is created as a local variable.
 | |
| 
 | |
| Now, say we have a function called @code{think} and we want to send
 | |
| objects to it. This is how that's done:
 | |
| 
 | |
| @verbatim
 | |
| obj1 obj2 obj3 ! think;
 | |
| @end verbatim
 | |
| 
 | |
| There are no limits to the amount of objects that can be sent to a
 | |
| function. Whitespace characters are used to separate objects, also when
 | |
| assigning them to a variable. There @emph{is} a difference between
 | |
| using one object and more objects as arguments, though. When using only
 | |
| one object, that object is simply used, but when using more objects, a
 | |
| list containing all objects is created and transmitted instead. So, in
 | |
| reality, when assigning two or more objects to a variable, the variable
 | |
| points to a list with the objects. More about lists later.
 | |
| 
 | |
| The @code{|} operator is merely a shortcut operator. It can merge
 | |
| several commands into one, long command. See the following example:
 | |
| 
 | |
| @verbatim
 | |
| # Long version
 | |
| a ! b = c;
 | |
| d c ! e = c;
 | |
| # Short version
 | |
| a ! b | d temp ! e = c;
 | |
| @end verbatim
 | |
| 
 | |
| Here, @code{a} is sent to @code{b}, which is then --- together with
 | |
| @code{d} --- sent to @code{e} and saved in @code{c}. The @code{|} acts
 | |
| like the semicolon, but it copies the return value of the last function
 | |
| (in this case @code{b}) and stores the value in the local variable
 | |
| @code{temp}. Hackers are encouraged to use this operator.
 | |
| 
 | |
| The final operator, @code{*}, has the same function as @code{=}, except
 | |
| that it works on a global level. So, if the code is @code{b = a;} and
 | |
| @code{a} does not exist, it is created --- in the global space.
 | |
| 
 | |
| 
 | |
| @node Numbers, Strings, Operators, Language
 | |
| @section Numbers
 | |
| @cindex numbers
 | |
| Numbers in Enigma can be arbitrarily large. They are written as one
 | |
| usually writes numbers. Currently only the decimal system is supported.
 | |
| 
 | |
| @verbatim
 | |
| 7587 = age;
 | |
| 2556 ! numfunc;
 | |
| @end verbatim
 | |
| 
 | |
| 
 | |
| @node Strings, Lists, Numbers, Language
 | |
| @section Strings
 | |
| @cindex strings
 | |
| @cindex characters
 | |
| Strings are defined using the @code{"} character.
 | |
| 
 | |
| @verbatim
 | |
| "This is a string!" " This too!" ! add;
 | |
| "A" = A;
 | |
| "Now comes
 | |
| a newline" = nl;
 | |
| "\"\\\n\t\
 | |
| " = escaped;
 | |
| @end verbatim
 | |
| 
 | |
| 
 | |
| @node Lists, Booleans, Strings, Language
 | |
| @section Lists
 | |
| @cindex lists
 | |
| @cindex arrays
 | |
| Lists are special in Enigma. They are used a lot, but unlike eg. numbers
 | |
| and strings they cannot be defined in their own syntax. When one writes
 | |
| this:
 | |
| 
 | |
| @verbatim
 | |
| 123 "witch" = lst;
 | |
| @end verbatim
 | |
| 
 | |
| ..one creates a list. Lists can be nested.
 | |
| 
 | |
| 
 | |
| @node Booleans, Files, Lists, Language
 | |
| @section Booleans
 | |
| @cindex booleans
 | |
| Booleans are used a lot in Enigma. The predefined variables @code{true}
 | |
| and @code{false} can be used.
 | |
| 
 | |
| 
 | |
| @node Files, Functions, Booleans, Language
 | |
| @section Files
 | |
| @cindex files
 | |
| Files can only be created using the built-in function @code{open}. Files
 | |
| are either readable or writeable. If a file is writeable, text written
 | |
| to the file may optionally be appended to any existing text.
 | |
| 
 | |
| @cindex read
 | |
| @cindex write
 | |
| @cindex open
 | |
| @cindex close
 | |
| @verbatim
 | |
| "a" "r" ! open = f1;
 | |
| "b" "w" ! open = f2;
 | |
| "c" "a" ! open = f3;
 | |
| 
 | |
| # Read one character
 | |
| f1 ! read | stdout temp ! write;
 | |
| # Write a string
 | |
| f2 "Aaar" ! write;
 | |
| # Append a string
 | |
| f3 "Ouu" ! write;
 | |
| 
 | |
| f1!close;f2!close;f3!close;
 | |
| @end verbatim
 | |
| 
 | |
| To read an entire file, one must use a loop
 | |
| construct. @xref{Loops}. When there are no more characters left, the
 | |
| @code{read} function returns an empty string. Using equality testing,
 | |
| reading a complete file is thus possible. @xref{Conditionals}.
 | |
| 
 | |
| @verbatim
 | |
| filename "r" ! open = f;
 | |
| {f ! read = c; stdout c ! write; c "" ! equal ! not = return;} ! loop;
 | |
| @end verbatim
 | |
| 
 | |
| At this point, it may not be obvious why this works. This will be
 | |
| explained in the next sections.
 | |
| 
 | |
| 
 | |
| @node Functions, Conditionals, Files, Language
 | |
| @section Functions
 | |
| @cindex functions
 | |
| Functions are defined and called using the following syntax:
 | |
| 
 | |
| @verbatim
 | |
| # Defining them
 | |
| {stdout "Hello" ! write;} = func;
 | |
| {/x,y/stdout "x=" x ", y=" y!write;} = coorprint;
 | |
| {stdout args ! write;} = aprint;
 | |
| 
 | |
| # Calling them
 | |
| !func;                 # Outputs "Hello"
 | |
| 52 12 ! coorprint;     # Outputs "x=52, y=12"
 | |
| 999 "abc" 21 ! aprint; # Outputs "999 abc 21"
 | |
| @end verbatim
 | |
| 
 | |
| Arguments can thus be accessed either by using the @code{/.../} syntax
 | |
| in the beginning of the function or by using the local @code{args}
 | |
| variable. Furthermore, to make @emph{all} new variables save in the
 | |
| global space, prepend the function content with a @code{*}. This will
 | |
| have the same effect as replacing all @code{=} signs in the function
 | |
| with the @code{*} operator.
 | |
| 
 | |
| Remember that your file is also a function, just without the curly
 | |
| brackets. This means that when working on the top level of your program,
 | |
| @code{args} actually refer to the arguments specified on the command
 | |
| line. All arguments are strings, but built-in functions that can convert
 | |
| them to numbers exist.
 | |
| 
 | |
| The previous example functions did not have any return values. This is
 | |
| merely because they didn't need such things. To define a return value,
 | |
| the return value must be sent to the special variable @code{return}.
 | |
| @verbatim
 | |
| {/a,b/a b ! multiply = return;} = 2mul;
 | |
| 33 3 ! 2mul = 2mult;
 | |
| stdout 2mult ! write;
 | |
| @end verbatim
 | |
| The execution of a function does @strong{@emph{not}} stop when a value
 | |
| is assigned to @code{return}. This has both advantages and
 | |
| disadvantages.
 | |
| 
 | |
| Many things are almost impossible to do without the built-in
 | |
| functions. Some are completely impossible. @xref{Built-In}. As all
 | |
| objects in Enigma are pointers, several built-in functions actually
 | |
| modify the objects sent to them as arguments. To solve this problem, one
 | |
| must use the @code{clone} function.
 | |
| 
 | |
| 
 | |
| @node Conditionals, Loops, Functions, Language
 | |
| @section Conditionals
 | |
| Any value can be related to another value. 78 is less than 85. 2 equals
 | |
| 2. "Hi" is not "Bye". Enigma comes with a basic set of functions that
 | |
| can be used to test these relations. The functions @code{greater},
 | |
| @code{lesser}, @code{equal}, @code{not}, @code{or} and @code{and} are
 | |
| available. These functions return either true or false. To run a
 | |
| function on the condition that a relational function has returned true,
 | |
| use the function @code{act}.
 | |
| 
 | |
| While @code{lesser} and @code{greater} are aimed at numbers only,
 | |
| and @code{and}, @code{or} and @code{not} are aimed at booleans only,
 | |
| @code{equal} can be used on all objects. It tests for all equalities.
 | |
| 
 | |
| @verbatim
 | |
| 2 = a;
 | |
| 4 = b;
 | |
| 
 | |
| a 2 ! add | temp b ! equal = cond1;
 | |
| "47" ! num | temp 48 ! greater = cond2;
 | |
| 
 | |
| cond1 cond2 ! and | temp write stdout "4 = 4 and 47 > 48\n" ! act;
 | |
| cond1 cond2 ! or | temp write stdout "4 = 4 or 47 > 48\n" ! act;
 | |
| cond2 ! not | cond1 temp ! and | temp write stdout "4 = 4 and !(47 >
 | |
| 48)\n" ! act;
 | |
| @end verbatim
 | |
| 
 | |
| Even simpler, one can do this (though there's no real need for it):
 | |
| @verbatim
 | |
| # Instead of stdout "Hello" !write;
 | |
| true write stdout "Hello" !act;
 | |
| @end verbatim
 | |
| 
 | |
| 
 | |
| @node Loops, Undefined, Conditionals, Language
 | |
| @section Loops
 | |
| There are several ways to loop pieces of code in Enigma. One can create
 | |
| a function that calls itself, for example. It is, however, advised to
 | |
| use the @code{loop} function. 
 | |
| @verbatim
 | |
| # Infinite loop
 | |
| {stdout "Forever\n" ! write; true = return;} ! loop;
 | |
| @end verbatim
 | |
| @code{loop} works a bit like @code{act}, except that it runs on the
 | |
| premise of the return value of the function it calls. If it returns
 | |
| true, or any other value that can be considered true (non-zero numbers,
 | |
| non-empty strings, files, etc.), it runs the function again. If it
 | |
| returns false, the loop stops. It naturally runs the first time no
 | |
| matter what (no return value has been created yet).
 | |
| 
 | |
| 
 | |
| @node Undefined,  , Loops, Language
 | |
| @section Undefined behaviour
 | |
| Enigma is still new. The way built-in functions act, the way error
 | |
| messages appear, and the way some odd details of the language works are
 | |
| still undefined. In general, when something seems likely to work, it
 | |
| will work. But it's not necessarily defined to work.
 | |
| 
 | |
| 
 | |
| @node Future, Implementations, Language, Top
 | |
| @chapter Future aspects
 | |
| As Enigma is right now, it is quite limited. The only way that it can
 | |
| interact with the rest of one's system is by reading and writing files
 | |
| and by executing shell commands using the @code{system} built-in
 | |
| function. This obviously needs to be improved. A foreign function
 | |
| interface system must be implemented in version 0.2. It should be
 | |
| possible for Enigma to do everything C can.
 | |
| 
 | |
| The number of built-in functions seems reasonable, but it may be a good
 | |
| idea to implement a few more. These eventual functions should be focused
 | |
| on making things easier. Specifically, an import function should be
 | |
| considered. It is possible to create an import function in Enigma
 | |
| directly, but it's not exactly fast. Introducing a ``compile'' function
 | |
| should solve that.
 | |
| 
 | |
| 
 | |
| @node Implementations, Comparison, Future, Top
 | |
| @chapter Implementations
 | |
| @pindex enigma
 | |
| As of right now (beginning of June 2010) there is only one
 | |
| implementation. It is written in Java and is called enigma (with a
 | |
| lowercase e). The code is bulky and was not written by an experienced
 | |
| Java hacker. For v0.2 it may be a good idea to write the interpreter in
 | |
| C instead. Implementing a foreign function interface should be easier
 | |
| that way.
 | |
| 
 | |
| The current implementation can be downloaded at
 | |
| @url{http://metanohi.org/@/projects/@/enigma}.
 | |
| 
 | |
| 
 | |
| @node Comparison, Built-In, Implementations, Top
 | |
| @chapter Comparison with other languages
 | |
| @macro exmpl {lang,content}
 | |
| @quotation \lang\
 | |
| @cartouche
 | |
| @example
 | |
| \content\
 | |
| @end example
 | |
| @end cartouche
 | |
| @end quotation
 | |
| @end macro
 | |
| 
 | |
| 
 | |
| @menu
 | |
| * Compared assigning::          
 | |
| * Compared conditionals::       
 | |
| * Compared looping::            
 | |
| * Compared functions::          
 | |
| @end menu
 | |
| 
 | |
| 
 | |
| @node Compared assigning, Compared conditionals, Comparison, Comparison
 | |
| @section Assigning values
 | |
| @exmpl{C,type var = value;}
 | |
| @exmpl{Python,var = value}
 | |
| @exmpl{Enigma,value = var;}
 | |
| 
 | |
| 
 | |
| @node Compared conditionals, Compared looping, Compared assigning, Comparison
 | |
| @section Conditionals
 | |
| @exmpl{C,if ((a == 2 && b < 5) || (c != 4 && !d)) do_something();}
 | |
| @exmpl{Python,if (a == 2 and b < 5) or (c != 4 and not d):
 | |
| do_something()}
 | |
| @quotation Enigma
 | |
| @cartouche
 | |
| @example
 | |
| a 2 ! equal = cond-a;
 | |
| b 5 ! lesser = cond-b;
 | |
| c 4 ! equal ! not = cond-c;
 | |
| d ! not = cond-d;
 | |
| cond-a cond-b ! and = ncond-ab;
 | |
| cond-c cond-d ! and = ncond-cd;
 | |
| ncond-ab ncond-cd ! or = actcond;
 | |
| actcond do-something ! act;
 | |
| @end example
 | |
| @end cartouche
 | |
| @end quotation
 | |
| 
 | |
| 
 | |
| @node Compared looping, Compared functions, Compared conditionals, Comparison
 | |
| @section Looping
 | |
| @quotation C
 | |
| @cartouche
 | |
| @example
 | |
| while (thinking) run();
 | |
| 
 | |
| for (int i = 0; i < 18; i++) run(i);
 | |
| @end example
 | |
| @end cartouche
 | |
| @end quotation
 | |
| @quotation Python
 | |
| @cartouche
 | |
| @example
 | |
| while thinking: run()
 | |
| 
 | |
| for i in range(18): run(i)
 | |
| @end example
 | |
| @end cartouche
 | |
| @end quotation
 | |
| @quotation Enigma
 | |
| @cartouche
 | |
| @verbatim
 | |
| {!run; thinking ! clone = return;} ! loop;
 | |
| 
 | |
| 0 = i;
 | |
| {i ! run; i 1 ! add; i 18 ! equal = return;} ! loop;
 | |
| @end verbatim
 | |
| @end cartouche
 | |
| @end quotation
 | |
| 
 | |
| 
 | |
| @node Compared functions,  , Compared looping, Comparison
 | |
| @section Functions
 | |
| @quotation C
 | |
| @cartouche
 | |
| @verbatim
 | |
| int time(float space) {
 | |
|     return (int) space / 3;
 | |
| }
 | |
| 
 | |
| t = time(81.65);
 | |
| @end verbatim
 | |
| @end cartouche
 | |
| @end quotation
 | |
| @quotation Python
 | |
| @cartouche
 | |
| @example
 | |
| def time(space):
 | |
|     return int(space / 3)
 | |
| 
 | |
| t = time(81.65)
 | |
| @end example
 | |
| @end cartouche
 | |
| @end quotation
 | |
| @quotation Enigma
 | |
| @cartouche
 | |
| @verbatim
 | |
| {/space/space 3 ! divide ! clone ! round = return;} = time;
 | |
| 
 | |
| 81.65 ! time = t;
 | |
| @end verbatim
 | |
| @end cartouche
 | |
| @end quotation
 | |
| 
 | |
| 
 | |
| @node Built-In, Copying This Manual, Comparison, Top
 | |
| @chapter Built-in values and functions
 | |
| 
 | |
| 
 | |
| @menu
 | |
| * Built-In values::             
 | |
| * Built-In functions::          
 | |
| @end menu
 | |
| 
 | |
| 
 | |
| @node Built-In values, Built-In functions, Built-In, Built-In
 | |
| @section Values
 | |
| @cindex built-in values
 | |
| The following variables are special and can be accessed anytime. They can
 | |
| even be overwritten.
 | |
| @verbatim
 | |
| args, return, temp, stdin, stderr, stdout, zero, true, false, none, @pi,
 | |
| @e, cwd, cpd, fnm
 | |
| @end verbatim
 | |
| @code{zero} is a fake writable file that does nothing. @code{none} is an
 | |
| abstract variable with an internal value of.. none. @code{@@pi} is
 | |
| Pi. @code{@@e} is Euler's number. @code{cwd} is the directory from which
 | |
| Enigma is run, @code{cpd} is the directory in which the current program
 | |
| file resides, and @code{fnm} is the filename of the current program
 | |
| file. The rest are self-explanatory --- and @code{args}, @code{return}
 | |
| and @code{temp} are extra special.
 | |
| 
 | |
| 
 | |
| @node Built-In functions,  , Built-In values, Built-In
 | |
| @section Functions
 | |
| @cindex built-in functions
 | |
| @macro func {param}
 | |
| @noindent @code{\param\}
 | |
| @end macro
 | |
| Enigma has few built-in functions. But they do exist.
 | |
| 
 | |
| @func{str(OBJECT...)}: Converts all supplied values to strings.
 | |
| 
 | |
| @func{num(OBJECT...)}: Converts all supplied values to numbers.
 | |
| 
 | |
| @func{list(OBJECT...)}: Puts all supplied values in a list and destroys
 | |
| nested lists at one level.
 | |
| 
 | |
| @func{bool(OBJECT...)}: Converts all supplied values to booleans.
 | |
| 
 | |
| @func{code(OBJECT...)}: Converts all supplied values to code strings.
 | |
| 
 | |
| @func{repr(OBJECT...)}: Converts all supplied values to representational
 | |
| strings. Strings get prepended and appended by " characters, code
 | |
| objects are surrounded by @{ and @}, and so on.
 | |
| 
 | |
| @func{type(OBJECT...)}: Converts all supplied values to type strings
 | |
| (string, number, file, etc.).
 | |
| 
 | |
| @func{len(OBJECT...)}: Converts all supplied values to their length. This
 | |
| can be used for both strings and lists.
 | |
| 
 | |
| @func{clone(OBJECT...)}: Clones all supplied values. When an object is
 | |
| cloned, its value is assigned to a new variable. The list of clones is
 | |
| returned.
 | |
| 
 | |
| @func{slice(LIST|STRING, NUMBER, NUMBER)}: Returns a list value sliced
 | |
| according to the first and second number if the first variable is a
 | |
| list variable, or a substring if the first variable is a string
 | |
| variable.
 | |
| 
 | |
| @func{loop(FUNCTION, [OBJECT]...)}: Executes function until it returns
 | |
| false. Sends the rest of the specified variables (if any) to the
 | |
| function as arguments.
 | |
| 
 | |
| @func{open(STRING, STRING)}: Opens the file by the name of the first
 | |
| string, using the second string as its guide as to how it should be
 | |
| opened. "r" means to read, "w" means to write, and "a" means to
 | |
| append. Returns a file object.
 | |
| 
 | |
| @func{close(FILE...)}: Closes files.
 | |
| 
 | |
| @func{read(FILE)}: Reads one character of a file and returns it. If no
 | |
| more characters are present, an empty string is returned.
 | |
| 
 | |
| @func{write(FILE, STRING)}: Writes a string to a file.
 | |
| 
 | |
| @func{greater(NUMBER, NUMBER...}: Checks if the first number is
 | |
| greater than the rest and returns true or false.
 | |
| 
 | |
| @func{lesser(NUMBER, NUMBER...}: Checks if the first number is
 | |
| lesser than the rest and returns true or false.
 | |
| 
 | |
| @func{equal(OBJECT, OBJECT...}: Checks if the objects are equal and returns
 | |
| true or false.
 | |
| 
 | |
| @func{and(BOOLEAN...)}: Checks if all booleans are true and returns true
 | |
| or false.
 | |
| 
 | |
| @func{or(BOOLEAN...)}: Checks if at least one boolean is true and returns
 | |
| true or false.
 | |
| 
 | |
| @func{not(BOOLEAN...)}: Converts values of true to values of false, and
 | |
| vice-versa.
 | |
| 
 | |
| @func{act(BOOLEAN, FUNCTION, [OBJECT]...)}: Run the function with the
 | |
| optional objects as arguments if the boolean is true.
 | |
| 
 | |
| @func{system(STRING...)}: Join the strings and run the result as a
 | |
| system command.
 | |
| 
 | |
| @func{add(NUMBER|STRING|CODE|LIST...)}: Add objects together. Numbers, strings, code
 | |
| strings and lists can be used, but only with similar types. The type
 | |
| of the first object determines what types the rest must be. The result
 | |
| is stored in the first object and also returned.
 | |
| 
 | |
| @func{subtract(NUMBER...)}: Subtract numbers from each other. The
 | |
| first object receives the final number. It is also returned.
 | |
| 
 | |
| @func{multiply(NUMBER...)}: Multiply numbers with each other. The
 | |
| first object receives the final number. It is also returned.
 | |
| 
 | |
| @func{divide(NUMBER...)}: Divide numbers with each other. The
 | |
| first object receives the final number. It is also returned.
 | |
| 
 | |
| @func{mod(NUMBER, NUMBER)}: Finds the remainder of the first number
 | |
| divided with the second number and returns it as a new variable.
 | |
| 
 | |
| @func{pow(NUMBER, NUMBER)}: Returns first number^second number.
 | |
| 
 | |
| @func{log(NUMBER, [NUMBER])}: Returns the logarithm of the first
 | |
| number. If the second number is not specified, the natural logarith is
 | |
| used.
 | |
| 
 | |
| @func{random()}: Returns a random number between 0 and 1.
 | |
| 
 | |
| @func{abs(NUMBER...)}: Sets and returns absolute values of numbers.
 | |
| 
 | |
| @func{round(NUMBER, NUMBER)}: Rounds the first number with x decimals,
 | |
| where x is the second number.
 | |
| 
 | |
| @func{floor(NUMBER, NUMBER)}: Floors the first number with x decimals,
 | |
| where x is the second number.
 | |
| 
 | |
| @func{ceil(NUMBER, NUMBER)}: "Ceils" the first number with x decimals,
 | |
| where x is the second number.
 | |
| 
 | |
| @func{sin(NUMBER...)}: Sets and returns sine values.
 | |
| 
 | |
| @func{cos(NUMBER...)}: Sets and returns cosine values.
 | |
| 
 | |
| @func{tan(NUMBER...)}: Sets and returns tangent values.
 | |
| 
 | |
| @func{asin(NUMBER...)}: Sets and returns arcsine values.
 | |
| 
 | |
| @func{acos(NUMBER...)}: Sets and returns arccosine values.
 | |
| 
 | |
| @func{atan(NUMBER...)}: Sets and returns arctangent values.
 | |
| 
 | |
| @func{sinh(NUMBER...)}: Sets and returns hyperbolic sine values.
 | |
| 
 | |
| @func{cosh(NUMBER...)}: Sets and returns hyperbolic cosine values.
 | |
| 
 | |
| @func{tanh(NUMBER...)}: Sets and returns hyperbolic tangent values.
 | |
| 
 | |
| 
 | |
| @node Copying This Manual, Index, Built-In, Top
 | |
| @appendix GNU Free Documentation License
 | |
| @include fdl.texi
 | |
| @node Index,  , Copying This Manual, Top
 | |
| @unnumbered Index
 | |
| @printindex cp
 | |
| @bye
 | 
