varaq-wasm-c/docs/varaqspec.html

919 lines
28 KiB
HTML
Raw Permalink Normal View History

2023-02-04 14:06:00 -05:00
<title>var'aq Interim Specification 2 January 2001</title>
<h1><i>var'aq</i> Preliminary Specification</h1><br>
<i><a href="mailto:connorbd@yahoo.com">Brian Connors</a><br>
29 May 2000<br>
last updated 02 January 2001</i>
<hr>
<h3>0 Introduction</h3><p>
This specification documents the
programming language <i>var'aq</i>. <i>var'aq</i> is a programming
language created as part of an exercise to imagine the hacker culture of
<a href="http://www.startrek.com">Star Trek's</a> Klingon race. The
Klingon culture was chosen because it is probably the best-realized of all
such cultures in the Science Fiction/Fantasy genres of literature, and the
Klingon language is sufficiently different from English to make language
design a significant challenge. <p>
<h4>0.1 Language Levels</h4> <p>
<i>var'aq</i> is divided into three implementation levels, each a subset
of its successor. An implementation conforming to the current
<i>var'aq</i> spec should be labeled with the level of conformance.<p>
<ul>
<li><b>Level 0</b> -- The focus of this preliminary spec, a Level 0
<i>var'aq</i> implementation minimally contains all operators and data
structures listed in this specification. Level 0 covers all basic
mathematical, relational, and logical operators and a minimal set of
Turing-complete control constructs and I/O operators. A Level 0
implementation does not necessarily have to be written in Klingon, but
if not an external Klingon-to-English translation filter is required.
<li><b>Level 1</b> -- <B>NOT YET DOCUMENTED</b> -- A Level 1
implementation constitutes a full text-mode implementation of
<i>var'aq</i>, including basic concurrency support, stream-based
file I/O, support for the
<i>var'aq</i> Standard MPI Binding (not yet available), and full support
for Klingon-language constructs. Also includes support for packages
(<i>jangwI'ghom</i>).
<li><b>Level 2</b> -- <B>NOT YET DOCUMENTED</b> -- A Level 2
implementation has all of the above, as well as package support, virtual
device support
(minimally, printer, framebuffer, and network connection as well as
console), and is suitable for use as a scripting or systems programming
language. A POSIX binding is optional but highly recommended.
</ul>
<p>
<h3>0.2 Legalese, Credit, Etc.</h3><p>
<i>var'aq</i> was concieved by <a href="mailto:connorbd@yahoo.com">Brian
Connors</a> and implemented by Brian with help from <a
href="http://www.catseye.mb.ca">Chris Pressey</a> and <a
href="mailto:mark@kli.org">Mark Shoulson</a>. It is an independent
project and is not connected with the <a
href="http://www.startrek.com">Star Trek</a> people (i.e.
Paramount/Viacom).<p>
This document is (c)2000-2001 Brian Connors and may be distributed freely as
long as this copyright notice is retained. You may freely implement for
private use a <i>var'aq</i> implementation with no restriction; you must
contact me for certification (i.e. I make sure you're following the spec)
in order to distribute your implementation as freeware. This specification
may not be used for commercial purposes without a separate licensing
arrangement.<p>
<h3>0.3 Apologies</h3><p>
You'll notice that I tend to drift in and out of character in this document.
The only thing I can say to this is that character isn't a great concern in a
specification document; I may do an extensive revision later on, but as I
write this <i>var'aq</i> isn't even alpha-quality code, and the spec is
subject to change anyway. Just enjoy and try to keep up; we'll worry about
"realism" later. Thank you for your patience.<p>
<h3>1 Language Overview</h3><p>
<i>var'aq</i> is a stack-based, RPN programming language with points of
similarity to Lisp, Forth, and PostScript. It is more of a functional
language than an imperative (Algol-like) language; most operations are
dependent on the stack and bypass the local variable store altogether. <p>
<h4>1.1 Notation Used In This Specification</h4><p>
All operator names will be given in English and Klingon. The notation and
format of the operator entries are cribbed from <a
href="http://www.adobe.com">Adobe's</a> PostScript Language
Specification.<p>
<h4>1.2 Basic Concepts</h4><p>
<i>var'aq</i> is a fairly simple, RPN-based language where pretty much
everything is an operator. It is fairly loosely typed and little
distinction is made between code and data. Typechecking is not strictly
required (and in fact does not exist in the current reference
implementation) but is encouraged.<p>
<h4>1.3 Data Types</h4><p>
<i>var'aq</i> recognizes only a few data types so as to keep the programming
model as simple as possible. <p>
<h4>1.3.1 number/mI'</h4><p>
<i>var'aq</i> numbers are a bit nonspecific as to representation; there is no
support for complex numbers in a Level 0 implementation (Level 1 and above do
include support). In general, integers (<i>HabmI'</i>) and reals are
considered interchangeable where possible, and the interpreter is expected to
use whichever is more efficient. Note that integer operations such as
<b>Habwav</b> and the bitwise operators will generally silently truncate the
operands (optionally giving a runtime warning if so requested by the user).<p>
<h4>1.3.2 function/jangwI'</h4><p>
A function in <i>var'aq</i> is understood to be much the same thing as a
lambda closure, i.e. a procedure with a return value (thus the Klingon term
jangwI', meaning "answerer"). Functions are defined using the <b>{ }</b>
operators, and may be assigned names using the <b>pong</b> operator.<p>
<h4>1.3.3 list/ghomHom</h4><p>
<i>var'aq</i> lists (<i>ghomHom</i>, meaning "cluster" (sort of)) are in some
ways very similar to those of Lisp. <p>
<h4>1.3.4 string/tlhegh</h4><p>
Strings in <i>var'aq</I> (and Klingon programming in general) seem to be
considered something of a black art; Klingon computer science appears to have
no real concept of anything like regular expressions, and as a result decent
string handling is the territory of those trusted to write things like
language compilers (ngoq poSmoH? The idea would baffle a Klingon... so
insecure, so random...). Brute-force string comparisons seem to be the order
of the day in current practice. That said, <i>var'aq</i> strings also have a
couple of important properties: a) white space is not significant; b) they can
be decomposed into lists using the <b>joq</b> operator; and c) they can be
used as literal names (though it's not a terribly good idea).
<h4>1.4 Basic Assumptions</h4><p>
<h4>1.4.1 Number Representations</h4><p>
All standard <i>var'aq</i> systems are assumed to be binary machines using
eight or sixteen-bit bytes (word size is unimportant). Negative integer
values are represented as two's-complement. A floating-point implementation is
not specified, though the Klingon floating-point standard is not drastically
different from IEEE floating point (differing bit positions, primarily). If a
standard float must be chosen, go with IEEE double-precision.<p>
<h4>1.4.2 Garbage Collection</h4><p>
All <i>var'aq</i> implementations are required to use garbage collection
(<i>woDHa'</i>, roughly meaning "retrieve" or "unwaste"). No standard
algorithm is specified, and this requirement may be ignored if the implementor
uses an environment where this is assumed (Perl, for example).<p>
<h4>1.4.3 Filetypes</h4><p>
Klingon military computer systems use a sort of modular-database storage
scheme in which the concept of "file" doesn't mean a whole lot. However, on
systems where files are the common way of doing business, the following
extensions and MIME types are standard:<p>
<ul>
<li><b>.vq -- application/varaq</b> -- a standard <i>var'aq</i> source file
<li><b>.vqe -- application/varaq-engl</b> -- an English-keyword
<i>var'aq</i> source file
<li><b>.vql -- application/vqlib</b> -- a <i>var'aq</i> library source file
<li><b>.vqx -- application/vqexe</b> -- a <i>var'aq</i> executable resource
file
</ul>
Note that this is being specified here mainly as a matter of convenience. The
<i>var'aq</i> resource file format has not yet been defined.<p>
<h3>2 Language Basics</h3><p>
This section describes the fundamental <i>var'aq</i> language constructs
and data types. <p>
<h4>2.1 Stack Operations</h4><p>
These operations directly manipulate the <i>var'aq</i> operand stack. The
operand stack can hold any of four kinds of data: numbers (real or
integer), strings, functions, or arrays. It is best described as
"translucent", similar to the transparent stack of Forth or PostScript but
somewhat more restricted. The internal data representation of the stack is
not available to the programmer. <p>
<h4>2.1.1 pop/woD</h4><p>
<i>obj <b>woD</b> -</i><p>
Pops and discards the top item on the stack. The literal meaning is
<i>discard</i>.<p>
Errors: stackUnderflow<p>
<h4>2.1.2 dup/latlh</h4><p>
<i>obj <b>latlh</b> obj obj</i><p>
Duplicates the top object on the stack.<p>
Errors: stackUnderflow<p>
<h4>2.1.3 exch/tam</h4><p>
<i>obj1 obj2 <b>tam</b> obj2 obj1</i><p>
Inverts the order of the top two objects on the stack. <p>
Errors: stackUnderflow<p>
<h4>2.1.4 clear/chImmoH</h4><p>
<i>... obj <b>chIm</b> -</i><p>
Empties the stack.<p>
Errors: none<p>
<h4>2.1.5 remember/qaw</h4><p>
<i>- <b>qaw</b> flag</i><p>
Puts a flag (like PostScript's <b>mark</b>) on the stack. The internal
representation of the flag is not available to the programmer. <p>
Errors: none<p>
<h4>2.1.6 forget/qawHa'</h4><p>
<i>... flag ... <b>qawHa'</b> ...</i><p>
Clears the stack down to the flag and pops the flag. If there is no flag
present, the stack is emptied completely.<p>
Errors: none<p>
<h4>2.1.7 dump/Hotlh (lit. scan)</h4><p>
<i>... <b>Hotlh</b> ...</i><p>
Prints the contents of the operand stack to STDOUT without changing them.
<i>Note</i>: the <i>Hotlh</i> operator is a debugging operator and is not
intended for use in programs; it is merely documented here because it
might be useful to a <i>var'aq</i> developer. In particular, the output
format of this operator is implementation-defined and will not be
specified in this document. <i>Hotlh</i> may be redefined to take such
arguments as the implementor feels appropriate.<p>
Errors: implementation-defined.
<h4>2.2 Data/Code Operations</h4><p>
<i>var'aq</i>, like many similar languages, does not distinguish between
code and data. These operations include operators to associate names with
objects and executable procedures, as well as operators to define and
manage data structures. Note that variables and procedures live in a
common namespace, since the act of pushing the content of a variable is
essentially the same as executing the variable's name.<p>
<h4>2.2.1 ~ (quote/lI'moH)</h4><p>
<i>- <b>~ obj</b> obj</i><p>
The ~ operator is a special form, as it is not a
postfix operator. When the interpreter encounters a ~, it pushes the next
token on the stack as is regardless of whether it is a defined name.
(Attempting to push an undefined name without a ~ will generate an
undefinedName error.)<p>
The literal meaning of this operator's name is "make useful".
Errors: none<p>
<h4>2.2.2 { </h4><p>
Begins the creation of an anonymous procedure. The process is
implementation-dependent.<p>
<h4>2.2.3 }</h4><p>
<i>- <b>}</b> proc</i><p>
Completes procedure construction and pushes a reference to the completed
procedure on the stack. Does not execute the procedure.<p>
Errors: noDefinedProc
<h4>2.2.4 name/pong</h4><p>
<i>obj id <b>pong</b> -</i><p>
Associates <i>obj</i> with <i>id</i> and places it in the system lookup
space. Conventionally used to associate new operator names with procedure
objects.<p>
Example: <i>~ add3 { chel chel cha' } pong</i> <p>
Pushes the name <i>add3</i> and a procedure object on the stack, then
binds the name to the procedure. <p>
Errors: stackUnderflow, noDefinedProc<p>
<h4>2.2.5 set/cher</h4><p>
<i>obj id <b>cher</b> -</i><p>
Reassigns the value of a value already in the system lookup space. Used
primarily for variable assignments.<p>
Errors: stackUnderflow, noSuchName<p>
<h4>2.2.6 (* ... *) (comment)</h4><p>
Marks a comment in a program. All such comments are treated as single tokens
and ignored.<p>
<h4>2.2.7 //<i>name</i></h4><p>
Causes the interpreter to import a file with the name <i>name</i>.vql and
execute it as if it is part of the currently executing program. This can be
handled by an external static linker if there is no shlib-like facility in the
interpreter. Essentially equivalent to <code>#include</code> in C. <p>
<h4>2.3 Control Flow</h4><p>
<i>var'aq</i> supports a small but sufficient supply of conditional and
iterative operators. <p>
<h4>2.3.1 ifyes/HIja'chugh</h4><p>
<i>bool proc <b>HIja'chugh</b> -</i><p>
Pops the proc object off the stack, then evaluates the boolean. If it's
true, the proc object is evaluated; otherwise, it's thrown out. <p>
Errors: stackUnderflow, noDefinedProc<p>
<h4>2.3.2 ifno/ghobe'chugh</h4><p>
<i>bool proc <b>ghobe'chugh</b> -</i><p>
Similar to <i>HIja'chugh</i> above, but executes proc only if bool is false.
<p>
Errors: stackUnderFlow, noDefinedProc<p>
<h4>2.3.3 choose/wIv</h4><p>
<i>bool <b>wIv</b> bool bool</i><p>
Duplicates a boolean value on top of the stack. Allows paired
HI'ja'chugh/ghobe'chugh clauses.<p>
<b>Note:</b> To the untrained eye, it may seem as though wIv and latlh are
identical. This is true in the reference implementation, but may not be in any
version that actually does some level of type checking. This bit of
syntactic sugar should never be relied upon; always use wIv in this
situation.<p>
<h4>2.3.4 eval/chov</h4><p>
<i>proc <b>chov</b> -</i><p>
Pops a proc object off the stack and executes it.<p>
Errors: stackUnderflow, noDefinedProc<p>
<h4>2.3.5 escape/nargh</h4><p>
<i>bool <b>nargh</b> -</i><p>
Exit the current procedure. Useful for exit conditions on
loops. Will terminate the current session if used top-level.<p>
<h4>2.3.6 repeat/vangqa'</h4><p>
<i>val proc <b>vangqa'</b> -</i><p>
Pops val and proc off the stack and executes proc val times. <p>
<h4>2.4 List Operations</h4><p>
<i>var'aq</i> supports a series of operators for management of lists
(<i>ghomHom</i>, which seems to mean something like "cluster"). These
primitives are the language's primary way of managing aggregate objects and
work much like similar operators in LISP; a more sophisticated paradigm, such
as OO extensions or the like, can be built with these operators.<p>
Note that "objects" as they stand in <i>var'aq</i> are largely singletons as
in JavaScript; there is no inherent concept of object-orientation or anything
like it in standard <i>var'aq</i>.
<h4>2.4.1 (</h4><p>
Begins a list definition.<p>
<h4>2.4.2 ) </h4><p>
<i>( item1 item2 ... <b>)</b> list </i><p>
Creates a list and pushes it onto the stack.<p>
<h4>2.4.3 split/SIj</h4><p>
<i>list <b>SIj</b> item1 list</i><p>
Pops a list off the stack and returns the first item and the rest of the
list.<p>
<h4>2.4.4 cons/muv</h4><p>
<i>list item1 ... <b>muv</b> list</i><p>
Takes an object and adds it to the head of a list. Equivalent to the LISP
<b>cons</b> operator.
<h4>2.4.5 shatter/ghorqu'</h4><p>
<i>list <b>ghorqu'</b> item1 item2 ...</i><p>
Reduces a list to its component elements and pushes them on the stack in
order. <p>
<b>Note:</b> The precise meaning of the construction <i>ghorqu'</i> is
a bit obscure; the rendering <i>shatter</i> is idiomatic and may derive from a
nonstandard dialect. Standard Klingon would generally prefer <i>jor</i>,
meaning <i>explode</i>.)<p>
<h4>2.4.6 empty?/chIm'a'</h4><p>
<i>list <b>chIm'a'</b> bool</i><p>
Examines a list on the stack and returns 1 if its value is null (<i>pagh</i>),
a 0 if it contains anything.
<b>Note:</b> some implementations also have an
operator known as bite/<i>chop</i>, equivalent to the Lisp <i>cdr</i>. This is
not required in any standard <i>var'aq</i> implementation and can easily be
rendered by the function<p>
<pre><code>
~ chop { SIj woD } pong
</pre></code><p>
<h4>2.5 String Operators<br>
<i>tlheghjangwI'mey</i></h4><p>
String handling in <i>var'aq</i> is generally thought to be somewhat
deficient by Earth standards; all strings are handled as if whitespace is not
significant, and string management is a bit primitive. Substrings are
understood, as are very basic forms of pattern matching, but Klingon computer
science seems to regard string-handling facilities such as regular expressions
as something of a black art, left only to those responsible for writing
compilers and that sort of thing. <p>
<h4>2.5.1 strtie/tlheghrar</h4><p>
<i>str1 str2 <b>tlheghrar</b> str3</i><p>
Concatenates the top two strings on the stack into one.<p>
<h4>2.5.2 compose/naQmoH</h4><p>
<i>mark str1 str2 ... strn <b>naQmoH</b> strn'</i><p>
Pops objects (executing proc objects if necessary) off the stack until a
marker (placed by <b>qaw</b>) is hit and combines them into one string.
<h4>2.5.3 streq?/tlheghrap'a'</h4><p>
<i>str1 str2 <b>tlheghrap'a'</b> bool</i><p>
Pops the top two strings on the stack, compares them, and returns 1 if
identical, 0 if not.
<h4>2.5.4 strcut/tlheghpe'</h4><p>
<i>str startval endval <b>tlheghpe'</b> substr</i><p>
Pops two values and a string and returns the section of the string between
character <i>startval</i> and character <i>endval</i>.<p>
<h4>2.5.5 strmeasure/tlheghjuv</h4><p>
<i>str <b>tlheghjuv</b> val</i><p>
Pops a string off the stack and returns its length in characters. <p>
<h4>2.5.6 explode/jor</h4><p>
<i>str <b>jor</b> list</i><p>
Separates individual "words" in a string by whitespace.<p>
<h3>3 Mathematical Operators<br>
<i>mI'jangwI'mey</i></h3><p>
Klingon mathematical study is somewhat less sophisticated than Federation
standard, but it covers all the important concepts. A full set of arithmetic
and basic trigonometric operations is available. <p>
<h4>3.1 Arithmetic Operations<br>
<i>toghwI'mey</i></h4><p>
Arithmetic operators usually work with real numbers unless otherwise
stated. The number operators (sec 3.3) can convert them to integers if
necessary.<p>
<i>(note: verisimilitude would require that the Klingon understanding of
math not necessarily coincide with ours. But I think it's safe to say that
this basic set of operations is enough to at least get a Klingon
battlecruiser out of spacedock.)</i><p>
<h4>3.1.1 add/boq</h4><p>
<i>a b <b>boq</b> sum</i><p>
Pops the top two values on the stack and replaces them with their sum.<p>
Note that the four basic operations are based around the term <i>boq</i>,
which literally means "to ally with". The metaphor is a bit strained but
is well-established enough that most Klingons do not think twice about it.<p>
<h4>3.1.2 sub/boqHa'</h4><p>
<i>a b <b>boqHa'</b> difference</i><p>
Pops the top two values on the stack and replaces them with a - b.<p>
<h4>3.1.3 mul/boq'egh</h4><p>
<i>a b <b>boq'egh</b> product</i><p>
Pops the top two values on the stack and replaces them with their
product.<p>
<h4>3.1.4 div/boqHa''egh</h4><p>
<i>a b <b>wav</b> quotient</i><p>
Pops the top two values on the stack and replaces them with a/b.<p>
<h4>3.1.5 idiv/HabboqHa''egh (lit. full-divide)</h4><p>
<i>a b <b>HabboqHa''egh</b> quotient</i><p>
Pops the top two values on the stack and replaces them with the results
of an integer division operation.<p>
<h4>3.1.6 mod/chuv (lit. leftover)</h4><p>
<i>a b <b>chuv</b> remainder</i><p>
Pops the top two values and returns the remainder of a mod b.<p>
<h4>3.1.7 pow/boqHa'qa' (lit. remultiply)</h4><p>
<i>base exp <b>boqHa'qa'</b> real</i><p>
Pops the top two values and returns base^exp.<p>
<h4>3.1.8 sqrt/loS'ar (lit. fourth-howmuch)</h4><p>
<i> angle <b>loS'ar</b> real </i><p>
Returns the square root of val.<p>
<h4>3.1.9 add1/wa'boq</h4><p>
<i>a <b>wa'boq</b> a+1</i><p>
Increments the top value on the stack by one.<p>
<h4>3.1.10 sub1/wa'boqHa'</h4><p>
<i>a <b>wa'boqHa'</b> a-1</i><p>
Decrements the top value on the stack by one.<p>
<h4>3.2 Trigonometric and Logarithmic Operators<br>
<i>SIHpojjangwI'mey 'ej ghurjangwI'mey</i></h4><p>
The standard Klingon unit of arc measure is the vatlhvI' (hundredth-part),
which is the same term used for percentage. However, Klingon
mathematicians are familiar with the concept of radians (botlhchuq,
center-distance) and all known <i>var'aq</i> implementations work in
radians for input and output.<p>
<h4>3.2.1 sin/joq (lit. wave)</h4><p>
<i>angle <b>joq</b> real</i><p>
Returns the sine of val.<p>
<h4>3.2.2 cos/joqHa' (lit. counter-wave)</h4><p>
<i>angle <b>joqHa'</b> cos(val)</i><p>
Returns the cosine of val.<p>
<h4>3.2.3 tan/qojmI' (lit. cliffnumber)</h4><p>
<i>angle <b>qojmI'</b> tan(val)</i><p>
Returns the tangent of val.<p>
<h4>3.2.4 atan/qojHa' (lit. anticliff)</h4><p>
<i>num den <b>qojHa'</b> angle</i><p>
Returns the arctangent of <i>num / den</i>.<p>
<h4>3.2.5 ln/ghurtaH</h4><p>
<i>num <b>ghurtaH</b> real</i><p>
Returns the natural log of <i>num</i>.
<h4>3.2.6 log/maHghurtaH</h4><p>
<i>num <b>maHghurtaH</b> real</i><p>
Returns the base 10 log of <i>num</i>.<p>
<h4>3.2.7 log3/wejghurtaH</h4></i><p>
<i>num <b>wejghurtaH</b> real</i><p>
Returns the base 3 log of <i>num</i>. (This function is actually
considered a level 1 function, and is believed to exist only for
historical purposes. Its use is very rare except among programmers whose
native language is Standard High Klingon (which historically used a base 3
number system) and is unknown among other users.)
<h4>3.3 Numerical Operators and Constants</h4><p>
This section describes operators that operate on numbers themselves, as
well as common system-level constants. (Note that some of these
functions look like verbs in English and adjectives in Klingon; the
idea is that where we might say <i>1.3 clip</i> to get 1 a Klingon
would be thinking <i>the clipped 1.3</i>.<p>
<h4>3.3.1 clip/poD</h4><p>
<i>real <b>poD</b> int</i><p>
Removes the fractional portion of a real number (equivalent to
floor(real).<p>
<h4>3.3.2 smooth/Hab (lit. smooth)</h4><p>
<i>real <b>Hab</b> int</i><p>
Rounds a number to the nearest integer.<p>
<h4>3.3.3 howmuch/'ar</h4><p>
<i>num <b>'ar</b> num2</i><p>
Returns the absolute value of <i>num</i>.<p>
<h4>3.3.4 setrand/mIScher</h4><p>
<i>num <b>mIScher</b> -</i><p>
Sets the random number generator seed value to <i>num</i>. Not common,
since most <i>var'aq</i> implementations have a rather arcane formula for
picking a pseudo-random seed value (security reasons, presumably).<p>
<h4>3.3.5 rand/mIS</h4><p>
<i>num <b>mIS</b> real</i><p>
Returns a random real number in the range 0 to <i>num</i>. If there is no
meaningful input on the stack,
<h4>3.3.6 pi/HeHmI'</h4><p>
Pushes the value pi (~3.14159...) onto the stack. The Klingon name
literally means "edge-number".<p>
<h4>3.3.7 e/ghurmI' </h4><p>
Pushes the value e onto the stack. The Klingon name literally means
"growth-number".<p>
<h4>3.3.8 int?/HabmI''a'</h4><p>
<i>val <b>HabmI''a'</b> bool</i>
Pops the top value on the stack and returns 1 if it is an integer, 0 if
not.<p>
<h4>3.3.9 number?/mI''a'</h4><p>
<i>val <b>mI''a'</b> bool</i><p>
Pops the top value off the stack and returns 1 if it's a number, 0 if it's
something else.
<h4>3.3.10 numberize/mI'moH</h4><p>
<i>str <b>mi'moH</b> val</i><p>
Pops a string off the stack, converts it into a numerical value, and returns
it.<p>
<h4>3.4 Bitwise operators</h4><p>
Though <i>var'aq</i> makes no clear distinction between integers and reals, it
is nevertheless useful to be able to manipulate a number on the bit level. The
following operators assume that their operands will always be treated as
integers; effects on floating-point values are undefined, and may be
disallowed at the implementor's discretion.<p>
<b>Note:</b> The <i>var'aq</i> bitwise operators are quite controversial as of
this writing (they are considered inappropriately low-level) and may be
removed or altered in future versions of this specification.<p>
It is to be noted that the Klingon coinages for the operation (especially
<i>tlhoch</i> (contradict) for xor) are unusually obscure even for Klingon
hackerspeak and probably reflect fairly profound differences in shades of
meaning.<p>
<h4>3.4.1 isolate/mobmoH</h4><p>
<i>a b <b>mobmoH</b> result</i><p>
Performs a bitwise AND on a and b.<p>
<h4>3.4.2 mix/DuD</h4><p>
<i>a b <b>DuD</b> result</i><p>
Performs a bitwise OR on a and b.<p>
<h4>3.4.3 contradict/tlhoch</h4><p>
<i>a b <b>tlhoch</b> result</i><p>
Performs a bitwise XOR on a and b.<p>
<h4>3.4.4 compl/Qo'moH</h4><p>
<i>val <b>Qo'moH</b> ~val</i><p>
Returns the one's-complement of val. <b>Note:</b> The literal meaning is
something like "make it say no".<p>
<h4>3.4.5 shiftright/nIHghoS</h4><p>
<i>a b <b>nIHghoS</b> result</i><p>
Shifts a right b places, preserving the sign of the value.<p>
<h4>3.4.6 shiftleft/poSghoS</h4><p>
<i>a b <b>poSghoS</b> result</i><p>
Shifts a left b places.<p>
<h3>4 Relational and Logical Operators</h3><p>
<h4>4.1 Relational Operators and Predicate Functions<br>
<i>yu'jangwI'mey</i></h4><p>
The standard convention for anything that returns a boolean argument is to
end the keyword in the interrogative suffix <i>-'a'</i>, which in general
is analogous to Lisp's well-established -p (plain old Lisp) or -? (Scheme
and Dylan) predicate conventions; the English versions of the keywords
follow the Scheme convention for consistency with the Klingon. The
<i>tlhIngan Hubbeq Say'ghun'ogh
paq</i> (KDF Programmer's Style Guide) requires this convention; see that
document for further information.<p>
<h4>4.1.1 gt?/law''a'</h4><p>
<i>a b <b>law''a'</b> bool</i><p>
Pops a and b off the stack, compares them, and returns a boolean value of
true if a is larger.<p>
<h4>4.1.2 lt?/puS'a'</h4><p>
<i>a b <b>puS'a'</b> bool</i><p>
Pops a and b off the stack, compares them, and returns a boolean value of
true if a is smaller.<p>
<h4>4.1.3 eq?/rap'a'</h4><p>
<i>a b <b>rap'a'</b> bool</i><p>
Pops a and b off the stack, compares them, and returns a boolean value of
true if a is the same as b.<p>
<h4>4.1.4 ge?/law'rap'a'</h4><p>
<i>a b <b>law'rap'a'</b> bool</i><p>
Pops a and b off the stack, compares them, and returns a boolean value of
true if a is greater than or equal to b.<p>
<h4>4.1.5 le?/puSrap'a'</h4><p>
<i>a b <b>puSrap'a'</b> bool</i><p>
Pops a and b off the stack, compares them, and returns a boolean value of
true if a is less than or equal to b.<p>
<h4>4.1.6 ne?/rapbe'a'</h4><p>
<i>a b <b>rapbe'a'</b> bool</i><p>
Pops a and b off the stack, compares them, and returns a boolean value of
true if a is not equal to b.<p>
<h4>4.1.7 null?/pagh'a'</h4><p>
<i>obj <b>pagh'a'</b> bool</i><p>
Examines the top object on the stack and returns a 1 if null, a 0 if not.<p>
<h4>4.1.8 negative?/taH'a'</h4>
<i>val <b>taH'a'</b> bool</i><p>
Pops the top number on the stack and returns a 1 if less than 0, a 0 if
not.<p>
<h4>4.2 Logical Operators<br>
<i>vItjangwI'mey</i></h4><p>
Note that these are strictly logical operators, not bitwise.<p>
<h4>4.2.1 and/je</h4><p>
<i>a b <b>je</b> bool</i><p>
Evaluates b and a and returns a 1 if both are true, a 0 if not.<p>
<h4>4.2.2 or/joq</h4><p>
<i>a b <b>joq</b> bool</i><p>
Evaluates b and a and returns a 1 if one or both are true, a 0 if both are
false.<p>
<h4>4.2.3 xor/ghap</h4><p>
<i>a b <b>ghap</b> bool</i><p>
Evaluates b and a and returns a 1 if only one is true, a 0 otherwise. <p>
<h3>5 Input/Output and File Operators</h3><p>
The <i>var'aq</i> Level 0 specification essentially handles console I/O
and files in a manner very similar to the UNIX model.
<h4>5.1 Console I/O</h4><p>
The console I/O model at this point is very simple: write, read, error.<p>
<h4>5.1.1 disp/cha'</h4><p>
<i>obj <b>cha'</b> -</i><p>
Pops the top object on the stack and writes it to STDOUT. Note that
certain types of objects will generate meaningless output, particularly
anonymous proc objects.<p>
<h4>5.1.2 listen/'Ij</h4><p>
<i>- <b>'Ij</b> str</i><p>
Reads one line of input and stores it as a string on top of the stack.<p>
<h4>5.1.3 complain/bep</h4><p>
<i>str <b>bep</b> -</i><p>
Pops <i>str</i> and prints it to stderr.<p>
<h3>6 System Variables<br>
<i>patSarwI'mey</i></h3><p>
This section describes <i>var'aq</i> keywords that do no more than put set
values on the stack. Many of them are not precisely constants but more like
environment variables.<p>
<h4>6.1 I/O-related Constants</h4><p>
<h4>6.1.1 newline/chu'DonwI'</h4><p>
Prints a carriage return.<p>
<h4>6.1.2 tab/chu'tut</h4><p>
Advances by one tab stop.<p>
<h4>6.2 Environment Constants</h4><p>
<h4>6.2.1 whereami/nuqDaq_jIH</h4><p>
Represents the location of the current host device. On Earth implementations,
usually returns the IP address of the machine the interpreter is running
on.<p>
<h4>6.2.2 version/pongmI'</h4><p>
Returns the current interpreter version number. The reference interpreter
returns a date stamp.<p>
<h4>6.2.3 argv/taghDe'</h4><p>
Pushes the command line arguments on the stack as a list.<p>