Mercurial > repo
diff interps/c-intercal/doc/ick.txi @ 996:859f9b4339e6
<Gregor> tar xf egobot.tar.xz
author | HackBot |
---|---|
date | Sun, 09 Dec 2012 19:30:08 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interps/c-intercal/doc/ick.txi Sun Dec 09 19:30:08 2012 +0000 @@ -0,0 +1,6898 @@ +\input texinfo @c -*- texinfo -*- +@c %**start of header +@setfilename ick.info +@set VERSION 0.29 +@set VERSIONDASH 0-29 +@settitle C-INTERCAL @value{VERSION} Revamped Instruction Manual +@paragraphindent 0 +@documentlanguage en +@documentencoding ISO-8859-1 + +@c Command line option index. +@defcodeindex op +@c Error index +@defindex er +@c Commands and language features are in the predefined fnindex. +@c Things generally are in the predefined cpindex. + +@c Combining indices. +@syncodeindex fn cp +@syncodeindex op cp +@synindex er cp + +@c Adding to the main documentation tree. +@dircategory INTERCAL +@direntry +* C-INTERCAL: (ick). The C-INTERCAL language and compiler. +* ick: (ick) Invoking ick. Invoking the C-INTERCAL compiler. +* convickt: (ick) convickt. The command-line character set converter. +@end direntry + +@c Some macros to ease writing and updating. (The VERSION is set above because +@c it's needed to set the title.) +@macro cic{} +@abbr{C-INTERCAL} +@end macro +@macro clcic{} +@abbr{CLC-INTERCAL} +@end macro +@macro icst{} +@abbr{INTERCAL-72} +@end macro +@macro jic{} +@abbr{J-INTERCAL} +@end macro +@macro ical{} +@acronym{INTERCAL} +@end macro + +@c Part headings for unsplit output +@macro partheading{arg} +@html +<!-- +@end html +@unnumbered \arg\ +@html +--><h1>\arg\</h1> +@end html +@c +@end macro +@iftex +@set notsplit +@end iftex + +@c 'Portability' boxes +@macro portability{st,c,clc,j} +@multitable @columnfractions .23 .23 .23 .23 +@headitem @icst{} @tab @cic{} @tab @clcic{} @tab @jic{} +@item \st\ @tab \c\ @tab \clc\ @tab \j\ +@end multitable +@c +@end macro + +@c Generating items and anchors together is also helpful. +@macro ianchor{arg} +@item \arg\ +@anchor{\arg\} +@c +@end macro +@macro ianchorc{arg} +@item \arg\ +@anchor{\arg\+} +@c +@end macro +@macro ieanchor{arg} +@item \arg\ +@anchor{\arg\} +@erindex \arg\ +@c +@end macro +@macro ianchorpm{arg} +@item +\arg\ +@itemx -\arg\ +@anchor{+\arg\} +@anchor{-\arg\} +@c +@end macro + +@c Some fixes for HTML. +@ifhtml +@c Examples are styled in CSS; don't do it with hardcoded whitespace! +@exampleindent 0 +@end ifhtml +@c %**end of header + +@copying +This manual is for @cic{} version @value{VERSION}. It does not replace +the old groff manual, nor is it designed to be read in conjunction with +it; instead, it serves a different purpose, of providing information +useful to users of @cic{} (unlike the other manual, it is not derived +from the original @icst{} manual). + +Copyright @copyright{} 2007 Alex Smith. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with no Front-Cover Texts, and with no Back-Cover +Texts. A copy of the license is included in the section entitled +``GNU Free Documentation License.'' + +@end quotation +@end copying + +@titlepage +@ifset notsplit +@title C-INTERCAL Revamped Instruction Manual +@subtitle (this version distributed with version @value{VERSION} of C-INTERCAL) + +@page +@vskip 0pt plus 1filll +@insertcopying + +@end ifset +@end titlepage + +@ifset notsplit +@contents +@end ifset + +@ifnottex +@node Top +@top C-INTERCAL @value{VERSION} + +@insertcopying + +@menu +* About this manual:: What is covered in this manual + +The @cic{} compiler +* Installation:: How to install @cic{} +* Invoking ick:: Options to give to the compiler ick +* Errors and Warnings:: Error messages, and what to do about them +* The yuk debugger:: How to use the runtime debugger + +Basic @ical{} features +* Syntax:: Holding statements together +* Expressions:: Operators, operands, and grouping +* Statements:: What an @ical{} statement can do +* System Library:: Pre-existing @ical{} routines + +@ical{} dialects and extensions +* TriINTERCAL:: @ical{} in non-binary bases +* Multithreading and Backtracking:: Running @ical{} programs in parallel +* Operand Overloading:: Where one expression stands for another +* PIC-INTERCAL:: @ical{} on embedded systems +* CREATE:: Creating new syntax at runtime +* External Calls:: Linking @ical{} with other languages +* Differences to Other Compilers:: @cic{} vs. @clcic{} + +Appendices and indices +* Character Sets:: A list of character sets used by @ical{} +* convickt:: The command-line character set converter +* Optimizer Idiom Language:: The syntax to specify optimizer idioms +* Copying:: License information for the code and manual +* Main Index:: An index of all the pages in this manual + +@end menu +@end ifnottex + +@node About this manual +@unnumbered About this manual +@cindex About this manual + +This is the Revamped Instruction Manual for @cic{} (this version is +distributed with @cic{} version @value{VERSION}). It is divided into +four parts. + +The first part is about the @cic{} compiler @command{ick}, and how to +use it. It covers installing the compiler, using the compiler, what +error and warning messages are produced by the compiler, and some +information on how to use the debugger. + +The second part is about the core @ical{} language, invented in 1972, +and some other commands since then which don't feel like they're +extensions. (This is a pretty arbitrary distinction, but people who +write the documentation are entitled to arbitrary distinctions. The +manual's licensed under a license that lets you change it +(@pxref{Copying}), so if you disagree you can move the commands from +section to section yourself.) Mostly only commands that are +implemented in @cic{} are covered here (if you're interested in the +other commands implemented in other compilers, read @clcic{}'s +documentation). However, a comprehensive guide to portability of +these commands between @cic{} and other @ical{} compilers is given. + +The third part covers the @ical{} extensions and dialects that are +implemented by @cic{}, such as TriINTERCAL and Threaded @ical{}. +Again, extensions and dialects not implemented have been mostly left +out. + +The final part contains appendices (which were known as `tonsils' in +the original @ical{} manual), such as character sets used by @ical{}, +programs other than @command{ick} in the @cic{} distribution, +information on how to read and update the list of optimizer idioms +used by the compiler, and the copyright. + +@ifset notsplit +@partheading{PART I: THE @cic{} COMPILER} +@end ifset +@node Installation +@chapter Installation +@cindex installation +@cindex @command{ick}, installing + +The @cic{} distribution is distributed in source code form; this means +that before using it, you first have to compile it. Don't worry: if you +have the right software, it's not at all difficult. Most Linux-based +and UNIX-based computers are likely to have the software needed already; +the software needed to compile source-distributed packages is also +readily available for free for other operating systems. The following +instructions will help you install the distribution in a method +appropriate for your system. + +(If you happen to be using Debian or Ubuntu, you can also obtain and +install binaries with the command @samp{sudo apt-get install +intercal}, making the rest of this chapter redundant. If you do this, +use Debian's bug tracker to report bugs, rather than reporting them +directly to the maintainers.) + +@menu +* Obtaining:: How to get a @cic{} distribution to install +* Unpacking:: What to do with the distribution file +* Simple Installation:: How to install things the easy way +* Uninstalling:: If you don't want to use the software +* Reporting Bugs:: If it doesn't work or you know how to fix it +* Distributing:: How to make your own @cic{} distribution +@end menu + +@node Obtaining +@section Obtaining +@cindex obtaining C-INTERCAL +@cindex C-INTERCAL, obtaining a copy + +@cic{} distributions have been stored in many different places over +time; it can sometimes be hard to make sure that you are finding the +most recent version. In order to make sure that you have the most +recent version, the easiest way is to look at the +@uref{news:alt.lang.intercal,,alt.lang.intercal newsgroup}; all releases +of the @cic{} compiler ought to be announced there. (If you are +interested in what other @ical{} compilers are available, it may also be +worth looking there.) If you don't have access to a newsreader, your +newsreader doesn't cover that newsgroup, or the distance between +releases has been too large for your news server to keep the message, +it's likely that you can find the announcement in an archive on the +World Wide Web; at the time of writing (2007), the archives of the +newsgroup are stored by @uref{http://groups.google.com,Google Groups}, +and a search for @samp{alt.lang.intercal} there should tell you where to +find a copy. + +If you're looking for the latest version, note that the number after the +dot represents the major version number; you want to maximise this in +favour of the number before the dot, which is the bugfix level within a +major version. (Major versions are released as version 0.whatever; if a +new version comes out that fixes bugs but adds no new features, nowadays +its number will be of the form 1.whatever, with the same major number. +This has not always been the case, though.) + +@node Unpacking +@section Unpacking +@cindex C-INTERCAL, unzipping +@cindex C-INTERCAL, unpacking +@cindex unzipping C-INTERCAL +@cindex unpacking C-INTERCAL +@cindex ick-@value{VERSIONDASH}.pax.* + +@cic{} is distributed in compressed pax format; for instance, you may +find as a @samp{.pax.lzma} file if you have the @command{unlzma} +decompression program (this is advised, as it's the smallest); +@samp{.pax.bz2} is larger and @samp{.pax.gz} is larger still. Most +computers can decompress files in this format, even if they don't +realise it, because pax is forwards-compatible with tar; try renaming +the extension from @samp{.pax} to @samp{.tar} after decompressing to +see if you have a progam that can decompress it. (If you're wondering +why such an apparently non-standard format is being used, this is is +actually a case where @cic{} is being perfectly nonstandard by +conforming to the standards; tar is no longer specified by POSIX, and +pax is its replacement. It's just that pax never really caught on.) + +It doesn't matter where you extract the distribution file to: it's best +if you don't put it anywhere special. If you aren't an administrator, +you should extract the file to somewhere in your home directory (Linux +or UNIX-like systems) or to your My Documents directory (recent versions +of Windows; if you're using an older version, then you @emph{are} an +administrator, or at least have the same privileges, and can extract it +anywhere). Some commands that you might use to extract it: + +@table @asis + +@item Generic UNIX/Linux + +@example +unlzma ick-@value{VERSIONDASH}.pax.lzma +tar xvf ick-@value{VERSIONDASH}.pax +@end example +@i{or} +@example +bunzip2 ick-@value{VERSIONDASH}.pax.bz2 +tar xvf ick-@value{VERSIONDASH}.pax +@end example +@i{or} +@example +gunzip ick-@value{VERSIONDASH}.pax.gz +tar xvf ick-@value{VERSIONDASH}.pax +@end example + +On most UNIX-based and Linux-based systems, @command{tar} will be +available to unpack the installation files once they've been +uncompressed with @command{gunzip}. (I've heard that some BSD systems +have @command{pax} itself to decompress the files, although have not +been able to verify this; some Linux distributions also have +@command{pax} in their package managers. Both tar and pax should work +fine, though.) @command{gunzip} is also likely to be available (and +@command{bunzip2} and @command{unlzma} are less likely, but use those +versions if you have them to save on your bandwidth); if it isn't, you +will need to download a copy from the Internet. + +@item Using GNU tar + +@example +tar xzvf ick-@value{VERSIONDASH}.pax.gz +@end example +@i{or} +@example +tar xqvf ick-@value{VERSIONDASH}.pax.bz2 +@end example + +If you are using the GNU version of @command{tar} (which is very likely +on Linux), you can combine the two steps into one as shown here, +except when using the lzma-compressed version. + +@item Using DJGPP + +@example +djtar -x ick-@value{VERSIONDASH}.pax.gz +@end example + +On a DOS system, you will have to install DJGPP anyway to be able to +compile the distribution, and once you've done that you will be able +to use DJGPP's decompressing and unpacking utility to extract the +files needed to install the distribution. (You will need to type this +at the command line; on Windows 95 and later, try choosing Run...@: +from the start menu then typing @command{cmd} (or @command{command} if +that fails) in the dialog box that opens to get a command prompt, +which you can exit by typing @command{exit}. After typing any command +at a command line, press @key{RET} to tell the shell to execute that +command.) + +@item On Windows + +If you're running a Windows system, you could always try +double-clicking on the ick-@value{VERSIONDASH}.pax.gz file; probably +renaming it to have the extension @samp{.tgz} is likely to give the +best results. It's quite possible that you'll have a program +installed that's capable of decompressing and unpacking it. +Unfortunately, I can't guess what program that might be, so I can't +give you any instructions for using it. + +@end table + +Whatever method you use, you should end up with a directory created +called @file{ick-@value{VERSION}}; this is your main installation +directory where all the processing done by the installation will be +carried out. You will need to have that directory as the current +directory during install (at the command prompt in all the operating +systems I know, you can set the current directory by typing @command{cd +ick-@value{VERSION}}). + +@node Simple Installation +@section Simple Installation +@cindex installation, simple +@cindex simple installation +@findex config.sh +@findex make +@findex make install +@cindex compiling, @command{ick} itself +@cindex installation, via autoconf and make +@cindex configuring + +There are scripts included in the distribution to automate the process +of installing, in various ways. The simplest method of installing is to +use the following routine: + +@enumerate + +@item +Configure @cic{}, by running @command{configure}. Although building +in the distribution directory works; it is recommended that you build +elsewhere; create a directory to build in (using @command{mkdir} on +most operating systems), then run @command{configure} from inside that +directory (for instance, you could do this from inside the main +installation directory: +@example +mkdir build +cd build +../configure +@end example +to build in a subdirectory of the distribution called ``build''). You +also specify where you want the files to be installed at this stage; +the default of @samp{/usr/local} is good for many people, but you may +want to install elsewhere (in particular, if you want to test out +C-INTERCAL without installing it, create a new directory somewhere you +own and specify that as the place to install it, so the install will +actually just copy the files into the right structure for use instead +of installing them). To specify a location, give the option +@option{--prefix=@var{location}} to configure; for instance, +@command{configure --prefix=/usr} would install in /usr. + +@item +Compile the source code, with the command @command{make}. The +Makefile will be set up for your version of @command{make}, and to +automatically recompile only what needs compiling (it will even +recompile the build system if you change that). + +@item +Optionally, create libraries from third-party interpreters to add +support for more languages to the @cic{} external calls system; see +@ref{Creating the Funge-98 Library}. (This step can be skipped; you +can also do it later, but if you do so you need to run the next step +again.) + +@item +Install the executables, help files, include files, and libraries, +using @command{make install}. (This is the only step that needs +root/administrator permissions; so on a system that uses sudo to +elevate permissions, for instance, write it as @command{sudo make +install} if you're installing into a directory that you can't write to +as a non-administrative user.) + +@end enumerate + +On all systems, it's worth just trying this to see if it works. This +requires a lot of software on your computer to work, but all of it is +standard on Linux and UNIX systems. The first command is a +shell-script which will analyse your system and set settings +accordingly; it will explain what it's doing and what settings it +detected, and create several files in the installation directory to +record its results. (This is a configure script produced by the GNU +autoconf (configure); its autoconf source code is available in the +file @file{configure.ac}.) The second command actually compiles the +source code to produce binaries; this takes the longest of any of the +steps. You will see all the commands that it's running as it runs +them. The third command will copy the files it's compiled to +appropriate shared locations on your system so that anyone on the +system can just use @command{ick}. + +There may be various factors that prevent this simple installation +method working. On a system not based on UNIX or Linux, you may find +that you don't have some of the software required to run this (for +instance, you may be missing the shell @command{sh}, and don't have +the shell @command{bash} which can emulate it, and so can't run +@command{sh config.sh} that depends on one of those shells being +available) and so this method won't work for you. In such cases, one +solution may be to install all the software required; the GNU project +has a version of all the commands required, for instance, and there +may be ports available for your operating system. However, the only +software absolutely required is a C compiler (@cic{} was designed to +work with @command{gcc} and is tested mostly with that compiler, but +in theory it should work with other C compilers too, and this is +tested on occasion) and the associated software needed to compile C +files to object files and executables, combine object files into +libraries, etc. + +Another possibility that might stop this process working is if your +version of the relevant software is incompatible with the GNU versions +that were used for testing. For instance, I have come across +proprietary versions of @command{lex} that need directives in the source +file to say in advance how much memory the lexer-generator needs to +allocate. In such cases, pay attention to the error messages you're +getting; normally they will suggest trivial modifications to the source +files that will cause the compilation to work again. + +@cindex installation, Debian +@cindex installation, Ubuntu +@cindex Debian +@cindex Ubuntu +Some Linux and UNIX systems (notably Debian and Ubuntu) don't have the +required files for compilation installed by default. To install them, +just download and install the required packages: for Ubuntu at the +time of writing, they are @samp{binutils}, @samp{cpp}, @samp{gcc}, +@samp{libc6-dev}, @samp{make} to compile @cic{}, and if you want to +modify it, you may also need @samp{autoconf}, @samp{automake}, +@samp{bison}, and @samp{flex}. For debugging help, you may also want +@samp{gdb}, and to recompile the documentation, you may need +@samp{groff}, @samp{tetex-bin}, @samp{texinfo}, and @samp{tidy}. Of +course, if @ical{} ever (the author of this sentence was going to +write something like ``becomes popular, someone will probably package +up a compiler for Debian or Ubuntu anyway'', but at that point on a +whim did an Ubuntu package search for 'intercal' and actually came up +with two results, which look suspiciously like @cic{} and @clcic{}, +later confirming this. The author was vaguely aware that there was a +@clcic{} package floating around, but was unaware of the @cic{} +package, and as a result was too surprised to finish the sentence.) + +If you're trying to do something unusual, you probably want to set some +of the settings yourself rather than letting the compilation process +guess everything. In this case, use @command{configure --help} to +view the options that you can set on @command{configure}; there's a wide +range of settings that you can set available there, and one of them may +be what you want. + +@node Uninstalling +@section Uninstalling +@cindex uninstalling +@cindex @command{ick}, uninstalling + +It may happen that you decide to uninstall @cic{} after installing it; +this may be useful if you want to test the installation system, or +change the location you install programs, or for some reason you don't +want it on your computer. It's worth uninstalling just before you +install a new version of @cic{} because this will save some disk space; +you cannot install two versions of @cic{} at once (at least, not in +the same directory; but you can change the --prefix of one of the +installations to get two versions at once). + +If you installed @cic{} using @command{make install}, you can +uninstall it by using @command{make uninstall} from the installation +directory, assuming that it still exists. If you can't use that +method for some reason, you can uninstall it by deleting the files +@file{ick} and @file{convickt} where your computer installs binaries +(with an extension like @samp{.exe} added if that's usual for binaries +on your operating system), @file{libick.a}, @file{libickmt.a}, +@file{libickec.a}, and @file{libyuk.a} where your computer installs +libraries, and the subdirectories @file{ick-@value{VERSION}} in the +places where your computer installs data files and include files, and +their contents. + +You can go further than uninstalling. Running @command{make clean} +will delete any files created by compilation; @command{make distclean} +will delete those files, and also any files created by configuring. +It's probably a wise idea to uninstall before doing a distclean, +though, as otherwise information needed to uninstall will be deleted, +as that information is generated by @command{configure}. + +@node Reporting Bugs +@section Reporting Bugs +@cindex bugs, reporting +@cindex reporting bugs +@cindex patches, submitting +@cindex submitting patches + +If you can't get @cic{} to install at all, or something goes wrong when +you're using it, reporting a bug is probably a good idea. (This is +still important even if you figure out how to fix it, and the +information isn't in the manual, because the fix can be added to the +source code if possible, or at least to the manual, to benefit future +users.) For general help, you may want to post to the +@uref{news:alt.lang.intercal,,alt.lang.intercal} news group; to report +a bug or submit a patch, email the person who released the most recent +@cic{} version (which you can determine by looking at that newsgroup). + +If you do find a bug (either the compiler not behaving in the way you'd +expect, or if you find a way to cause E778 (@pxref{E778}) without +modifying the source code), it helps a lot if you can submit a bug +report explaining what causes it. If you're not sure, say that; it +helps if you give examples of input, command line options, etc.@: that +cause the bug. There are several debug options (@pxref{Debug Options}) +that you can use to help pin down a bug if you're interested in trying +to solve the problem yourself; looking at the output C code can also +help pin down a bug if the compiler gets that far. + +Information that should be given in a bug report is what you expect to +happen, what actually happens, what input and command line options you +gave to the compiler, what operating system you're using, any ideas you +might have as to what the problem is, and any appropriate debug traces +(for instance, @option{-H} (@pxref{-H+,,-H}) output if you think the bug +is in the optimizer). Core dumps aren't portable between systems, so +don't send those; however, if you're getting an internal error and can +dump core with @option{-U} (@pxref{-U+,,-U}), it helps if you can load a +debugger (such as @command{gdb}) on the core dump, use the debugger to +produce a backtrace, and send that backtrace. + +If you figure out how to solve the bug yourself, and want to submit the +patches to help other users (this also carries the advantage that your +patches will then be maintained along with the rest of the distribution, +and that you won't have to reapply them every time you upgrade to a +newer version of @cic{}), you must first agree to license your code +under the same license as the code that surrounds it (normally, that's +the GNU General Public License, but if you submit a patch to a file with +a different license, like this manual (yes, documentation patches are +useful too), you must agree to that license). You will be credited for +the patch in the source code unless you specifically ask not to be or +you don't give your name (in both these cases, you must license the code +to the public domain so that it can be incorporated without the +attribution requirement). Preferably, patches should be submitted in +the format created by the command @command{diff -u}; this command is +likely to be available on UNIX and Linux systems and versions are also +available for DOS and Windows (including a DJGPP port of the GNU +version). If you can't manage that, just submit your new code with +enough lines of old code around it to show where it's meant to go, and a +description of approximately where in the file it was. Patches should +be submitted by email to the person who most recently released a version +of @cic{}. + +If you have a suggestion for a new feature, it makes sense to first +discuss it on the @uref{news:alt.lang.intercal,,alt.lang.intercal} news +group; other @ical{} compiler maintainers may also want to implement +that feature. If you have developed code to implement that feature in +@cic{}, you can submit it the same way that you would submit a patch for +a bug. + +@node Distributing +@section Distributing +@cindex C-INTERCAL, distributing +@cindex distributing C-INTERCAL +@cindex releasing C-INTERCAL + +Due to the licensing conditions of @cic{}, you are allowed to release +your own version or distribution if you want to. In such cases, it's +recommended that you follow the following guidelines: + +@enumerate + +@item +Make sure the new version is based on the most recent existing version. +Looking at the @uref{news:alt.lang.intercal,,alt.lang.intercal} +newsgroup will normally let you know what version is most recent. + +@item +Increment the version number; if you add any new features, increment the +major version number (after the decimal point) and drop the minor version +number (before the decimal point) to 0, and otherwise increment the minor +version number. You have to update the version number in the following +files: @file{configure.ac}, @file{configure}, and @file{doc/ick.txi}. You +also have to rename the installation directory to reflect the new version +number. + +@item +Add an entry to the @file{NEWS} file explaining what's new in the +version that you're releasing, following the same format as the other +entries. + +@item +Update the @file{README} with a description of any new files you may +have added. + +@item +Remove any autosave or backup files that may be littering the +installation directory or its subdirectories. + +@item +Run @command{make distcheck}, which will make the distribution +paxballs, and rename them to have the correct extensions (Automake +thinks they're tarballs, so will use @samp{.tar} rather than +@samp{.pax}, and you have to fix this by hand). @command{make +distcheck} will also perform some sanity checks on the build system of +the resulting paxball, which will help to ensure that nothing +important is missing from it. + +@item +Place the new version somewhere on the Internet, and announce the +location and the fact that a new version has been released on +@uref{news:alt.lang.intercal,,alt.lang.intercal}. + +@end enumerate + +@node Invoking ick +@chapter Invoking ick +@cindex command line options +@cindex options, to @command{ick} +@cindex @command{ick}, command line options +@cindex @command{ick}, invoking +@cindex @command{ick}, options +@cindex compiling, @ical{} source code + +All operations on @ical{} source code available in @cic{} are currently +carried out by the compiler @command{ick}. + +The syntax is + +@example +ick -options @var{inputfile} +@end example + +@noindent +(Options can be given preceded by separate hyphens, or all in a row +after one hyphen, or a mixture; they're all single characters.) By +default, this compiles one @ical{} program given as the input file +directly to an executable without doing anything fancy; usually you will +want to give options, which are described below. + +@menu +* Language-affecting Options:: Options that specify language dialect +* Debug Options:: Debug your code or ick itself +* Output Options:: Specifying output format and location +* Optimizer Options:: Yes, you can optimize @ical{}! +* Other Options:: Options not covered in other sections +* Options to Generated Programs:: Generated executables allow options too +* Environment Variables:: What environment variables affect ick +@end menu + +@node Language-affecting Options +@section Language-affecting Options +@cindex options, language-affecting +@cindex language-affecting options +@cindex options, dialect +@cindex dialect options + +The following command-line options to @command{ick} affect what dialect +of the @ical{} language is compiled by the compiler; you may need to set +one or more of these options if your input is not the default @cic{} but +instead some other language like @icst{} or @clcic{}, or just because +you like certainty or like being different with respect to your output. +Note that there is no command-line option corresponding to +@abbr{TriINTERCAL} (or the base 4-7 versions); instead, the numeric base +to use is determined by looking at the filename extension (@samp{.i} for +base 2, the default, or @samp{.3i} to @samp{.7i} for the base 3-7 +versions.) + +@table @option +@ianchor -b +@opindex -b +@cindex random bug +@cindex E774, disabling +If this option is @emph{not} given, there is a small chance that a +random bug appears in the compiler, which causes the programs it creates +to manifest a bug that causes error E774 (@pxref{E774}). Giving the +option means that this bug will not happen. (You may wonder why this +bug was preserved; it is in fact a bug that was carefully preserved +since the days of @icst{}, in this case, but the option to turn it off +is available as a workaround. (There are no plans to fix this or any of +the other carefully preserved bugs any time soon, because that would +kind of defeat the point of having preserved them.) Interestingly, the +@icst{} compiler documentation mentions a similar command-line option +that is a workaround for the same bug.) + +@ianchor -m +@opindex -m +@cindex multithreading, enabling +@cindex backtracking, enabling +This option needs to be given to allow any multithreading or +backtracking commands or identifiers to be used. (Unlike with other +language features, this is not autodetected because it's legal to have a +program with multiple COME FROM (@pxref{COME FROM}) commands aiming at +the same line even when it isn't multithreaded, in which case the +commands cause error E555 (@pxref{E555}) when that line is encountered +(with the usual caveats about both commands having to be active at the +time).) Attempts to use non-COME FROM multithreading or backtracking +commands without this option produce error E405 (@pxref{E405}). + +@ianchor -e +@opindex -e +@cindex external calls, enabling +This option makes it possible to link non-@ical{} programs with +@ical{} programs; instead of giving @ical{} programs only on the +command line, give one @ical{} program, followed by any number of +programs in other languages that have been written to be able to link +to @ical{} programs. It also allows expansion libraries to be +specified on the command line, after the @ical{} program (expansion +libraries are given with no extension). For more information, see +@ref{External Calls}. Also, both the @option{-a} and @option{-e} +options must be set to use CREATEd operators (regardless of whether +external calls are used or not). + +@ianchorc -E +@opindex -E +@cindex system library, disabling +This option causes the system library to never be linked; this option +is only useful if your program references a line number in the range +1000 to 1999, contains no line numbers in that range, and yet still +doesn't want the system library to be linked in; therefore, it is +mostly useful with @option{-e} when adding in a custom replacement +system library written in a non-@ical{} language, especially the +expansion library @option{syslibc} (a system library replacement +written in C). + +@ianchor -t +@opindex -t +@cindex INTERCAL-72 compatibility mode +@cindex compatibility, INTERCAL-72 +This option tells the compiler to treat the source code as @icst{}; as a +result, any language constructs that are used but weren't available in +1972 will trigger error E111 (@pxref{E111}). + +@ianchor -a +@opindex -a +@cindex CREATE, enabling +This option allows the CREATE statement (@pxref{CREATE}) to be used. +Note that enabling it carries a run-time penalty, as it means that +operand overloading code has to be generated for every variable in the +program. (This option is not necessarily needed for the external call +version of CREATE to work, but the external call version has fewer +features without it.) Note that @option{-e} (@pxref{-e}) also needs +to be set to be able to CREATE operators. + +@ianchor -v +@opindex -v +@cindex constants, assigning to +@cindex assigning to constants +It is possible to write @ical{} code sufficiently tortuous that it ends +up assigning to a constant. Generally speaking, this isn't what you +wanted to do, so the compiler will kindly cause an error (E277; +@pxref{E277}) that stops the insanity at that point, but at the cost of a +significant amount of performance you can give this option to tell the +compiler to simply change the constant and keep on going anyway. (Note +that unlike @clcic{}, this only changes uses of the constant preceded by +@code{#} in your program, not things like line numbers; you want +@uref{http://esolangs.org/wiki/Forte,Forte} for that.) This option also +allows you to write arbitary expressions on the left of an assignment +statement if you wish. + +@ianchorc -C +@opindex -C +@cindex clockface mode +When this option is given, the generated programs will write the number +4 as @samp{IIII} rather than @samp{IV}, in case you're writing a clock +program. + +@ianchorc -P +@opindex -P +@cindex PIC-INTERCAL, command line option +@cindex E256, avoiding +@cindex E652, avoiding +This tells the compiler to treat the input as @abbr{PIC-INTERCAL} +(@pxref{PIC-INTERCAL}) rather than ordinary @cic{} input, and generate +PIC output code accordingly. There are a lot of options that are +incompatible with this, as well as many language features, due to the +limited memory available on a PIC. If you get error E256 +(@pxref{E256}), you have this option given when it shouldn't be; +likewise, if you get error E652 (@pxref{E652}), you should be using this +option but aren't. (A few simple programs are +@cic{}/@abbr{PIC-INTERCAL} polyglots, but such programs are incapable of +doing input or output, meaning that they aren't particularly useful.) + +@ianchorc -X +@opindex -X +@cindex Princeton syntax, option +@cindex syntax, Princeton +The @cic{} and @clcic{} compilers use different notation for various +things, sometimes to the extent where the same notation is legal in both +cases but has a different meaning. As this is the @cic{} compiler, it +rather guessably uses its own notation by default; however, the @clcic{} +notation can be used as the default instead using this option. (In most +situations where there isn't an ambiguity about what something means, +you can use the `wrong' syntax freely.) The option causes ambiguous +characters like @code{?} to be interpreted with Princeton rather than +Atari meanings. + +@ianchor -x +@opindex -x +@cindex CLC-INTERCAL compatibility mode +@cindex compatibility, CLC-INTERCAL +This option causes some constructs with different meanings in @cic{} +and @clcic{} to use the @clcic{} meaning rather than the @cic{} +meaning. At present, it affects the abstention of a GIVE UP +(@pxref{GIVE UP}) command by line number, which is possible as long as +this switch isn't given; reading through the @icst{} manual, there are +a lot of things that imply that this probably wasn't intended to be +possible, but as far as I can tell that manual doesn't actually +@emph{say} anywhere that this particular case is disallowed, even +though it rules out all other similar cases. It also causes I/O on +array variables to be done in @clcic{}'s extended Baudot syntax, +rather than using the Turing Tape method. + +@end table + +@node Debug Options +@section Debug Options +@cindex options, debug +@cindex debug options + +Sometimes things will go wrong with your program, or with the way +@command{ick} was installed. There may even be unknown bugs in +@command{ick} itself (if you find one of these, please report it). The +following options are used to debug the whole system on various levels. + +@table @option + +@ianchor -d +@opindex -d +@cindex debugging, parser +@cindex parser, debugging +@cindex debugging, lexical analyser +@cindex lexical analyser, debugging + +If you think that something has gone wrong with the parser, or you want +to see how your program is being parsed, you can give this option on the +command line. All the debug output produced by the parser and lexical +analyser will be output. + +@ianchor -g +@opindex -g +@cindex debugging, C code +@cindex C code, debugging +@cindex C code, leaving in place + +This option allows debugging of the final executable at the C code +level. Any C code generated will be left in place, and the @option{-g} +option will be given to the C compiler that's used to compile the code, +so all the information needed for a C debugger to be used on the +executable will be present there. + +@item -h +@itemx -H +@itemx -hH +@anchor{-h} +@anchor{-H+} +@anchor{-hH} +@opindex -h +@opindex -H +@opindex -hH +@cindex optimizer, debugging +@cindex debugging, optimizer +@cindex OIL, debugging +@cindex debugging, OIL + +These options allow debugging of the optimiser, or produce output +helpful for understanding how your program has been summarised. +@option{-h} produces a summary of what optimiser rules were used, the +initial expression and what it was optimised to; @option{-H} produces a +more expanded view that shows each intermediate step of optimisation, +and @option{-hH} shows the same output as @option{-H}, but written +completely using C syntax (the other options output in a strange mix of +@ical{} and C). + +@ianchor -l +@opindex -l +@cindex warnings, enabling + +This option turns on generation of warnings (@pxref{Warnings}). To make +sure that they aren't actually useful, or are only marginally useful, +the warning generator is far too sensitive, and there is no way to +decide which warnings are given and which ones aren't; you either get +all of them or none. + +@ianchor -p +@opindex -p +@cindex profiling +@cindex yuk, profiling + +This option causes the program to run immediately after being compiled, +and profiles the resulting program to identify performance bottlenecks, +etc. The usefulness of this depends on the resolution of the timers on +the computer and operating system; DOS, in particular, is really bad +with timer resolution. The output will be saved in a file called +@file{yuk.out} when the program finishes running. It's legal to turn on +both the profiler and the interactive debugger at the same time, but if +you do this the profiler will also identify bottlenecks in the person +typing in commands to step through the program! The profiler will, in +fact, identify all the timings that particular commands in the program +take; so @code{WRITE IN} instructions will often show up as taking a +long time due to their need to wait for input. + +@ianchor -w +@opindex -w +@cindex +printflow, enabling +@cindex printflow, enabling + +This option causes the produced program to support the +@option{printflow} option fully; when this option is not given, +@option{printflow} will in most cases have partial or no support +(except in multithreaded programs, where this option is redundant), +because not all the code needed for it will be included in the program +to save space. + +@ianchor -u +@opindex -u +@cindex skeleton file, directory problems +@cindex system library, directory problems +@cindex syslib, directory problems +@cindex directory problems +@cindex E999, debugging +@cindex E127, debugging + +When you are getting problems with finding files -- for instance, the +compiler can't find the skeleton file (@pxref{E999}) or the system +library (@pxref{E127}) -- this option will let you know, on standard +error, where the compiler is looking for files. This may hopefully help +you pin down where the file-finding problems are coming from, and also +offers the option of simply placing copies of the files where the +compiler is looking as a last resort. + +@ianchor -y +@opindex -y +@cindex yuk, command line option + +This is the main debugging option: it loads yuk, an interactive @ical{} +debugger with ability to step through the program, set breakpoints, view +and modify variables, etc. @xref{yuk}. + +@ianchorc -Y +@opindex -Y +@cindex external calls, debugging +@cindex command line, showing intermediates + +This options causes the command line to be displayed for all calls to +other programs that @command{ick} makes (mostly to @command{gcc}); it +is therefore useful for debugging problems with the command lines used +when using the external calls system (@pxref{External Calls}). + +@ianchorc -U +@opindex -U +@cindex internal errors, debugging +@cindex debugging, internal errors +@cindex internal errors, dumping core +@cindex dumping core on error +@cindex E778, debugging + +The internal error E778 (@pxref{E778}) should never happen. However, +there are all sorts of potential problems that may come up, and if part +of the code detects something impossible, or more usually when the +operating system detects things have got too insane and segfaults, +normally this error will just be generated and that's that. (I most +often get this when I've been writing a new section of code and have +made a mistake; hopefully, all or at least most of these errors are +fixed before release, though.) If you want more information as to what's +going on, you can give the @option{-U} option, which will cause the +compiler to raise an abort signal when an internal error happens. This +can generally be caught by a debugger that's being run on @command{ick} +itself at the time; on many systems, it will also cause a core dump. + +@end table + +@node Output Options +@section Output Options +@cindex output options +@cindex options, output + +These options allow you to control how far to compile (all the way to an +executable, or only to C, etc.@:), and where the output will be created. +Note that the output options may change depending on the other options +selected; for instance, many of the debug options will prevent the code +being compiled all the way to an executable. + +@table @option + +@ianchor -c +@opindex -c +@cindex code generation, stopping at C code +@cindex C, stopping after C is generated +@cindex output, C only + +By default, the original @ical{} code will be compiled all the way to an +executable, and the intermediate C and object files produced will be +deleted. Giving this option causes the compiler to stop when it has +finished producing the C file, leaving the C file there as the final +output of the compiler. (Its filename is the same as the source file, +but with @samp{.c} as its extension/suffix rather than the source file's +extension.) Without this option, an executable will be produced with the +extension changed to whatever's appropriate for the system you are on +(or omitted entirely if that's appropriate for the system). + +This option also places verbose comments in the output C file. + +@ianchor -o +@opindex -o +@cindex output, to standard output +@cindex standard output + +This option causes the compiler to progress no further than producing +the C output file, but instead of writing it to a file writes it +directly to standard output. This might occasionally be useful when +using @command{ick} as part of a pipe; it can also be useful to see how +far the compiler gets with compiling code before an error happens, when +you're trying to track down an error. + +@end table + +@node Optimizer Options +@section Optimizer Options +@cindex optimizer options +@cindex options, optimizer +@cindex optimization + +There are various command line options that can be used to tell +@command{ick} whether and in what ways to optimize code. + +@table @option + +@ianchor -f +@opindex -f +@cindex flow optimization +@cindex optimization, flow +@cindex optimization, control flow + +This option requests the compiler to attempt to analyse the flow of the +program and optimize accordingly; for instance, it will detect which +commands can't possibly be @code{ABSTAINED} from and refrain from +generating code to check the abstention status of those commands. + +@ianchorc -F +@opindex -F +@cindex optimization, extreme +@cindex extreme optimization + +This option tells the compiler to optimize the output for speed. This +is done to crazy extremes; the compiler may take several hours/days +analysing the program in some cases and still not come up with an +improvement. It turns on all the other optimizer options. Note that +not all systems accept this option, because it sometimes outputs a shell +script disguised as an executable rather than an actual executable. + +@ianchorc -O +@opindex -O +@cindex optimization, idioms +@cindex idiom optimization +@cindex optimization, OIL +@cindex OIL, optimizing code + +This option tells the compiler to apply optimizer idioms to the +expressions in the code given, when appropriate. The list of idioms is +stored in the file @file{src/idiotism.oil}; note that it is compiled +into the compiler, though, so you will have to rebuild and reinstall the +compiler if you change it. For more information about changing the list +of idioms, see @ref{Optimizer Idiom Language}. + +@end table + +@node Other Options +@section Other Options +@cindex other options +@cindex options, other + +Some options just can't be classified. + +@table @option + +@item -@@ +@anchor{-at} +@opindex -@@ +@cindex options, help +@cindex help with options +@cindex usage instructions, printing + +If this option is given, the compiler doesn't run at all, but instead +prints a set of instructions for using it, explaining which options are +available on the system you're on and which options conflict with which +other options. + +@end table + +@node Options to Generated Programs +@section Options to Generated Programs +@cindex generated programs, options +@cindex options, to generated programs + +Once the compiler runs and produces an output executable, that +executable itself will accept a range of options that control the way it +runs. None of these options have to be used; a default value will be +assumed if they aren't. + +@table @option + +@ianchorpm help +@opindex +help +@opindex -help + +Whether @samp{+} or @samp{-} is given at the start of this option, it +will cause the program to print out what options are available and what +state they are in. It will then cause the program to exit via an +internal error. + +@ianchorpm wimpmode +@opindex +wimpmode +@opindex -wimpmode +@cindex wimpmode +@cindex Roman numerals, disabling +@cindex Arabic numberals, enabling +@cindex input, in Arabic numerals +@cindex output, in Arabic numerals + +If the @samp{+} version of this is given (rather than the default +@samp{-}), then the program will print a message explaining that you are +a wimp (the mode itself is known as wimpmode), and for the rest of +execution will input in Arabic numerals (@samp{123} rather than +@samp{ONE TWO THREE}) and likewise will output in Arabic numerals rather +than Roman numerals (such as @samp{CXXIII}). True @ical{} programmers +should rarely have to use this mode. + +@ianchorpm traditional +@opindex +traditional +@opindex -traditional + +This option does not actually appear to do anything. + +@ianchorpm instapipe +@opindex +instapipe +@opindex -instapipe +@cindex output, flushing +@cindex flushing + +This option causes standard output to be flushed whenever any characters +are output when the @samp{+} version is used, rather than on each newline +(the default @samp{-} version). It is most useful for more responsive +pipes when outputting binary data, and also useful for debugging very +slow programs. + +@ianchorpm printflow +@opindex +printflow +@opindex -printflow +@cindex flow, printing +@cindex debugging, flow +@cindex debugging, multithreaded programs +@cindex multithreading, debugging +@cindex backtracking, debugging + +The usual debugging methods don't work with multithreaded or +backtracking programs. This option exists to give at least a slim +chance of working out what is going on with them. It causes the +program to print the line number of the command it thinks it may be +executing next (i.e.@: the line number that would be printed if that +line had an error) immediately after executing each command, and also +an internal identifier for the thread that that command was in. It +also prints a trace of what parts of the multithreader are being +activated; so for instance, it will tell you when a thread is being +forked into multiple threads or when a choicepoint has been deleted. +Note that the @option{-w} option (@pxref{-w}) must be given to gain +full support for flow printing in non-multithreaded non-backtracking +programs, because otherwise the required code to print this +information will not be generated. + +@ianchorpm mystery +@opindex +mystery +@opindex -mystery + +This option is occasionally capable of doing something, but is +deliberately undocumented. Normally changing it will have no effect, +but changing it is not recommended. + +@end table + +@node Environment Variables +@section Environment Variables +@cindex environment variables + +Various environment variables can be set to affect the operation of +@command{ick}. + +@multitable @columnfractions .3 .7 +@headitem Variable @tab Meaning +@item ICKINCLUDEDIR@*ICKLIBDIR@*ICKDATADIR +@tab +These three environment variables suggest locations in which +@command{ick} should look to find various files that it needs: the +skeleton file, system library, C header files and libraries that it +needs, constant-output optimiser, and the GNU General Public License +(which the debugger needs to be able to display on demand for legal +reasons). +@item CC +@tab +The name of a C compiler to use (defaults to gcc, which is the only +compiler with which @cic{} has been tested recently). This option has +no effect on DJGPP, where gcc is always used. +@item ICKTEMP@*TMPDIR@*TEMP@*TMP +@tab +On DJGPP, @command{ick} creates temporary files to pass options to gcc +as a method of getting around the limit on the length of a command line +that can sometimes affect DOS programs. These four environment +variables are tried (in this order) to determine a location for the +temporary file; if none of them are set, the current directory is used. +@end multitable + +@node Errors and Warnings +@chapter Errors and Warnings +@cindex @command{ick}, errors and warnings +@cindex errors and warnings + +Things may go wrong, either during the compilation or the execution of +your program. Note that some things that would be compile-time errors +in many other languages -- such as syntax errors -- are in fact run-time +errors in @ical{}. + +Errors and warnings appear as an error code starting with @samp{ICL}, +followed by a three digit number, followed by @samp{I} for an error or +@samp{W} for a warning. However, they will be notated here as +@samp{E000}, etc.@:, to save space and because consistency was never a +strong point of @ical{}. This is followed by a text description of the +error, and a hint as to the location of the error. This is not the line +on which the error occurred, but rather the line on which the next +command to be executed is. To add to the fun, the calculation of the +next command to be executed is done at compile-time rather than runtime, +so it may be completely wrong due to things like abstention on +@code{COME FROM}s or computed @code{COME FROM}s. The moral of this +story is that, if you really want to know where the error is, use a +debugger. Note also that if the error happens at compile-time, there is +no guarantee that the line number given makes any sense at all. Some +errors don't give next line numbers, mostly those for which it doesn't +make logical sense, such as E633 (@pxref{E633}). After this is a +suggestion to correct (or reconsider) the source code and to resubnit +it. (This typo has been carefully preserved for over a decade.) + +@menu +* Errors:: Error messages that might be produced +* Warnings:: Warnings produced by the @option{-l} option +@end menu + +@node Errors +@section Errors +@cindex errors +@cindex @command{ick}, errors + +This is a list of the error messages that might be produced during the +compilation or execution of an @ical{} program. + +@table @asis + +@ieanchor E000 +@cindex syntax error + +This is an unusual error; it's what's printed when a syntax error is +encounted at runtime, in a situation in which it would be executed. (An +@code{ABSTAIN}ed syntax error, for instance, would not be executed; this +is one of the mechanisms available for writing comments.) The text of +the error message is simply the statement that couldn't be decoded. + +@ieanchor E017 +@cindex constant, twospot +@cindex overflow, in constant +@quotation +DO YOU EXPECT ME TO FIGURE THIS OUT? +@end quotation + +This error occurs when there is an attempt to use a constant with a +value outside the onespot range; it's a compile-time error. + +@ieanchor E079 +@cindex politesse +@cindex @code{PLEASE}, proportion required +@quotation +PROGRAMMER IS INSUFFICIENTLY POLITE +@end quotation + +The balance between various statement identifiers is important. If less +than approximately one fifth of the statement identifiers used are the +polite versions containing @code{PLEASE}, that causes this error at +compile time. + +@ieanchor E099 +@quotation +PROGRAMMER IS OVERLY POLITE +@end quotation + +Of course, the same problem can happen in the other direction; this +error is caused at compile time if over about one third of the statement +identifiers are the polite form. + +@ieanchor E111 +@quotation +COMMUNIST PLOT DETECTED, COMPILER IS SUICIDING +@end quotation + +This error happens when you give the @option{-t} option (@pxref{-t}) but +you use a language construct that wasn't available in @icst{}. If this +happens, then either there's a mistake in the program that prevents it +being @icst{} or you shouldn't be compiling it as @icst{} in the first +place. + +@ieanchor E123 +@cindex black lagoon +@cindex @code{NEXT}, stack overflow +@cindex stack overflow +@quotation +PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON +@end quotation + +There is a hard limit of 80 @command{NEXT}s at a time; this is to +discourage excessive use of @command{NEXTING} for things like recursion. +(Recursive programs are entirely legal; you simply have to figure out +how to do it with computed @command{COME FROM} instead. (For the +record, it is possible. (Using lots of nested brackets when talking +about recursion is great (yay!@:).))) Another problem with writing the +source code that can cause this error is a failure to properly +@command{FORGET} the entry on the @command{NEXT} stack created when +trying to simulate a goto. + +@ieanchor E127 +@cindex system library, errors +@cindex syslib, errors +@quotation +SAYING 'ABRACADABRA' WITHOUT A MAGIC WAND WON'T DO YOU ANY GOOD +@end quotation +Your program asked to include the system library (by specifying a line +number from 1000 to 1999 inclusive without including a line with that +number), but due to installation problems the compiler couldn't find the +system library to include. You could try using the @option{-u} +(@pxref{-u}) option to see where the compiler's looking; that may give +you an idea of where you need to copy the system library so that the +compilation will work. This error happens at compile time and doesn't +give a next command line number. + +@ieanchor E129 +@cindex @code{NEXT}, nonexistent target +@quotation +PROGRAM HAS GOTTEN LOST +@end quotation + +This error happens at compile time when the compiler can't figure out +where a @code{NEXT} command is actually aiming (normally due to a typo +in either the line label given or the line label on the line aimed +for). The logic behind this error means that the next line to be +executed is unknown (after all, that's the whole point of the error) +and is therefore not given. The @option{-e} command-line option +(@pxref{-e}) makes this error into a run-time error, because it allows +@code{NEXT} commands to dynamically change targets at runtime, as well +as line labels to dynamically change values, and thus the error is +impossible to detect at compile time. + +@ieanchor E139 +@cindex @code{ABSTAIN}, nonexistent target +@cindex @code{REINTSTATE}, nonexistent target +@quotation +I WASN'T PLANNING TO GO THERE ANYWAY +@end quotation + +This error happens at compile time when an @code{ABSTAIN} or +@code{REINSTATE} references a non-existent target line. This generally +happens for much the same reasons as E129 (@pxref{E129}). + +@ieanchor E182 +@cindex line label, duplicate +@cindex duplicate line label +@quotation +YOU MUST LIKE THIS LABEL A LOT! +@end quotation + +At present, it's impossible to have more than one line with the same +line number. That would make @code{NEXT} act too much like @code{COME +FROM} in reverse to be interesting. This error happens at compile +time. (For inconsistency, it @i{is} possible to have multiple lines +with the same number as long as at most one of them is in an @ical{} +program (the others have to be in programs in other languages included +via the external calls system).) + +@ieanchor E197 +@cindex line label, illegal value +@cindex illegal line label value +@cindex invalid line label value +@quotation +SO@! 65535 LABELS AREN'T ENOUGH FOR YOU? +@end quotation + +Legal values for line labels are 1 to 65535 (with values from 1000 to +1999 reserved if you want to use the system library, and 1600 to 1699 +reserved if you're using other expansion libraries). This error comes +up if you use nonpositive or twospot values for a line label. + +@ieanchor E200 +@cindex variable, illegal number +@cindex illegal variable number +@cindex invalid variable number +@quotation +NOTHING VENTURED, NOTHING GAINED +@end quotation + +You used a variable that isn't actually in your program. Failing that +(which would be quite impressive and is probably impossible, at least in +the present version of @cic{}), you specified an illegal number for a +variable (legal numbers are positive and onespot). This error happens +at compile time, at least for illegal variable numbers. + +@ieanchor E222 +@cindex out of memory, during @code{STASH} +@quotation +BUMMER, DUDE! +@end quotation + +In @ical{}, you're allowed to @code{STASH} as much as you like; this +makes the language Turing-complete and allows for unlimited recursion +when combined with computed @code{COME FROM} in the right way. +Unfortunately, real computers aren't so idealised; if you manage to +write a program so memory-intensive that the computer runs out of memory +to store stashes, it causes this error at runtime. To fix this error, +you either have to simplify the program or upgrade your computer's +memory, and even then that will only help to some extent. + +@ieanchor E240 +@cindex array, invalid dimension +@cindex invalid array dimension +@cindex illegal array dimension +@quotation +ERROR HANDLER PRINTED SNIDE REMARK +@end quotation + +Arrays have to be large enough to hold at least one element; you tried +to dimension an array which isn't large enough to hold any data. This +error happens at run time. + +@ieanchor E241 +@cindex array, wrong dimension +@cindex wrong array dimension +@cindex array, out of bounds +@cindex out of bounds +@quotation +VARIABLES MAY NOT BE STORED IN WEST HYPERSPACE +@end quotation + +This error happens at run time when the subscripts given to an array +are inconsistent with the way the array was dimensioned, either +because there were the wrong number of subscripts or because a +subscript was too large to fit in the array. It can also happen when +a multidimensional array is given to a command, such as @code{WRITE +IN}, that expects it to be monodimensional. + +@ieanchor E252 +@cindex I/O, out of memory +@cindex out of memory, I/O +@quotation +I'VE FORGOTTEN WHAT I WAS ABOUT TO SAY +@end quotation + +This run-time error message is caused by the compiler running out of +memory whilst trying to do I/O; at present, it can only happen during +@clcic{}-style I/O. + +@ieanchor E256 +@cindex PIC-INTERCAL, unsupported command +@quotation +THAT'S TOO HARD FOR MY TINY BRAIN +@end quotation + +Some commands simply aren't available in @abbr{PIC-INTERCAL}. I mean, +@acronym{PIC}s generally have less than a kilobyte of memory; you're not +going to be able to use some of the more confusing language features +with that sort of resource limitation. The solution is to replace the +affected command, or to not give the @option{-P} option +(@pxref{-P+,,-P}) if you didn't mean to compile as @abbr{PIC-INTERCAL} +in the first place. + +@ieanchor E275 +@cindex overflow, over onespot +@cindex overflow, over 16 bits +@cindex onespot overflow +@cindex 16 bit overflow +@quotation +DON'T BYTE OFF MORE THAN YOU CAN CHEW +@end quotation + +This error happens when there is an attempt to store a twospot value in +a onespot variable. The actual size of the value is what matters when +counting its spots; so you can store the output of a mingle in a onespot +variable if it happens to be less than or equal to 65535, for instance. +(This is not necessarily the case in versions of @ical{} other than +@cic{}, though, so you have to be careful with portability when doing +this.) + +@ieanchor E277 +@cindex reverse assignment, impossible +@cindex reverse assignment, error +@cindex operand overloading, impossible +@cindex impossible reverse assignment +@quotation +YOU CAN ONLY DISTORT THE LAWS OF MATHEMATICS SO FAR +@end quotation + +Reverse assignments are not always mathematically possible. Also, +sometimes they require changing the value of a constant; this is only +legal if you specifically specified that it was legal by using the +@option{-v} option. In the case of an impossible reverse assignment +(including a situation in which operand overloading causes a reverse +assignment to happen), this error happens at runtime. + +This error can also come up when a scalar variable is overloaded to an +array (which doesn't make sense, but could happen if someone exploited +bugs in the CREATE statement (@pxref{CREATE})), and an attempt is made +to read or assign to that variable. (Subscripting a scalar variable +is a syntax error, so there is no use for doing such an overload +anyway.) + +@ieanchor E281 +@cindex spark, nesting limit +@cindex ears, nesting limit +@cindex rabbit-ears, nesting limit +@cindex nesting limit +@findex SENESTMAX +@quotation +THAT MUCH QUOTATION AMOUNTS TO PLAGIARISM +@end quotation + +There is a limit of 256 on the number of nested spark/ears groups +allowed. If you somehow manage to exceed that limit, that will cause +this error. Try breaking the expression up into smaller expressions. +(The limit is trivial to increase by changing @code{SENESTMAX} in +@file{ick.h}; if you ever actually come across a program that hits the +limit but wasn't designed to, just email the maintainer to request a +higher limit.) + +@ieanchor E333 +@cindex variables, limit +@quotation +YOU CAN'T HAVE EVERYTHING, WHERE WOULD YOU PUT IT? +@end quotation + +Your program references so many variables that the compiler couldn't +cope. This error is unlikely to ever happen; if it does, try reducing +the number of variables you use by combining some into arrays. This is +a compile-time error. + +@ieanchor E345 +@cindex out of memory +@quotation +THAT'S TOO COMPLEX FOR ME TO GRASP +@end quotation + +This is another compile-time error that's unlikely to ever happen; +this one signifies the compiler itself running out of memory trying to +compile your program. The only solutions to this are to simplify your +program, or to make more memory available to the compiler. + +@ieanchor E404 +@cindex @code{GO BACK}, no choicepoint +@cindex @code{GO AHEAD}, no choicepoint +@quotation +I'M ALL OUT OF CHOICES! +@end quotation + +Your program asked that a choicepoint be backtracked to or removed, but +there aren't any choicepoints at the moment. This runtime error usually +indicates a logic mistake in your program. In backtracking programs +translated from other backtracking languages, this indicates that the +program has failed. + +@ieanchor E405 +@cindex multithreading, not enabled +@cindex backtracking, not enabled +@cindex @code{WHILE}, not enabled +@cindex @code{MAYBE}, not enabled +@cindex @code{GO AHEAD}, not enabled +@cindex @code{GO BACK}, not enabled +@quotation +PROGRAM REJECTED FOR MENTAL HEALTH REASONS +@end quotation + +Your program used a construct that only makes sense when multithreading +or backtracking (@code{WHILE}, @code{MAYBE}, @code{GO BACK}, or @code{GO +AHEAD}), but you didn't specify the @option{-m} option (@pxref{-m}). If +you meant to write a multithreaded or backtracking program, just give +that option; if you didn't, be careful what words you use in comments! +This error happens at compile-time. + +@ieanchor E436 +@cindex @code{RETRIEVE}, without stashing +@cindex stash failure +@quotation +THROW STICK BEFORE RETRIEVING! +@end quotation + +In order to @code{RETRIEVE} a variable, it has to be @code{STASH}ed +first; if it isn't, then this error happens at runtime. + +@ieanchor E444 +@cindex @code{COME FROM}, no target +@cindex @code{NEXT FROM}, no target +@quotation +IT CAME FROM BEYOND SPACE +@end quotation + +A @code{COME FROM} aiming at a line label --- as opposed to a computed +@code{COME FROM}, which is allowed to be pointing at a nonexistent line +--- must point to a valid line label. The same applies to @code{NEXT +FROM}. This error happens at compile time if a nonexistent line label is +found in one of these contexts. + +@ieanchor E533 +@cindex overflow, over twospot +@cindex overflow, over 32 bits +@cindex twospot overflow +@cindex 32 bit overflow +@quotation +YOU WANT MAYBE WE SHOULD IMPLEMENT 64-BIT VARIABLES? +@end quotation + +This error is like E275 (@pxref{E275}), but applies when an attempt is +made at runtime to store a threespot value (or even a fourspot or +morespot value) in a twospot variable, or a threespot or greater value +is produced as an intermediate during a calculation (for instance by a +mingle operation). No values above twospot are allowed at any point +during an @ical{} program; if you want to process higher numbers, you +have to figure out a different way of storing them. + +@ieanchor E553 +@cindex buffer overflow +@quotation +BETTER LATE THAN NEVER +@end quotation +Oops! The compiler just noticed that it had a buffer overflow. +(Normally programs catch buffer overflows before they happen; +C-INTERCAL catches them just afterwards instead.) This only happens +on systems which don't have a modern C standard library. Try using +shorter or fewer filenames on the command line, to reduce the risk of +such an overflow. + +@ieanchor E555 +@cindex @code{COME FROM}, ambiguity +@quotation +FLOW DIAGRAM IS EXCESSIVELY CONNECTED +@end quotation + +Aiming two @code{COME FROM}s at the same line only makes sense in a +multithreaded program. In a non-multithread program, doing that will +cause this error at compile time (if neither @code{COME FROM} is +computed) or at run time (if the command that has just finished running +is simultaneously the target of two or more @code{COME FROM}s). This +either indicates an error in your program or that you've forgotten to +use the @option{-m} option (@pxref{-m}) if you are actually trying to +split the program into two threads. + +@ieanchor E562 +@cindex input, EOF +@cindex EOF +@cindex end of file +@quotation +I DO NOT COMPUTE +@end quotation + +The program asked for input, but for some reason it wasn't available. +(This is a runtime error, obviously.) The error may happen because the +input is being piped in from a command or file which has reached +end-of-file, or because the user typed @kbd{@key{CTRL}-@key{D}} +(UNIX/Linux) or @kbd{@key{CTRL}-@key{Z}} (DOS/Windows) while the program +was trying to @code{WRITE IN} some data. + +@ieanchor E579 +@cindex input, invalid +@quotation +WHAT BASE AND/OR LANGUAGE INCLUDES @var{string}? +@end quotation + +When reading spelt-out-digit input, the input didn't seem to be a valid +digit in English, Sanskrit, Basque, Tagalog, Classical Nahuatl, +Georgian, Kwakiutl, Volap@"uk, or Latin. This seems to have languages +covered pretty well; what on earth were you using, or did you just make +a spelling mistake? + +@ieanchor E621 +@cindex @code{RESUME}, by 0 +@quotation +ERROR TYPE 621 ENCOUNTERED +@end quotation + +The compiler encountered error E621 (@pxref{E621}). This happens at +runtime when the program requests that no entries are removed from the +@code{NEXT} stack (which is possible), but that the last entry removed +should be jumped to (which given the circumstances isn't, because no +entries were removed). + +@ieanchor E632 +@quotation +THE NEXT STACK RUPTURES. ALL DIE. OH, THE EMBARRASSMENT! +@end quotation + +When an attempt is made to @code{RESUME} past the end of the @code{NEXT} +stack, the program ends; however, this cause the program to end in a +manner other than via @code{GIVE UP} or @code{DON'T TRY AGAIN}, so an +error message must be printed, and this is that error message. + +@ieanchor E633 +@quotation +PROGRAM FELL OFF THE EDGE +@end quotation + +You can't just let execution run off the end of the program. At least, +that is, if it doesn't end with @code{TRY AGAIN}. An attempt to do that +causes this error at runtime. Note that if your program references the +system library, then it counts as being appended to your program and so +the program will run into the first line of the system library rather +than cause this error. As it happens, the first line of the system +library is a syntax error, so doing this will cause E000 (@pxref{E000}) +with the error text @samp{PLEASE KNOCK BEFORE ENTERING}. There isn't a +next statement to be executed with E633, so the next statement won't be +given in the error message. + +@ieanchor E652 +@cindex @code{PIN}, in a non-PIC program +@quotation +HOW DARE YOU INSULT ME! +@end quotation + +The @code{PIN} command doesn't make much sense for anything bigger than +a @acronym{PIC}; using it in a non-@acronym{PIC} program causes this +error at compile-time. Try using the normal input and output mechanisms +instead. This error may also be a clue that you are trying to compile a +@abbr{PIC-INTERCAL} program without giving the @option{-P} option +(@pxref{-P+,,-P}). + +@ieanchor E666 +@cindex out of memory, during compile +@cindex too many input files +@cindex line too long +@quotation +COMPILER HAS INDIGESTION +@end quotation + +There isn't a limit on the length of an input program other than your +computer's memory; if your computer does run out of memory during +compilation, it causes this error. This error can also be caused if +too many input files are specified on the command line; if you suspect +this is the problem, split the compilation into separate compilations +if you can, or otherwise you may be able to concatenate together your +input files into larger but fewer files. Yet another potential cause +of this error is if a line in an input program is too long; sensible +line-wrapping techniques are encouraged. + +@ieanchor E774 +@cindex random bug, error message +@quotation +RANDOM COMPILER BUG +@end quotation + +No compiler is perfect; sometimes errors just happen at random. In this +case, the random error is E774. If you don't like the idea that your +program may be shot down by a random compiler bug, or you are doing +something important, you can use the @option{-b} option (@pxref{-b}) to +prevent this bug happening. (You may wonder why this bug is in there at +all if it's so easily prevented. The answer is that such a bug was +present in the original @icst{} compiler, which also had an option to +turn the bug off. It's also a reward for people who actually read the +manual.) + +@ieanchor E777 +@cindex directory problems, source file +@cindex no source file +@quotation +A SOURCE IS A SOURCE, OF COURSE, OF COURSE +@end quotation + +You specified a file to compile on the command line, but the compiler +couldn't find or couldn't open it. This is almost certainly because you +made a typo specifying the file. + +@ieanchor E778 +@cindex internal errors +@quotation +UNEXPLANED COMPILER BUG +@end quotation + +This should never come up, either at compile time or at run time. It +could come up at either when an internal check by the compiler or the +runtime libraries realises that something has gone badly wrong; mistakes +happen, and in such cases the mistake will have been detected. (If this +happens at compile time you can use the @option{-U} option +(@pxref{-U+,,-U}) to cause the compiler to send an abort signal -- which +normally causes a core dump -- when the error happens, to help debug +what's causing it.) More often, this error comes up when the operating +system has noticed something impossible, like an attempt to free +allocated memory twice or to write to a null pointer, and tells the +compiler an error has occured, in which case the same response of +putting up this error happens. The point is that in all cases this +error indicates a bug in the compiler (even if it happens at run time); +in such cases, it would be very helpful if you figure out what caused it +and send a bug report (@pxref{Reporting Bugs}). + +@ieanchor E810 +@cindex yuk, input overflow +@quotation +ARE ONE-CHARACTER COMMANDS TOO SHORT FOR YOU? +@end quotation + +This is a debug-time error caused when you give too much input to the +debugger when all it wanted was to know what you wanted to do next. + +@ieanchor E811 +@cindex yuk, breakpoint overflow +@cindex yuk, too many breakpoints +@cindex breakpoints, too many +@quotation +PROGRAM IS TOO BADLY BROKEN TO RUN +@end quotation + +There's a limit to how many breakpoints you can have in a program; +you've broken the limit and therefore broken the debugger. This is a +debug-time error. + +@ieanchor E888 +@quotation +I HAVE NO FILE AND I MUST SCREAM +@end quotation +@cindex output file, failure to write + +The output file couldn't be written, maybe because the disk is full or +because there's already a read-only file with the same name. This is a +compile-time error. + +@ieanchor E899 +@quotation +HELLO? +CAN ANYONE GIVE ME A HAND HERE? +@end quotation +@cindex Funge, no external library +@cindex Befunge, no external library +@cindex external libraries, unavailable +@cindex .b98, no external library + +This error occurs at compile-time if a file type was requested for +which the required libraries are unavailable. (Support for Funge does +not ship with the compiler; instead, you need to generate the library +yourself from the cfunge sources. For more information, see +@ref{Creating the Funge-98 Library}.) + +@ieanchor E991 +@cindex out of memory, multithreading +@cindex out of memory, backtracking +@cindex multithreading, out of memory +@cindex backtracking, out of memory +@quotation +YOU HAVE TOO MUCH ROPE TO HANG YOURSELF +@end quotation + +There is no limit on the number of threads or choicepoints that you can +have in a multithreaded or backtracking program (in a program that isn't +multithreaded or backtracking, these are obviously limited to 1 and 0 +respectively). However, your computer may not be able to cope; if it +runs out of memory in the multithreader, it will cause this error at +runtime. + +@ieanchor E993 +@cindex @code{TRY AGAIN}, not last +@quotation +I GAVE UP LONG AGO +@end quotation + +@code{TRY AGAIN} has to be the last command in a program, if it's there +at all; you can't even follow it by comments, not even if you know in +advance that they won't be @code{REINSTATE}d. This error happens at +compile time if a command is found after a @code{TRY AGAIN}. + +@ieanchor E995 +@quotation +DO YOU REALLY EXPECT ME TO HAVE IMPLEMENTED THAT? +@end quotation + +Some parts of the code haven't been written yet. There ought to be no +way to cause those to actually run; however, if you do somehow find a +way to cause them to run, they will cause this error at compile time. + +@ieanchor E997 +@cindex whirlpool, in base 2 +@cindex sharkfin, in base 2 +@cindex TriINTERCAL, operators in base 2 +@quotation +ILLEGAL POSSESSION OF A CONTROLLED UNARY OPERATOR +@end quotation + +Some operators (such as whirlpool (@code{@@}) and sharkfin (@code{^})) +only make sense in @abbr{TriINTERCAL} programs, and some have a minimum +base in which they make sense. This error happens at compile-time if +you try to use an operator that conflicts with the base you're in (such +as using @abbr{TriINTERCAL} operators in an @ical{} program in the +default base 2). + +@ieanchor E998 +@cindex unsupported file type +@cindex file type, unsupported +@quotation +EXCUSE ME, +YOU MUST HAVE ME CONFUSED WITH SOME OTHER COMPILER +@end quotation + +This error occurs just before compile-time if a file is encountered on +the command line that C-INTERCAL doesn't recognise. (If this error +occurs due to a @samp{.a}, @samp{.b98}, @samp{.c}, or @samp{.c99}, +then you forgot to enable the external calls system using @option{-e} +(@pxref{-e}).) + +@ieanchor E999 +@cindex skeleton file, errors +@quotation +NO SKELETON IN MY CLOSET, WOE IS ME! +@end quotation + +The skeleton file @file{ick-wrap.c} or @file{pickwrap.c} is needed to be +able to compile @ical{} to C. If the compiler can't find it, it will +give this error message. This indicates a problem with the way the +compiler has been installed; try using the @option{-u} option +(@pxref{-u}) to find out where it's looking (you may be able to place a +copy of the skeleton file in one of those places). + +@end table + +@node Warnings +@section Warnings +@cindex warnings +@cindex @command{ick}, warnings + +This is a list of the warnings stored in the warning database. +Warnings only come up when the @option{-l} option (@pxref{-l}) is +given; even then, some of the warnings are not currently implemented +and therefore will never come up. + +@table @asis + +@ieanchor W016 +@quotation +DON'T TYPE THAT SO HASTILY +@end quotation + +The positional precedence rules for unary operators are somewhat +complicated, and it's easy to make a mistake. This warning is meant to +detect such mistakes, but is not currently implemented. + +@ieanchor W018 +@quotation +THAT WAS MEANT TO BE A JOKE +@end quotation + +If an @ical{} expression has been translated from another language such +as C, the optimiser is generally capable of translating it back into +something similar to the original, at least in base 2. When after +optimisation there are still @ical{} operators left in an expression, +then this warning is produced. (Therefore, it's likely to come up quite +a lot if optimisation isn't used@!) The system library produces some of +these warnings (you can tell if a warning has come up in the system +library because you'll get a line number after the end of your program). + +@ieanchor W112 +@cindex warnings, non-INTERCAL-72 +@cindex non-INTERCAL-72 warning +@quotation +THAT RELIES ON THE NEW WORLD ORDER +@end quotation + +This warning comes up whenever the compiler recognises that you've added +some code that didn't exist in @icst{}. This allows you to check +whether your code is valid @icst{} (although @option{-t} (@pxref{-t}) is +more useful for that); it also warns you that code might not be portable +(because @icst{} is implemented by most @ical{} compilers, but more +recent language features may not be). + +@ieanchor W128 +@quotation +SYSLIB IS OPTIMIZED FOR OBUSCATION +@end quotation + +There is an idiom used in the system library that does a right-shift by +selecting alternate bits from a twospot number and then mingling them +the other way round. A rightshift can much more easily be done with a +single rightshift, so this is a silly way to do it, and this warning +warns that this idiom was used. However, the present optimizer is +incapable of recognising whether this problem exists or not, so the +warning is not currently implemented. + +@ieanchor W276 +@cindex onespot, overflow warning +@cindex overflow, warning +@quotation +YOU CAN'T EXPECT ME TO CHECK BACK THAT FAR +@end quotation + +It's an error to assign a twospot value (a value over 65535) to a +onespot variable, or to use it as an argument to a mingle. If the +optimizer can't guarantee at compile time that there won't be an +overflow, it issues this warning. (Note that this doesn't necessarily +mean there's a problem --- for instance, the system library generates +some of these warnings --- only that the optimiser couldn't work out for +sure that there wasn't a problem.) + +@ieanchor W239 +@quotation +WARNING HANDLER PRINTED SNIDE REMARK +@end quotation + +Your code looks like it's trying to assign 0 to an array, giving it no +dimension; this is an error. This warning is produced at compile time +if it looks like a line in your code will cause this error, but it isn't +necessarily an error because that line of code might never be executed. + +@ieanchor W278 +@quotation +FROM A CONTRADICTION, ANYTHING FOLLOWS +@end quotation + +It's sometimes impossible to reverse an assignment (a reverse +assignment can happen if the @option{-v} option (@pxref{-v}) is used +and an expression is placed on the left of an assignment, or in +operand overloading); if the compiler detects that a reversal failure +is inevitable, it will cause this warning. Note that this doesn't +always cause an error, because the relevant code might never be +executed. + +@ieanchor W450 +@quotation +THE DOCUMENTOR IS NOT ALWAYS RIGHT +@end quotation + +There is no way to get this warning to come up; it isn't even written +anywhere in @cic{}'s source code, is not implemented by anything, and +there are no circumstances in which it is even meant to come up. It is +therefore not at all obvious why it is documented. + +@ieanchor W534 +@cindex unary operators, portability +@cindex portability, unary operators +@quotation +KEEP LOOKING AT THE TOP BIT +@end quotation + +@cic{} uses a slightly different typing mechanism to some other @ical{} +compilers; types are calculated at compile time rather than run time. +This only makes a difference in some cases involving unary operators. +It's impossible to detect at compile time for certain whether such a +case has come up or not, but if the compiler or optimizer thinks that +such a case might have come up, it will issue this warning. + +@ieanchor W622 +@quotation +WARNING TYPE 622 ENCOUNTERED +@end quotation + +Your code looks like it's trying to resume by 0; this is an error. This +warning is produced at compile time if it looks like a line in your code +will cause this error, but it isn't necessarily an error because that +line of code might never be executed. + +@end table + +@node The yuk debugger +@chapter The yuk debugger +@cindex yuk +@cindex debugging, yuk +@cindex debugging, runtime +@cindex runtime debugger +@anchor{yuk} + +The @cic{} distribution contains a runtime debugger called `yuk'. +Unlike most other debuggers, it is stored as object code rather than as +an executable, and it is compiled into the code rather than operating on +it. To debug code, add @option{-y} (@pxref{-y}) to the command line of +@command{ick} when invoking it; that tells it to compile the debugger +into the code and then execute the resulting combination. (The +resulting hybrid debugger/input executable is deleted afterwards; this +is to prevent it being run by mistake, and to prevent spreading the +debugger's licence onto the code it was compiled with.) + +yuk can also be used as a profiler using the @option{-p} option +(@pxref{-p}); this produces a file @file{yuk.out} containing information +on how much time was spent running each command in your program, and +does not prompt for debugger commands. + +Note that some command line arguments are incompatible with the +debugger, such as @option{-m} and @option{-f}. In particular, this +means that multithreaded programs and programs that use backtracking +cannot be debugged using this method; the @option{+printflow} option +(@pxref{+printflow}) to a compiled program may or may not be useful for +debugging multithreaded programs. + +When the debugger starts, it will print a copyright message and a +message on how to access online help; then you can enter commands to +run/debug the program. The debugger will show a command prompt, +@samp{yuk007 }, to let you know you can input a command. + +@cindex yuk, commands +Here are the commands available. Commands are single characters +followed by newlines, or followed by a line number (in decimal) and a +newline or a variable name (a @code{.}, @code{,}, @code{:} or @code{;} +followed by a number in decimal; note that some commands only allow +onespot and twospot variables as arguments). + +@multitable @columnfractions .15 .85 +@headitem Command @tab Description +@item a@var{LINE} +@tab +All non-abstained commands on line @var{LINE} become abstained from +once. +@item b@var{LINE} +@tab +A breakpoint is set on line @var{LINE}. The breakpoint causes execution +with @samp{c} to stop when it is reached. +@item c +@tab +The program is run until it ends (which also ends the debugger) or a +breakpoint is reached. +@item d@var{LINE} +@tab +Any breakpoint that may be on line @var{LINE} is removed. +@item e@var{LINE} +@tab +An explanation of the main expression in each command on line @var{LINE} +is printed to the screen. The explanation is in the same format as the +format produced by @option{-h} (@pxref{-h}) and shows what the optimiser +optimised the expression to (or the original expression if the optimiser +wasn't used). +@item f@var{LINE} +@tab +Removes the effect of the @samp{m} command on line @var{LINE}. +@item g@var{LINE} +@tab +Causes the current command to be the first command on @var{LINE} (if not +on that line already) or the next command on @var{LINE}, as if that line +was @code{NEXT}ed to and then that @code{NEXT} stack item was forgotten. +@item h +@tab +Lists 10 lines either side of the current line; if there aren't 10 lines +to one or the other side of the current line, instead more lines will be +shown on the other side to compensate, if available. +@item i@var{VAR} +@tab +Causes variable @var{VAR} to become @code{IGNORE}d, making it read-only. +@item j@var{VAR} +@tab +Causes variable @var{VAR} to become @code{REMEMBER}ed, making it no +longer read-only. +@item k +@tab +Continues executing commands until the @command{NEXT} stack is the same +size or smaller than it was before. In other words, if the current +command is not a @command{NEXT} and doesn't have a @command{NEXT FROM} +aiming at it, one command is executed; but if a @command{NEXT} does +happen, execution will continue until that @command{NEXT} returns or is +forgotten. A breakpoint or the end of the program also end this. +@item l@var{LINE} +@tab +Lists 10 lines of source code either side of line @var{LINE}, the same +way as with @samp{h}, but using a line stated in the command rather than +the current line. +@item m@var{LINE} +@tab +Produces a message onscreen every time a command on line @var{LINE} is +executed, but without interrupting the program. +@item n +@tab +Show the @command{NEXT} stack on the screen. +@item o +@tab +Continue executing commands until the @command{NEXT} stack is smaller +than it was before. If you are using @command{NEXT}s like procedures, +then this effectively means that the procedure will run until it +returns. A breakpoint or the end of the program also end this. +@item p +@tab +Displays the value of all onespot and twospot variables. +@item q +@tab +Aborts the current program and exits the debugger. +@item r@var{LINE} +@tab +Reinstates once all abstained commands on line @var{LINE}. +@item s +@tab +Executes one command. +@item t +@tab +Continues execution until the end of the program or a breakpoint: each +command that executes is displayed while this command is running. +@item u@var{LINE} +@tab +Continues execution of the program until just before a command on line +@var{LINE} is run (or a breakpoint or the end of the program). +@item v@var{VAR} +@tab +Adds a `view' on variable @var{VAR} (which must be onespot or twospot), +causing its value to be displayed on the screen whenever a command is +printed on screen (for instance, because the command has just been +stepped past, or due to the @samp{m} or @samp{t} commands). +@item w +@tab +Displays the current line and current command onscreen. +@item x@var{VAR} +@tab +Removes any view and any action that may be associated with it on +variable @var{VAR} (which must be onespot or twospot). +@item y@var{VAR} +@tab +Adds a view on variable @var{VAR}; also causes a break, as if a +breakpoint was reached, whenever the value of that variable changes. +@item z@var{VAR} +@tab +Adds a view on variable @var{VAR}; also causes a break, as if a +breakpoint was reached, whenever that variable's value becomes 0. +@item @var{VAR} +@tab +A onespot or twospot variable written by itself prints out the value of +that variable. +@item <@var{VAR} +@tab +@command{WRITEs IN} a new value for variable @var{VAR}. Note that input +must be in the normal @samp{ONE TWO THREE} format; input in any other +format will cause error E579 (@pxref{E579}) and as that is a fatal +error, the debugger and program it's debugging will end. +@item * +@tab +Displays the license conditions under which @command{ick} is +distributed. +@item ? +@tab +Displays a summary of what each command does. (@samp{@@} does the same +thing.) +@end multitable + +While the code is executing (for instance, during a @samp{c}, @samp{k}, +@samp{o}, @samp{t} or @samp{u} command), it's possible to interrupt it +with @kbd{@key{CTRL}-@key{C}} (on UNIX/Linux) or +@kbd{@key{CTRL}-@key{BREAK}} (on Windows/DOS); this will cause the +current command to finish running and the debugger prompt to come back +up. + +@ifset notsplit +@partheading{PART II: THE @ical{} LANGUAGE} +@end ifset +@node Syntax +@chapter Syntax +@cindex syntax, INTERCAL +@cindex INTERCAL, syntax + +@ical{} programs consist of a list of statements. Execution of a +program starts with its first statement; generally speaking each +statement runs after the previous statement, although many situations +can change this. + +Whitespace is generally insignificant in @ical{} programs; it cannot be +added in the middle of a keyword (unless the keyword contains whitespace +itself) or inside a decimal number, but it can be added more or less +anywhere else, and it can be removed from anywhere in the program as +well. + +An @ical{} statement consists of an optional line label, a statement +identifier, an optional execution chance, the statement itself +(@pxref{Statements}), and optionally @code{ONCE} or @code{AGAIN}. + +@menu +* Princeton and Atari Syntax:: There are two syntaxes for @ical{} +* Line Labels:: Allowing lines to be referred to +* Statement Identifiers:: Marking the start of a statement +* Execution Chance:: Statements that might not execute +* ONCE and AGAIN:: Self-abstaining and self-reinstating statements +@end menu + +@node Princeton and Atari Syntax +@section Princeton and Atari Syntax +@cindex syntax, dialects +@cindex dialects of syntax +@cindex character sets + +The history of @ical{} is plagued with multiple syntaxes and character +sets. The result has settled down with two versions of the syntax; +the original Princeton syntax, and the Atari syntax (which is more +suited to the operating systems of today). + +@cindex syntax, Princeton +@cindex Princeton syntax +@subheading Princeton syntax +@portability{some versions, version 0.18+, all versions, no} + +The original @icst{} compiler was the Princeton compiler, which +introduced what has become known as the Princeton syntax for @ical{}; +this is the syntax used in the original manual, for instance, and can +be considered to be the `original' or `official' @ical{} syntax. It +is notable for containing various characters not found in some +character sets; for instance, it writes the operator for mingle as a +cent sign (known as `change'). The other operator that often causes +problems is the bookworm operator @samp{V}, backspace, @samp{-}, which +is used for exclusive-or; the backspace can cause problems on some +systems (which was probably the original intention). This syntax is +also the default syntax in the @clcic{} compiler, which is the @i{de +facto} standard for expanding the Princeton syntax to modern @ical{} +features that are not found in @icst{}; however, it does not appear to +have been used as the default syntax in any other compilers. +Nowadays, there are other ways to write the required characters than +using backspace; for instance, the cent sign appears in Latin-1 and +UTF-8, and there are various characters that approximate bookworms +(for instance, @clcic{} uses the Latin-1 yen symbol for this, which +just to make things confusing, refers to a mingle in modern Atari +syntax). + +@cindex syntax, Atari +@cindex Atari syntax +@subheading Atari syntax +@portability{some versions, yes, version 0.05+, yes} + +The other main syntax is the Atari syntax, so called because it was +originally used by the ``Atari implementation'' of @icst{}. It is not +clear why the implementation was given this name, because the authors +of the implementation are not known; it is not clear whether it has +any connection with Atari other than running on an Atari computer, for +instance. The syntax was designed to work better on ASCII-based +systems, by avoiding the change character (although it can still be +written as @samp{c}, backspace, @samp{/}, which the Atari compiler +documentation claims that the Princeton compiler supported) in favour +of a `big money' character (@samp{$}), and using the `what' (@samp{?}) +as an alternative character for exclusive-or. This is the syntax that +@cic{} and @jic{} have always used, and is the one most commonly used +for communicating @ical{} programs on Usenet and other similar fora +(where ASCII is one of the most reliable-to-send character sets). It +is also the syntax used for examples in this manual, for much the same +reason. The Atari syntax for constructs more modern than @icst{} is +normally taken to be that used by the @cic{} compiler, because it is +the only Atari-syntax-based compiler that contains non-@icst{} +constructs that actually need their own notation. + +@node Line Labels +@section Line Labels +@cindex line label +@cindex line number + +@portability{yes, all versions, all versions, all versions} + +The first part of an @ical{} statement is a line label that specifies +what its line number is. This is optional; it's allowed to have a +statement without a line number, although that prevents other commands +referring to it by number. Line numbers must be constants, and unique +within the program. However, they do not have to be in order; unlike +some other languages with line numbers, a line with a higher number can +come earlier in the program than a line with a lower number, and the +numbers don't affect the order in which commands are executed. + +A line label is a integer expressed in decimal within a wax/wane pair +(@code{(} and @code{)}). For instance, this is a valid line label: + +@example +(1000) +@end example + +Note that line numbers from 1000 to 1999 are used by the system library, +so using them within your own programs may produce unexpected errors if +the system library is included. Apart from this, line numbers from 1 to +65535 are allowed. + +It has become reasonably customary for people writing @ical{} libraries +to pick a range of 1000 line numbers (for instance, 3000 to 3999) and +stick to that range for all line numbers used in the program (apart from +when calling the system library), so if you want to write an @ical{} +library, it may be a good idea to look at the existing libraries (in the +@file{pit/lib} directory in the @cic{} distribution) and choose a range +of numbers that nobody else has used. If you aren't writing a library, +it may be a good idea to avoid such number ranges (that is, use only +line numbers below 1000 or very high numbers that are unlikely to be +used by libraries in the future), so that you can easily add libraries +to your program without renumbering in the future. + +@node Statement Identifiers +@section Statement Identifiers +@cindex statement identifier +@findex DO +@findex PLEASE +@findex NOT +@findex N'T +@cindex abstain, at program start +@cindex reinstate, at program start +@cindex initial abstention +@cindex abstained state +@cindex reinstated state + +@portability{yes, all versions, all versions, all versions} + +After the line label (if a statement has one) comes the statement +identifier, which marks where the statement starts. Either the label or +the statement identifier, whichever one comes first, marks where the +preceding statement finishes. + +@anchor{DO}@anchor{PLEASE} +The main statement identifier is @code{DO}. It also has two synonyms, +@code{PLEASE} and @code{PLEASE DO}; these synonyms are the 'polite' +forms of statement identifiers. Although the three identifiers have the +same meaning, using either polite or non-polite identifiers too much can +cause an error; the correct proportion is approximately 3 non-polite +identifiers for every polite identifier used. None of these identifiers +actually does anything else apart from marking where the statement +starts; they leave the statements in the default `reinstated' state. + +@anchor{NOT}@anchor{N'T} +Adding @code{NOT} or @code{N'T} to the end of any of these identifiers, +to create a statement identifier such as @code{DO NOT} or @code{PLEASE +DON'T}, also creates a valid statement identifier. These differ in +meanings from the previous set of identifiers, though; they cause the +statement they precede to not be executed by default; that is, the +command will be skipped during execution (this is known as the +`abstained' state). This applies even if the command in question is in +fact a syntax error, thus causing this to be a useful method of writing +comments. One common idiom is to write code like this: + +@example +PLEASE NOTE: This is a comment. +@end example + +The statement identifier (@code{PLEASE NOT}) is the only part of this +statement that is valid @ical{}; however, because the statement +identifier is in the negated form that contains @code{NOT}, the syntax +error won't be executed, and therefore this is a valid statement. (In +@ical{}, syntax errors happen at runtime, so a program containing a +statement like @code{DOUBT THIS WILL WORK} will still compile, and will +not end due to the syntax error unless that statement is actually +executed. @xref{E000}.) + +The @code{ABSTAIN} and @code{REINSTATE} statements can override the +@code{NOT} or otherwise on a statement identifier; see @ref{ABSTAIN}. + +In backtracking programs, @code{MAYBE} is also a valid statement +identifier; see @ref{MAYBE}. It comes before the other keywords in the +statement identifier, and an implicit @code{DO} is added if there wasn't +one already in the statement identifier (so @code{MAYBE}, @code{MAYBE +DO}, @code{MAYBE DON'T}, @code{MAYBE PLEASE}, and so on are all valid +statement identifiers). + +@node Execution Chance +@section Execution Chance +@cindex execution chance +@cindex double-oh-seven +@findex % + +@portability{yes, all versions, version 0.02+, all versions} + +It's possible to specify that a command should be run only a certain +proportion of the time, at random. This is a rarely used feature of +@ical{}, although it is the only way to introduce randomness into a +program. (The @cic{} compiler approximates this with pseudorandomness.) +An execution chance specification comes immediately after the statement +identifier, but before the rest of the statement, and consists of a +double-oh-seven (@code{%}) followed by an integer from 1 to 99 +inclusive, written in decimal; this gives the percentage chance of the +statement running. The execution chance only acts to prevent a +statement running when it otherwise would have run; it cannot cause a +statement that would otherwise not have run to run. For instance, the +statement @code{DO %40 WRITE OUT #1} has a 40% chance of writing out +@samp{I}, but the statement @code{DON'T %40 WRITE OUT #1} has no chance +of writing out @code{I} or anything else, because the @code{N'T} +prevents it running and the double-oh-seven cannot override that. + +@node ONCE and AGAIN +@section ONCE and AGAIN +@cindex ABSTAIN, self-abstaining +@cindex REINSTATE, self-reinstating +@cindex self-abstaining +@cindex self-reinstating +@findex ONCE +@findex AGAIN +@anchor{ONCE}@anchor{AGAIN} + +@portability{no, version 0.25+, no, no} + +The last part of a statement is an optional @code{ONCE} or @code{AGAIN}. +@code{ONCE} specifies that the statement is self-abstaining or +self-reinstating (this will be explained below); @code{AGAIN} specifies +that the statement should behave like it has already self-reinstated or +self-abstained. Whether the behaviour is self-abstention or +self-reinstatement depends on whether the statement was initially +abstained or not; a @code{ONCE} on an initially reinstated statement or +@code{AGAIN} on an initially abstained statement indicates a +self-abstention, and a @code{ONCE} on an initially abstained statement +or @code{AGAIN} on an initially reinstated statement indicates a +self-reinstatement. + +The first time a self-abstaining statement is encountered, it is +executed as normal, but the statement is then abstained from and +therefore will not run in future. Likewise, the first time +self-reinstating statement is encountered, it is not executed (as is +normal for an abstained statement), but then becomes reinstated and will +run in future. In each of these cases, the @code{ONCE} effectively +changes to an @code{AGAIN}; the @code{ONCE} only happens once, as might +be expected. + +@code{REINSTATING} a currently abstained self-abstaining statement or +@code{ABSTAINING} (that is, with the @code{ABSTAIN} or @code{REINSTATE} +commands) a currently reinstated self-reinstating statement causes the +@code{AGAIN} on the statement to change back into a @code{ONCE}, so the +statement will again self-abstain or self-reinstate. Likewise, +@code{REINSTATING} a currently abstained self-reinstating statement or +@code{ABSTAINING} a currently reinstated self-abstaining statement +causes its @code{ONCE} to turn into an @code{AGAIN}. + +Historical note: @code{ONCE} was devised by Malcom Ryan as a method of +allowing synchronisation between threads in a multithreaded program +(@code{ONCE} is atomic with the statement it modifies, that is, there is +no chance that threads will change between the statement and the +@code{ONCE}). @code{AGAIN} was added to Malcom Ryan's Threaded Intercal +standard on the suggestion of Kyle Dean, as a method of adding extra +flexibility (and to allow the @code{ONCE}s to happen multiple times, +which is needed to implement some multithreaded algorithms). + +@node Expressions +@chapter Expressions +@cindex expressions + +Many @ical{} statements take expressions as arguments. Expressions are +made up out of operands and operators between them. Note that there is +no operator precedence in @ical{}; different compilers resolve +ambiguities different ways, and some versions of some compilers +(including the original @icst{} compiler) will cause error messages on +compiling or executing an ambiguous expression, so it's safest to fully +group each expression. + +@menu +* Constants and Variables:: The basic operands that make up expressions +* Grouping Rules:: How to specify grouping in expressions +* Operators:: Joining operands into more complex expressions +@end menu + +@node Constants and Variables +@section Constants and Variables +@cindex constant +@cindex variable +@cindex mesh +@cindex onespot +@cindex twospot +@cindex tail +@cindex hybrid +@findex # +@findex . +@findex : +@findex , +@findex ; + +@portability{yes, all versions, all versions, all versions} + +The basic operands in @ical{} are constants and variables. These +together make up what in other languages are known as `lvalues', that +is, operands to which values can be assigned. (Constants can also be +lvalues in @ical{}, but by default @cic{} turns this off because it +carries an efficiency penalty and can be confusing; this can be turned +on with the @option{-v} option (@pxref{-v}).) + +Constants can have any integer value from 0 to 65535 inclusive; higher +values (up to 4294967295) can be generated in programs, but cannot be +specified literally as constants. (The usual way to work around this +limitation is to interleave two constants together; see @ref{Mingle}.) A +constant is written as a mesh (@code{#}) followed by a number in +decimal. At the start of the program, all constants have the same value +as the number that identifies them; for instance, @code{#100} has 100 as +its value, and it's strongly advised not to change the value of a +constant during the execution of a program. + +There are four types of variable: 16-bit and 32-bit unsigned integers, +and arrays of 16-bit and 32-bit unsigned integers. These are +represented with a spot, twospot, tail, and hybrid (@code{.}, @code{:}, +@code{,}, and @code{;}) respectively. For this reason, integers within +the range 0 to 65535 inclusive are known as `onespot numbers', and +integers within the range 0 to 4294967295 inclusive are known as +`twospot numbers'; variables with those ranges are known as onespot and +twospot variables. (Note that arrays did not work in @cic{} before +version 0.7.) + +Variables are represented with a character representing their data type, +followed by an integer from 1 to 65535 inclusive, written in decimal. +Non-array variables don't need to be declared before they are used; they +automatically exist in any program that uses them. For instance, +@code{.1} and @code{.001} are the same variable, onespot number 1. +Array variables need to be dimensioned before they are used, by +assigning dimensions to them; see @ref{Calculate}. + +@node Grouping Rules +@section Grouping Rules +@cindex grouping rules +@cindex positional precedence +@cindex spark +@cindex rabbit-ears +@cindex ears +@findex ' +@findex " + +Because there are no operator precedences in @ical{}, there are various +solutions to specifying what precedences actually are. + +@table @asis + +@item The portable solution + +All known versions of @ical{} accept the @icst{} grouping rules. These +state that it's possible to specify that an operator takes precedence by +grouping it inside sparks (@code{'}) or rabbit-ears (@code{"}), the same +way as wax/wane pairs (parentheses) are used in other programming +languages. @icst{} and earlier @cic{} versions demanded that +expressions were grouped fully like this, and this practice is still +recommended because it leads to portable programs and is easier to +understand. Whether sparks or rabbit-ears (often called just `ears' for +short) are used normally doesn't matter, and programmers can use one or +the other for clarity or for aesthetic appeal. (One common technique is +to use just sparks at the outermost level of grouping, just ears at the +next level, just sparks at the next level, and so on; but expressions +like @code{''#1~#2'~"#3~#4"'~#5} are completely unambiguous, at least to +the compiler.) + +There are, however, some complicated situations involving array +subscripting where it is necessary to use sparks and ears at alternate +levels, if you want to write a portable program. This limitation is in +@cic{} to simplify the parsing process; @icst{} has the same limitation, +probably for the same reason. Compare these two statements: + +@example +DO .1 <- ,3SUB",2SUB.1".2 +DO .1 <- ,3SUB",2SUB.1".2~.3"".4 +@end example + +The problem is that in the first statement, the ears close a group, and +in the second statement, the ears open a group, and it's impossible to +tell the difference without unlimited lookahead in the expression. +Therefore, in similar situations (to be precise, in situations where a +group is opened inside an array subscript), it's necessary to use the +other grouping character to the one that opened the current group if you +want a portable program. + +One final comment about sparks and rabbit-ears; if the next character in +the program is a spot, as often happens because onespot variables are +common choices for operands, a spark and the following spot can be +combined into a wow (@code{!}). Unfortunately, none of the character +sets that @cic{} accepts as input (UTF-8, Latin-1, and ASCII-7) contain +the rabbit character, although the Hollerith input format that @clcic{} +can use does. + +@item Positional precedences: @clcic{} rules + +The precedence rules used by @clcic{} for grouping when full grouping +isn't used are simple to explain: the largest part of the input that +looks like an expression is taken to be that expression. The main +practical upshot of this is that binary operators right-associate; that +is, @code{.1~.2~.3} is equivalent to @code{.1~'.2~.3'}. @cic{} versions +0.26 and later also right-associate binary operators so as to produce +the same results as @clcic{} rules in this situation, but as nobody has +yet tried to work out what the other implications of @clcic{} rules are +they are not emulated in @cic{}, except possibly by chance. + +@ianchor Prefix and infix unary operators +@cindex unary operator, prefix +@cindex unary operator, infix + +In @icst{} and versions of @cic{} before 0.26, unary operators were +always in the `infix' position. (If you're confused about how you can +have an infix unary operator: they go one character inside a group that +they apply to, or one character after the start of a constant or +variable representation; so for instance, to portably apply the unary +operator @code{&} to the variable @code{:1}, write @code{:&1}, and to +portably apply it to the expression @code{'.1~.2'}, write +@code{'&.1~.2'}.) @clcic{}, and versions of @cic{} from 0.26 onwards, +allow the `prefix' position of a unary operator, which is just before +whatever it applies to (as in @code{&:1}). This leads to ambiguities as +to whether an operator is prefix or infix. The portable solution is, of +course, to use only infix operators and fully group everything, but when +writing for recent versions of @cic{}, it's possible to rely on its +grouping rule, which is: unary operators are interpreted as infix where +possible, but at most one infix operator is allowed to apply to each +variable, constant, or group, and infix operators can't apply to +anything else. So for instance, the @cic{} @code{'&&&.1~.2'} is +equivalent to the portable @code{'&"&.&1"~.2'} (or the more readable +version of this, @code{"&'"&.&1"~.2'"}, which is also portable). If +these rules are counter-intuitive to you, remember that this is @ical{} +we're talking about; note also that this rule is unique to @cic{}, at +least at the time of writing, and in particular @clcic{} is likely to +interpret this expression differently. + +@end table + +@node Operators +@section Operators +@cindex operator + +Operators are used to operate on operands, to produce more complicated +expressions that actually calculate something rather than just fetch +information from memory. There are two types of operators, unary and +binary operators, which operate on one and two arguments respectively. +Binary operators are always written between their two operands; to +portably write a unary operator, it should be in the `infix' position, +one character after the start of its operand; see @ref{Prefix and infix +unary operators} for the full details of how to write unary operators +portably, and how else you can use them if you aren't aiming for +portability. This section only describes @icst{} operators; many +@ical{} extensions add their own operators. + +@menu +* Mingle:: Interleaving bits in two operands +* Select:: Selecting from one operand according to another +* Unary Binary Logic:: Binary logic on adjacent bits of an operand +* Array Subscript:: Selecting elements of arrays +@end menu + +@node Mingle +@subsection Mingle +@cindex mingle +@cindex interleave +@findex $ + +@portability {yes, all versions, all versions, all versions} + +Mingle, or interleave, is one of the two binary operators in @icst{}. +However, different @ical{} compilers represent it in different ways, so +it is impossible to write a mingle in a program completely portably, +because it differs between Princeton and Atari syntax, and worse, the +sequence of character codes needed to represent it in each syntax has +varied from compiler to compiler. + +The original @icst{} compiler (the Princeton compiler) used the +'change' (cent) character for a mingle, represented as @code{c}, +backspace, @code{/}. (By the way, this is still the most portable way +to write a mingle; both @cic{} and @clcic{} accept it, at least if a +lowercase @code{c} is used, the Atari compiler accepted it, and its +documentation claimed that the Princeton compiler also accepted it; +@clcic{} also accepts a capital @code{C} before the backspace and +@code{/}, and allows @code{|} rather than @code{/}.) The Atari +compiler, another @icst{} compiler, used a 'big money' character +(@code{$}) as the mingle character; this character is also the only +one accepted for mingle by the @jic{} compiler. @cic{} originally +also used the @code{$} character for mingle, and this character is the +one most commonly seen in existing @cic{} programs, and most often +used when giving examples of @ical{} on Usenet, because it exists in +the ASCII-7 character set, and because it doesn't contain control +characters. From version 0.18 of @cic{} onwards, various other units +of currency (change, quid, and zlotnik if Latin-1 is used as the +input, and euro if Latin-9 is used as the input) are accepted; from +version 0.20 onwards, in addition to the Latin-1 characters, all the +currency symbols in Unicode are accepted if UTF-8 is used as the input +format. @clcic{} has always used the change character (either the +Latin-1 version or the version that contains a backspace) for mingle. +In this manual, mingle will be represented as @code{$}, but it's +important to bear in mind that this character is not the most portable +choice. + +The mingle operator should be applied to two operands or expressions. +To be portable, the operands must both be onespot expressions, that is +expressions which have a 16-bit result; @cic{} relaxes this rule +slightly and only requires that the result be in the onespot range. +(This is because the data type of a select operator's value is meant to +be determined at runtime; @cic{} determines all data types at compile +time, so has to guess a 32-bit result for a select with a 32-bit type as +its right operand even when the result might actually turn out to be of +a 16-bit type, and so this behaviour prevents an error when a select +operation returns a value with a 16-bit data type and is used as an +argument to a mingle.) The result is a 32-bit value (that is, it is of a +32-bit data type, even if its value fits into the onespot range), which +consists of bits alternated from the two arguments; to be precise, its +most significant bit is the most significant bit of its first argument, +its second most significant bit is the most significant bit of its +second argument, its third most significant bit is the second most +significant bit of its first argument, and so on until its least +significant bit, which is the least significant bit of its second +argument. + +One of the most common uses of interleaving is to create a constant with +a value greater than 65535; for instance, 65536 is @code{#256$#0}. It +is also commonly used in expressions that need to produce 32-bit +results; except in some simple cases, this is usually coded by +calculating separately the odd-numbered and even-numbered bits of the +result, and mingling them together at the end. It is also used in +expressions that need to left-shift values or perform similar +value-increasing operations, as none of the other operators can easily +do this; and mingle results are commonly used as the argument to unary +binary logic operators, because this causes them to behave more like the +binary logic operators found in some other languages. + +@node Select +@subsection Select + +@portability{yes, all versions, all versions, all versions} + +The select operator is one of the two binary operators in @icst{}; +unlike mingle, every known implementation of @ical{} ever has used the +sqiggle character (@code{~}) as the representation of the select +operator, meaning that writing it portably is easy. + +The select operator takes two arguments, which can be of either +datatype (that is, 16- or 32-bit). It returns a value made by +selecting certain bits of its first operand indicated by the second +operand, and right-justifying them. What it does is that it ignores +all the bits of the first operand where the second operand has a 0 as +the corresponding bit, that is, deletes them from a copy of the +operand's value; the bits that are left are squashed together towards +the least-significant end of the number, and the result is filled with +0s to make it up to 16 or 32 bits. (In @icst{} the minimum multiple +of 16 bits possible that the result fits into is chosen, although if +:1 has the value 131061 (in hex, 1FFFF) the expression @code{#21~:1} +produces a 32-bit result because 17 bits were selected, even though +many of the leading bits were zeros; in @cic{} the data type of the +result is the same as of the right operand of the select, so that it +can be determined at compile time, and so using a unary binary logic +operator on the result of select when the right operand has a 32-bit +type is nonportable and not recommended.) As an example, +@code{#21~:1} produces 21 as its result if :1 has the value 131061, 10 +as its result if :1 has the value 30 (1E in hex; the least significant +bit of 21 is removed because it corresponds to a 0 in :1), and 7 as +its result if :1 has the value 21 (because three bits in 21 are set, +and those three bits from 21 are therefore selected by 21). + +Select is used for right-shifts, to select every second bit from a +number (either to produce what will eventually become an argument to +mingle, or to interpret the result of a unary binary logic operator, or +occasionally both), to test if a number is zero or not (by selecting it +from itself and selecting 1 from the result), in some cases as a limited +version of bitwise-and (that only works if the right operand is 1 less +than a power of 2), and for many other purposes. + +@node Unary Binary Logic +@subsection Unary Binary Logic +@cindex unary binary logic +@cindex and +@cindex or +@cindex xor +@cindex exor +@cindex exclusive or +@findex ? +@findex & +@findex V +@cindex what +@cindex ampersand +@cindex book + +@portability{yes, all versions, all versions, all versions} + +There are three unary operators in @icst{}, each of which carries out +a binary logic operation on adjacent bits of the number. The operators +are and, or, and exclusive or; and and or are represented by an +ampersand (@code{&}) and book (@code{V}) respectively, and exclusive +or has the same notational problems as mingle, as it differs between +Princeton and Atari syntax. It was represented by a bookworm, written +@code{V}, backspace, @code{-}, in the Princeton @icst{} +implementation, and this is still the most portable way to write it +(@cic{} and @clcic{} accept it). The Atari implementation of @icst{} +wrote it with a what (@code{?}), and this is the representation +originally used by @cic{} (and still accepted), the only +representation accepted by @jic{}, the one most commonly used on +Usenet, and the one used in this manual (although again, it's worth +pointing out that this isn't portable). @clcic{} approximates a +bookworm with the yen character, which being a currency character is +one of the possible representations for mingle in @cic{}; @cic{} uses +the rather confusing method of interpreting a yen character as +exclusive-or if input in Latin-1 but as mingle if input in UTF-8. +(This usually does the right thing, because @clcic{} doesn't support +UTF-8.) In the same way, @clcic{} has a @cic{} compatibility option +to allow the use of @code{?} for exclusive-or. + +The operators take each pair of consecutive bits in their arguments +(that is, the least significant with the second least significant, the +second least significant with the third least significant, the third +least significant with the fourth least significant, and so on, with the +pair consisting of the most significant and least significant being used +to calculate the most significant bit of the result), and perform an +appropriate logic operation on them; and sets a bit of the result if and +only if both bits in the pair were set, or sets each bit corresponding to +each pair where either bit was set, and exclusive or sets if and only if +the bits in the pair had different values (that is, one was set, but not +both). So for instance, @code{#&26} is 16 (26 is 1A in hexadecimal or +11010 in binary); @code{#V26} is 31 (11111 in binary), and @code{#?26} +is 23 (10111 in binary). + +The most commonly seen use for these operators is to carry out bitwise +ands, ors, and exclusive ors between two different 16-bit expressions, +by mingling them together, applying a unary binary logic operator, and +selecting every second bit of the result; such code often results due to +people thinking in terms of some other language when writing @ical{}, +but is still often useful. (Historically, the first idiom added to the +optimizer, apart from constant folding, was the mingle/unary/select +sequence.) There are more imaginative uses; one impressive example is +the exclusive or in the test for greater-than from the original @icst{} +system library: + +@example +DO :5 <- "'?":1~'#65535$#0'"$":2~'#65535$#0'"' + ~'#0$#65535'"$"'?":1~'#0$#65535'"$":2~'#0$ + #65535'"'~'#0$#65535'" +DO .5 <- '?"'&"':2~:5'~'"'?"'?":5~:5"~"#65535~ + #65535"'~'#65535$#0'"$#32768'~'#0$#65535'" + $"'?":5~:5"~"#65535$#65535"'~'#0$#65535'"' + "$"':5~:5'~#1"'~#1"$#2'~#3 +@end example + +The first statement works out the value of :1 bitwise exclusive or :2; +the second statement then works out whether the most significant set bit +in :5 (that is, the most significant bit that differs between :1 and :2) +corresponds to a set bit in :2 or not. In case that's a bit too +confusing to read, here's the corresponding optimizer idiom (in OIL): + +@example +((_1~:2)~((?32(:2~:2))^#2147483648))->(_1>(:2^_1)) +@end example + +(Here, the ^ refers to a bitwise exclusive or, an operation found in OIL +but not in @ical{}, which is why the @ical{} version is so much longer.) +The @ical{} version also has some extra code to check for equality and +to produce 1 or 2 as the output rather than 0 or 1. + +@node Array Subscript +@subsection Array Subscript +@cindex arrays, subscripting +@cindex subscripts +@findex SUB + +@portability{yes, version 0.7+, all versions, all versions} + +In order to access the elements of an array, either to read or write +the array, it is necessary to use the array subscript operator +@code{SUB}. Note that an array element is not a variable, so it is +not accepted as an acceptable argument to statements like +@code{IGNORE}; however, it can be assigned to. + +The syntax for an array element is the array, followed by the keyword +@code{SUB}, followed by an expression for the element number in the +array. In the case of a multidimensional array, more than one +expression is given after the keyword @code{SUB} to give the location +of the element in each of the array's dimensions. The first element +in an array or array dimension is numbered 1. + +For instance, this is a legal (but not particularly useful) @ical{} +program with no syntax errors that shows some of the syntaxes possible +with array subscripting: + +@example +PLEASE ,1 <- #2 +DO .1 <- #2 +DO ,1 SUB .1 <- #1 +DO ,1 SUB #1 <- ,1 SUB #2 +PLEASE ;1 <- #2 BY #2 +DO ;1 SUB #1 #2 <- ,1 SUB ,1 SUB .1 +DO READ OUT ;1SUB#1.1 +DO GIVE UP +@end example + +Grouping can get complicated when nested array subscripting is used, +particularly with multiple subscripts. It is the programmer's job to +write an unambiguous statement, and also obey the extra grouping rules +that apply to array subscripts; see @ref{Grouping Rules}. + +@node Statements +@chapter Statements +@cindex statements +@cindex statements, INTERCAL + +There is a wide range of statements available to @ical{} programs; +some identifiably belong to a particular variant or dialect (such as +Backtracking @ical{}), but others can be considered to be part of the +'core language'. The statements listed here are those that the @cic{} +compiler will accept with no compiler switches to turn on particular +dialect options. Note that many statements have slightly different +effects in different implementations of @ical{}; known +incompatibilities are listed here, but it's important to check your +program on multiple compilers when attempting to write a portable +program. + +@menu +* Syntax Error:: Why use a deliberate syntax error? +* Calculate:: Assigning to variables and arrays +* NEXT FORGET and RESUME:: @icst{}-style flow control +* STASH and RETRIEVE:: Value stacks and scoping +* IGNORE and REMEMBER:: Creating read-only variables +* ABSTAIN and REINSTATE:: Dynamic DOs and DON'Ts +* READ OUT and WRITE IN:: @ical{} input and output +* GIVE UP:: How to end a program +* TRY AGAIN:: Control flow without loops +* COME FROM and NEXT FROM:: Time-reversed GOTO +@end menu + +@node Syntax Error +@section Syntax Error +@cindex syntax error +@cindex comment +@findex COMMENT +@findex COMMENTS +@findex COMMENTING +@portability{yes,version 0.15+,all versions,all versions} + +One of the more commonly-used commands in @ical{} is the syntax error. +A properly-written syntax error looks nothing like any known @ical{} +command; a syntax error that looks vaguely like a command but isn't +may confuse @cic{} before version 0.28, and possibly other compilers, +into bailing out at compile time in some situations (this is known as +a `serious syntax error'), and so is not portable. For other syntax +errors, though, the semantics are easily explained: there is a +run-time error whenever the syntax error is actually executed, and the +line containing the syntax error is used as the error message. + +One purpose of this is to allow your programs to produce their own +custom errors at run time; however, it's very important to make sure +that they start and end in the right place, by manipulating where +statement identifiers appear. Here's a correct example from the +system library: + +@example +DOUBLE OR SINGLE PRECISION ARITHMETIC OVERFLOW +@end example + +This is a valid @ical{} command, that produces an error when run (note +the @code{DO} at the start). An even more common use is to produce an +initially abstained syntax error by using an appropriate statement +identifier, for instance + +@example +PLEASE NOTE THAT THIS IS A COMMENT +@end example + +This would produce an error if reinstated somehow, but assuming that +this isn't done, this is a line of code that does nothing, which is +therefore equivalent to a comment in other programming languages. +(The initial abstention is achieved with the statement identifier +@code{PLEASE NOT}; the extra @code{E} causes the command to be a +syntax error, and this particular construction is idiomatic.) + +Referring to the set of all syntax errors in a program (or the set of +all commands of any other given type) is achieved with a special +keyword known as a `gerund'; gerund support for syntax errors is +resonably recent, and only exists in @clcic{} (version 1.-94.-3 and +later, with @code{COMMENT}, @code{COMMENTS}, or @code{COMMENTING}), +and @cic{} (@code{COMMENT} in version 0.26 and later, and also +@code{COMMENTS} and @code{COMMENTING} in version 0.27 and later). +Therefore, it is not portable to refer to the set of all syntax errors +by gerund; using a line label is a more portable way to refer to an +individual syntax-error command. + +@node Calculate +@section Calculate +@findex CALCULATING +@cindex calculate +@cindex assignment +@cindex arrays, dimensioning +@cindex dimensioning arrays +@cindex variables, assignment +@portability{yes, all versions, all versions, all versions} + +At present, the only @ical{} command that contains no keywords (apart +from the statement identifier and possibly @code{ONCE} or +@code{AGAIN}) is what is known as the `calculate' command. It is used +to assign values to variables, array elements, and arrays; assigning a +value to an array changes the number of elements that that array can +hold, and causes the values of all elements previously in that array +to be lost. The syntax of a calculate command is as follows: + +@example +DO .1 <- ':2~:3'~#55 +@end example + +That is, the command is written as a variable or array element, then +the @code{<-} operator (known as an `angle-worm' and pronounced +`gets'), then an expression to assign to it. In the special case when +an array is being dimensioned by assigning a value to it, the +expression can contain the keyword @code{BY} to cause the array to +become multidimensional; so for a 3 by 4 by 5 array, it would be +possible to write + +@example +DO ,1 <- #3 BY #4 BY #5 +@end example + +The calculate command always evaluates the expression, even if for +some reason the assignment can't be done (for instance, if the +variable being assigned to is read-only); this is important if the +expression has side-effects (for instance, giving an overflow error). +If the variable does happen to be read-only, there is not an error; +the expression being assigned to it is just evaluated, with the +resulting value being discarded. + +The gerund to refer to calculations is @code{CALCULATING}; however, if +you are planning to use this, note that a bug in older versions of +@cic{} means that assignments to arrays are not affected by this +gerund before version 0.27. + +@clcic{} from 1.-94.-4 onwards, and @cic{} from 0.26 onwards, allow +arbitrary expressions on the left hand side of an assignment (@cic{} +only if the @code{-v} option is used); for more information on how +such `reverse assignments' work, see @ref{Operand Overloading}. + +@node NEXT FORGET and RESUME +@section NEXT, FORGET and RESUME +@findex NEXT +@findex FORGET +@findex RESUME +@findex NEXTING +@findex FORGETTING +@findex RESUMING +@cindex NEXT stack +@cindex flow control, INTERCAL-72 +@cindex stack, NEXT +@cindex stack, instruction pointer +@anchor{NEXT} +@anchor{FORGET} +@anchor{RESUME} +@portability{yes, all versions, see text, all versions} + +The only flow-control commands in @icst{} were @code{NEXT}, +@code{RESUME}, and @code{FORGET}; together these manipulate a stack of +locations in the program known as the `NEXT stack'. Although all +@ical{} compilers have implemented these, from @clcic{} version 0.05 +onwards @clcic{} has considered them obsolete, and therefore a special +command-line switch needs to be used to enable them. (They are still +the most portable flow-control commands currently available, though, +precisely because @icst{} implements nothing else.) Note that there +is a strict limit of 80 locations on the NEXT stack, enforced by all +known @ical{} compilers; this helps to enforce good programming style, +by discouraging NEXT-stack leaks (which are otherwise quite easy to +write). + +Here are examples to show the syntax of these three statements: + +@example +DO (1000) NEXT +DO FORGET '.1~.1'~#1 +DO RESUME .5 +@end example + +The @code{NEXT} command takes a line label as its argument (unlike +most other @ical{} commands, it comes after its argument rather than +before); both @code{FORGET} and @code{RESUME} take expressions. +(@clcic{} from version 0.05 onwards also allows an expression in +@code{NEXT}, rather than a label, to give a computed @code{NEXT}, but +this behaviour was not implemented in other compilers, and is +deprecated in @clcic{} along with noncomputed @code{NEXT}; if computed +@code{NEXT} is ever implemented in @cic{}, it will likely likewise be +deprecated upon introduction). (Update: it was implemented in @cic{} +version 0.28, but only as part of the external calls system, so it +cannot be used in ordinary programs; a sample expansion library gives +in-program access to a limited form of computed @code{NEXT}, but +should probably not be used.) Running a @code{NEXT} causes the +program control to transfer to the command whose line label is +referenced, and also saves the location in the program immediately +after the @code{NEXT} command on the top of the NEXT stack. + +In order to remove items from the @code{NEXT} stack, to prevent it +filling up (which is what happens with a naive attempt to use the +@code{NEXT} command as an equivalent to what some other languages call +GOTO), it is possible to use the @code{FORGET} or @code{RESUME} +commands. They each remove a number of items from the NEXT stack +equal to their argument; @code{RESUME} also transfers control flow to +the last location removed from the @code{NEXT} stack this way. Trying +to remove no items, or more items than there are in the stack, does +not cause an error when @code{FORGET} is used (no items or all the +items are removed respectively); however, both of these cases are +errors in a @code{RESUME} statement. + +Traditionally, boolean values in @ical{} programs have been stored +using #1 and #2 as the two logic levels. This is because the easiest +way to implement an if-like construct in @icst{} is by @code{NEXTING}, +then @code{NEXTING} again, then @code{RESUMING} either by 1 or 2 +according to an expression, and then if the expression evaluated to 1 +@code{FORGETTING} the remaining NEXT stack entry. By the way, the +previous sentence also explained what the appropriate gerunds are for +@code{NEXT}, @code{RESUME}, and @code{FORGET}. + +@node STASH and RETRIEVE +@section STASH and RETRIEVE +@anchor{STASH} +@anchor{RETRIEVE} +@findex STASH +@findex RETRIEVE +@findex STASHING +@findex RETRIEVING +@cindex stack, variable +@cindex stashes +@cindex variables, stashes +@portability{yes, all versions, all versions, all versions} + +The NEXT stack is not the only stack available in an @ical{} program; +each variable used in the program also has its own stack, which holds +values of the same type as the variable. The @code{STASH} command +pushes a variable's value onto that variable's stack; @code{RETRIEVE} +can be used in the same way to pop the top element of a variable's +stack to replace that variable's value. The syntax is the same as +most other @ical{} commands, with the word @code{STASH} or +@code{RETRIEVE} followed by the variable or variables to stash or +retrieve: + +@example +DO STASH .1 + ;2 +DO RETRIEVE ,3 +@end example + +Note that it is possible to stash or retrieve multiple variables at +once, by listing their names separated by intersections (@code{+}); +it's even possible to stash or retrieve a variable twice in the same +statement. + +It is not entirely clear how @code{RETRIEVE} interacts with +@code{IGNORE} in historical @icst{} compilers; the three modern +@ical{} compilers all use different rules for the interaction (and the +@cic{} maintainers recommend that if anyone decides to write their own +compiler, they choose yet another different rule so that looking at +the interaction (the so-called `ignorret test') can be used as a +method of determining which compiler is running): + +@cindex @code{IGNORE}/@code{RETRIEVE} interaction +@cindex @code{RETRIEVE}/@code{IGNORE} interaction +@cindex ignorret test +@itemize +@item +@cic{} treats a retrieval just like an assignment. That is, a +read-only variable will not be changed by a retrieval, and will remain +read-only, but the side-effect of popping that variable's stash will +still happen. + +@item +@jic{} ignores the read-only status of a variable when retrieving it +from a stash; the value of the variable changes despite being +read-only. The variable remains read-only; the @code{RETRIEVE} simply +allows a change to its value despite the read-only status. + +@item +@clcic{} is the most complicated; it stores read-only status or +otherwise in the stash, along with the variable's value. This means +that if a variable was stashed when read-only, retrieving it will +retrieve its value and set it to read-only regardless of its previous +read-only status; likewise, if a variable was stashed when read-write, +retrieving it will retrieve its value and set it to read-write even if +it was previously read-only. + +@end itemize + +The appropriate gerunds for @code{STASH} and @code{RETRIEVE} are +@code{STASHING} and @code{RETRIEVING} respectively. + +@node IGNORE and REMEMBER +@section IGNORE and REMEMBER +@anchor{IGNORE} +@anchor{REMEMBER} +@findex IGNORE +@findex IGNORING +@findex REMEMBER +@findex REMEMBERING +@cindex variables, read-only +@cindex variables, read-write +@cindex read-only variables +@cindex read-write variables +@cindex variables, ignoring +@cindex variables, remembering +@portability{yes, all versions, all versions, all versions} + +Variables in @ical{} can be either read-write or read-only. At the +start of a program, all variables are read-write, but this status can +be changed dynamically during execution of a program using the +@code{IGNORE} and @code{REMEMBER} statements (whose gerunds are +@code{IGNORING} and @code{REMEMBERING} respectively). The syntax is +the same as for @code{STASH} and @code{RETRIEVE}: the command's name +followed by an intersection-separated list of variables. For +instance: + +@example +DO IGNORE .4 +DO REMEMBER ,4 + ;5 +@end example + +Using the @code{IGNORE} statement sets a variable to be read-only (or +does nothing if it's read-only already); @code{REMEMBER} sets it to be +read-write. Any attempt to assign to a read-only variable silently +fails. One place that this is used is in the system library; instead +of not assigning to a variable in certain control flow paths, it +instead sets it to be read-only so that subsequent assignments don't +change its value (and sets it to be read-write at the end, which +succeeds even if it was never set read-only in the first place); the +advantage of this is that it doesn't need to remember what flow path +it's on except in the variable's ignorance status. + +The interaction between @code{IGNORE} and @code{RETRIEVE} was never +defined very clearly, and is in fact different in @cic{}, @clcic{} and +@jic{}; for more details, see @ref{RETRIEVE}. + +@node ABSTAIN and REINSTATE +@section ABSTAIN and REINSTATE +@anchor{ABSTAIN} +@anchor{REINSTATE} +@findex ABSTAIN +@findex ABSTAINING +@findex REINSTATE +@findex REINSTATING +@cindex abstain, during execution +@cindex reinstate, during execution +@portability{yes, all versions, all versions, all versions} + +The statement identifier of a statement determines whether it's +in an abstained or reinstated state at the start of a program; these +states determine whether the statement runs at all when it's +encountered. It is, however, possible to change this state +dynamically during a program's execution, and the statements to do +this are rather appropriately named @code{ABSTAIN} and +@code{REINSTATE}. There are two forms of each, one which takes a +single line label (which must be constant in most compilers, but can +instead be an expression in recent @clcic{} versions), and one which +takes an intersection-delimited list of gerunds. They look like this: + +@example +DO ABSTAIN FROM ABSTAINING + REINSTATING +DO ABSTAIN FROM (10) +DO REINSTATE CALCULATING +DO REINSTATE (22) +@end example + +(This also illustrates the gerunds used for these commands; note that +@code{ABSTAINING} from @code{REINSTATING} is generally a bad idea@!) +The line referenced, or every command represented by any gerund +referenced, are reinstated or abstained as appropriate (effectively +changing the DO to DON'T (or PLEASE to PLEASE DON'T, etc.@:), or vice +versa). Using these forms of @code{ABSTAIN} and/or @code{REINSTATE} +won't abstain from a command that's already abstained, or reinstate a +command that's already reinstated. + +There is a strange set of restrictions on @code{ABSTAIN} and +@code{REINSTATE} that has existed since @icst{}; historically such +restrictions have not always been implemented, or have not been +implemented properly. They together define an unusual interaction of +@code{ABSTAIN} and @code{GIVE UP} (note, for instance, that there +isn't a gerund for @code{GIVE UP}). The wording used in the @icst{} +manual is: + +@quotation +[...] the statement DO ABSTAIN FROM GIVING UP is not accepted, even +though DON'T GIVE UP is. [...] DO REINSTATE GIVING UP is invalid, and +attempting to REINSTATE a GIVE UP statement by line label will have no +effect. Note that this insures that DON'T GIVE UP will always be a +"do-nothing" statement. +@end quotation + +This restriction was not implemented at all in the only @clcic{} +version before 0.02 (i.e.@: version 0.01), or in @cic{} versions +before 1.26. The restriction was implemented in @cic{} version 1.26 +and @clcic{} versions 0.02 and later as ``@code{GIVE UP} cannot be +@code{REINSTATED} or @code{ABSTAINED FROM}''; however, this is not +strictly the same as the definition used by @icst{} (@cic{} still uses +this definition in @clcic{} compatibility mode). The @jic{} +implementation of this restriction is to make @code{REINSTATING} or +@code{ABSTAINING} from a line label that refers to a @code{GIVE UP} +statement a compile-time error, but this does not fit the @icst{} +definition either. The definition adopted with version 0.27 and +later of @cic{}, which is hopefully correct, is to allow abstaining +from a @code{GIVE UP} statement by line number but to rule out the +other three cases (reinstating by line number silently fails, +reinstating or abstaining by gerund is impossible because there is no +gerund). + +As well as @clcic{}'s extension to abstain/reinstate by computed line +number, there is also (since version 0.25) a @cic{}-specific extension +to @code{ABSTAIN}, also known as `computed abstain', but with a +different syntax and different semantics. It's written like an +ordinary @code{ABSTAIN}, but with an expression between the words +@code{ABSTAIN} and @code{FROM}, for instance: + +@example +DO ABSTAIN #1 FROM (1000) +DO ABSTAIN .2 FROM WRITING IN +@end example + +Unlike non-computed @code{ABSTAIN}, this form allows a command to be +abstained from even if it's already been abstained from; so if the +first example command is run and line (1000) is already abstained, it +becomes `double-abstained'. The number of times the statement is +abstained from is equal to the number of times it was already +abstained from, plus the expression (whereas with non-computed +abstain, it ends up abstained once if it wasn't abstained at all, and +otherwise stays at the same abstention status). Reinstating a +statement always de-abstains it exactly once; so double-abstaining +from a statement, for instance, means it needs to be reinstated twice +before it will actually execute. + +There are many uses for @code{ABSTAIN} (both the computed and +non-computed versions) and @code{REINSTATE}, especially when +interacting with @code{ONCE} and @code{AGAIN} (@pxref{ONCE and +AGAIN}); the computed version, in particular, is a major part of a +particular concise way to write conditionals and certain kinds of +loops. They also play an important role in multithreaded programs. + +@node READ OUT and WRITE IN +@section READ OUT and WRITE IN +@anchor{READ OUT} +@anchor{WRITE IN} +@findex READ OUT +@findex READING OUT +@findex WRITE IN +@findex WRITING IN +@cindex I/O +@cindex input +@cindex output + +The @code{READ OUT} and @code{WRITE IN} commands are the output and +input commands in @ical{}; they allow communication between the +program and its user. There was a numeric I/O mechanism implemented +in @icst{}, and it (or trivial variants) have been likewise +implemented in all more modern variants. However, it had some obvious +deficiences (such as not being able to read its own output) which +meant that other methods of I/O were implemented in @cic{} and +@clcic{}. + +The syntax of @code{READ OUT} and @code{WRITE IN} is the same in all +cases: the name of the command followed by an intersection-separated +list of items; the form of each item, the compiler you are using, and +its command line arguments together determine what sort of I/O is +used, which can be different for different elements in the list. + +@menu +* INTERCAL-72 I/O:: Spelt-out numbers and Roman numerals +* C-INTERCAL I/O:: The Turing Tape I/O system +* CLC-INTERCAL I/O:: Baudot and mingled binary +@end menu + +@node INTERCAL-72 I/O +@subsection INTERCAL-72 I/O +@cindex I/O, INTERCAL-72 +@cindex input, INTERCAL-72 +@cindex output, INTERCAL-72 +@cindex INTERCAL-72, I/O +@cindex Roman numerals + +@portability{yes, all versions, see text, all versions} + +@icst{} had its own versions of I/O commands; these commands are +available in all modern @ical{} compilers as well (but @clcic{} +implements output slightly differently). To distinguish @icst{} input +and output from the other more modern types of I/O, the @code{READ +OUT} and @code{WRITE IN} commands must take one of the following +values: a onespot or twospot variable, a single element of a tail or +hybrid array, or (in the case of @code{READ OUT}) a constant, meaning +that these are some examples of the possible forms: + +@example +READ OUT .1 +READ OUT ;2 SUB .3:4 +READ OUT #3 +WRITE IN :4 +WRITE IN ,5 SUB #6 +@end example + +The statements do what you would expect; @code{READ OUT} outputs its +argument to the user, and @code{WRITE IN} inputs a number from the +user and assigns it to the variable or array element referenced. (If +the variable, or the array that contains the array element, happens to +be read-only, the input or output still happens but in the case of +@code{WRITE IN} silently skips the assignment, instead throwing away +the input.) The formats used for input and output are, however, +different from each other and from the formats used by most mainstream +languages. + +Input is achieved by writing a number in decimal, one digit at a time, +with each digit written out as a word; so to input the number 12345, a +user would have to type @code{ONE TWO THREE FOUR FIVE} as input (if +they were using English, the most portable choice of language). In +@icst{} only English is accepted as a language, but other compilers +accept other languages in addition. @cic{} from version 0.10 onwards +accepts English, Sanskrit, Basque, Tagalog, Classical Nahuatl, +Georgian, and Kwakiutl; also Volap@"uk from version 0.11 onwards, and +Latin from version 0.20 onwards. @jic{} accepts the same languages, +except with Esperanto instead of Latin; from version 0.05 of @clcic{} +onwards, the same list of languages as @cic{} is supported (apart from +Latin, which was added in version 1.-94.-8), plus Scottish Gaelic. + +The format that output can be read in is a modified form of Roman +numerals, known as `butchered' Roman numerals. @icst{}, @cic{} and +@jic{} do this the same way; @clcic{} is somewhat different. The +characters @samp{I}, @samp{V}, @samp{X}, @samp{L}, @samp{C}, @samp{D}, +and @samp{M} mean 1, 5, 10, 50, 100, 500 and 1000 respectively, +placing a lower-valued letter after a higher-valued letter adds them, +and placing a lower-valued letter before a higher-valued letter +subtracts it from the value; so @samp{XI} is 11 and @samp{IX} is 9, +for instance. In @icst{}, @cic{}, and @jic{}, a bar over a numeral +multiplies its value by 1000, and writing a letter in lowercase +multiplies its value by 1000000; however, @clcic{} uses lowercase to +represent multiplication by 1000 and for multiplication by 1000000 +writes a backslash before the relevant numeral. + +@node C-INTERCAL I/O +@subsection C-INTERCAL I/O +@cindex I/O, C-INTERCAL +@cindex input, C-INTERCAL +@cindex output, C-INTERCAL +@cindex C-INTERCAL, I/O +@cindex Turing Tape + +@portability{no, version 0.07+, version 0.05+, no} + +@cic{}'s method of character-based (rather than numeric) input and +output is known as the Turing Tape method; it is a binary +(character-set-agnostic) input/output mechanism. To specify that +@cic{}-style I/O is being used, an array must be used as the argument +to @code{READ OUT} or @code{WRITE IN}; as the syntax is the same as +for @clcic{}'s I/O, command-line arguments and the capabilities of the +version of the compiler being used serve to distinguish the two +mechanisms. + +The character-based input writes as many characters into a tail or +hybrid array as will fit, one character in each element. The number +that's written into the array is not the character code, though, but +the difference between the character code and the previous character +code, modulo 256. (To be precise, the code is the new character minus +the previous character, or 256 minus (the previous character minus the +new character) if the previous character had a higher character code; +the 'previous character' is the previous character from the input, not +the previous character written into the array.) End-of-file causes +256 to be written into the array. The concept is that of a circular +tape containing all the characters, where the program measures how +many spaces it needs to move along the tape to reach the next +character. The 'previous character' starts at 0, but is preserved +throughout the entire program, even from one @code{WRITE IN} to the +next. + +Character-based output uses a similar model, but conceptually the +output device moves on the inside of the tape, rather than on the +outside. Therefore, the character is that is actually output is the +bit-reversal of the difference between the last character output +before it was bit-reversed and the number found in the array +(subtracting in that order, and adding 256 if the result is +negative). (Rather than trying to parse the previous sentence, you +may find it easier to look either at the source code to the compiler +if you have it (the relevant part is binout in @file{src/cesspool.c}) +or at some example @cic{} programs that do text-based I/O.) + +@node CLC-INTERCAL I/O +@subsection CLC-INTERCAL I/O +@cindex Baudot +@cindex I/O, Baudot +@cindex I/O, CLC-INTERCAL +@cindex CLC-INTERCAL I/O +@cindex input, CLC-INTERCAL +@cindex output, CLC-INTERCAL + +@portability{no, see text, all versions, no} + +There are also two @clcic{}-specific I/O mechanisms. These are +Baudot-based text I/O (which is also implemented from @cic{} version +0.27 onwards), and @clcic{} generalised binary I/O (not implemented in +@cic{}). + +Baudot text-based I/O is specified by using a tail array as an +argument to @code{WRITE IN} or @code{READ OUT}. (A tail array can +also be used to specify @cic{}-style Turing Tape I/O. In order to +determine which is used: both @cic{} and @clcic{} use their own sort +of I/O unless a command-line argument instructs them to use the +other.) In the case of @code{WRITE IN}, one line of input is +requested from the user (@cic{} requires this to be input in Latin-1, +and will then automatically convert it; @clcic{} gives the option of +various character sets for this input as command-line options); the +final newline is removed from this line, then it is converted to +extended Baudot and stored in the tail array specified (causing an +error if the array is too small). Because Baudot is only a 5-bit +character set, each element is padded to 16 bits; @clcic{} pads with +zeros, @cic{} pads with random bits. Trying to input at end-of-file +will act as if the input were a blank line. @code{READ OUT} is the +reverse; it interprets the array as extended Baudot and converts it to +an appropriate character set (Latin-1 for @cic{}, or whatever was +specified on the command line for @clcic{}), which is output to the +user, followed by a newline. Note that the Baudot is often longer +than the corresponding character in other character sets due to the +need to insert shift codes; for information on the extended Baudot +character set, @ref{Character Sets}. + +Generalised binary I/O is specified using a hybrid array as an +argument to @code{WRITE IN} or @code{READ OUT}. Input works by +reading in a number of bytes equal to the length of the array (without +trying to interpret them or translating them to a different character +set), prepending a byte with 172 to the start, padding each byte to 16 +bits with random data, then replacing each pair of consecutive bytes +(that is, the first and second, the second and third, the third and +fourth, and so on) with (the first element selected from the second +element) mingled with (the complement of the first element selected from +the complement of the second element). Output is the exact opposite +of this process. End-of-file reads a 0, which is padded with 0s +rather than random data; if a non-end-of-file 0 comes in from the +data, its padding will contain at least one 1. Any +all-bits-0-even-the-padding being read out will be skipped. + +@node GIVE UP +@section GIVE UP +@findex GIVE UP +@cindex quitting +@cindex exiting + +@portability{yes, all versions, all versions, all versions} + +The @code{GIVE UP} command causes the program to end (or, in a +multithreaded program, causes the current thread to end). It is +written simply as @code{GIVE UP}. There is not much else to say about +it, except to mention that it is the only way to end the program +without an error unless the last line of the program is @code{TRY +AGAIN}, and that it has an unusual interaction with @code{ABSTAIN}; +for details of this, see @ref{ABSTAIN}. (Going past the last command +in the program is an error.) + +There is no gerund for @code{GIVE UP}; in particular, @code{GIVING UP} +is a syntax error. + +@node TRY AGAIN +@section TRY AGAIN +@findex TRY AGAIN +@cindex loops, entire program + +@portability{no, version 0.25+, no, no} + +The @code{TRY AGAIN} command is a very simple command with many +limitations; its effect is to place the entire program in a loop. If +it exists, it must be the very last command in the program (it cannot +even be followed by syntax errors), and it causes execution of the +program to go back to the first command. If the @code{TRY AGAIN} +command is abstained or for some other reason doesn't execute when +reached, it exits the program without the error that would usually be +caused by going past the last line of code. + +The gerund for @code{TRY AGAIN} is @code{TRYING AGAIN}. + +@node COME FROM and NEXT FROM +@section COME FROM and NEXT FROM +@anchor{COME FROM} +@anchor{NEXT FROM} +@findex COME FROM +@findex NEXT FROM +@cindex reverse goto +@cindex goto, time-reversed +@cindex time-reversed goto + +@portability{no, see text, see text, see text} + +The @code{COME FROM} statement (incidentally also invented in 1972, +but not in connection with @ical{}) is the main control-flow command +in @clcic{} (which deprecates @code{NEXT}), and one of two main +control flow structures in other modern @ical{} compilers. It takes +either a label or an expression as its argument; these forms are +noncomputed @code{COME FROM} and computed @code{COME FROM}. + +Noncomputed @code{COME FROM} was implemented in version 0.5 of @cic{}, +but did not conform to modern-day semantics until version 0.7; it is +available in every version of @clcic{} and @jic{}. Computed +@code{COME FROM} support is available in every version of @clcic{} and +in @cic{} from version 0.25 onwards, but not in @jic{}; the variant +@code{NEXT FROM} of @code{COME FROM} is available from @clcic{} +version 1.-94.-8 and @cic{} version 0.26 (both computed and +noncomputed). @cic{} and @clcic{} also have a from-gerund form of +@code{COME FROM} and @code{NEXT FROM}, which was also implemented from +@clcic{} version 1.-94.-8 and @cic{} version 0.26. + +The basic rule of @code{COME FROM} is that if a @code{COME FROM} +statement references another statement, whenever that statement is +reached, control flow will be transferred to the @code{COME FROM} +after that statement finishes executing. (@code{NEXT FROM} is +identical except that in addition to the @code{COME FROM} behaviour, +the location immediately after the statement that was nexted from is +saved on the NEXT stack, in much the same way as if the statement +being nexted from was itself a @code{NEXT}.) + +Here are examples of noncomputed, computed, and from-gerund @code{COME +FROM}: + +@example +DO COME FROM (10) +DO COME FROM #2$'.1~#1' +DO COME FROM COMING FROM +@end example + +(The last example is an infinite loop. If it said @code{DO NEXT FROM +NEXTING FROM}, it would not be an infinite loop because the NEXT stack +would overflow and cause an error. This also establishes the gerunds +used for @code{COME FROM} and @code{NEXT FROM}.) + +There are some things to be careful with involving @code{COME FROM} +and @code{NEXT FROM}. First, if the statement come from or nexted +from happens to be a @code{NEXT}, the @code{NEXT} doesn't count as +'finishing executing' until the NEXT stack entry created by the +@code{NEXT} is @code{RESUME}d to. In particular, this means that if +@code{FORGET} is used to remove the entry, or a @code{RESUME} with a +large argument resumes a lower entry, the @code{COME FROM} doesn't +steal execution at all. + +Second, you may be wondering what happens if two @code{COME FROM}s or +@code{NEXT FROM}s aim at the same line. In a non-multithreaded +program (whether a program is multithreaded or not is determined by a +compiler option for those compilers that support it), this is an +error; but it is only an error if the statement that they both point +to finishes running, and both @code{COME FROM}s or @code{NEXT FROM}s +try to execute as a result (they might not if, for instance, one is +abstained or has a double-oh-seven causing it not to run some of the +time). If both @code{COME FROM}s or @code{NEXT FROM}s are +noncomputed, however, a compiler can (but does not have to) give a +compile time error if two @code{COME FROM}s or @code{NEXT FROM}s share +a label, and so that situation should be avoided in portable code. +(If it is wanted, one solution that works for @cic{} and @clcic{} is +to use computed @code{COME FROM}s or @code{NEXT FROM}s with a constant +expression.) + +@node System Library +@chapter System Library +@cindex system libary +@cindex syslib + +@portability{yes, all versions, no, all versions} + +@ical{} has a system library, called @samp{syslib}. It is included +automatically at the end of your program by the compiler whenever your +program refers to a line from (1000) to (1999) without defining any +line in that range in the program. (Although it is not added +automatically by the compiler in @clcic{}, it is trivial to +concatenate a copy onto the end of the program; copies of the system +library are available from many sources on the Internet, including a +version in the example code that comes with @cic{}.) + +The intention of the system library is to provide a range of useful +capabilities, like multiplication, that can otherwise be hard to write +in @ical{}. System library routines are used by @code{NEXTING} to +their line number (@pxref{NEXT}), where they will make changes to +certain variables depending on certain other variables (depending on +which routine is called), and @code{RESUME} back to the original +program. As the system library is itself written in @ical{}, there +are some restrictions that need to be obeyed for calls to it to be +guaranteed to work; none of the variables it uses (@code{.1} to +@code{.6} and @code{:1} to @code{:5}) should be read-only or +overloaded (although the value of any variables that aren't mentioned +in the routine's description will be preserved by the routine), and +none of the lines in it should have their abstention status changed by +lines outside it (this can happen with blatant infractions like +@code{DO ABSTAIN FROM (1500)} or more subtle problems like +gerund-abstention) or have @code{COME FROM}s or @code{NEXT FROM}s +aiming at them. + +The system library is currently available in all bases from 2 to 7 +(@pxref{TriINTERCAL}), but not every command is available in every +base, and @cic{} is the only one of the three compilers listed above +that use the system library to ship with a version in bases other than +2. (This table was originally based on the @icst{} manual, but has +had extra information added for bases other than 2.) Here, ``overflow +checked'' means that #1 is assigned to .4 if there is not an overflow, +and #2 is assigned to .4 if there is; ``overflow captured'' means that +if there is overflow, the digit that overflowed is stored in the +variable referenced. In all cases, division by 0 returns 0. + +@multitable @columnfractions .1 .7 .15 +@headitem Line @tab Description @tab Bases +@item (1000) @tab +.3 <- .1 plus .2, error exit on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1009) @tab +.3 <- .1 plus .2, overflow checked +@tab 2, 3, 4, 5, 6, 7 +@item (1010) @tab +.3 <- .1 minus .2, no action on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1020) @tab +.1 <- .1 plus #1, no action on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1030) @tab +.3 <- .1 times .2, error exit on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1039) @tab +.3 <- .1 times .2, overflow checked +@tab 2, 3, 4, 5, 6, 7 +@item (1040) @tab +.3 <- .1 divided by .2 +@tab 2, 3, 4, 5, 6, 7 +@item (1050) @tab +.2 <- :1 divided by .1, error exit on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1200) @tab +.2 <- .1 times #2, overflow captured in .3 +@tab 4, 6 +@item (1210) @tab +.2 <- .1 divided by #2, one digit after the quartic or sextic point +stored in .3 +@tab 4, 6 +@item (1500) @tab +:3 <- :1 plus :2, error exit on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1509) @tab +:3 <- :1 plus :2, overflow checked +@tab 2, 3, 4, 5, 6, 7 +@item (1510) @tab +:3 <- :1 minus :2, no action on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1520) @tab +:1 <- .1 concatenated with .2 +@tab 2, 3, 4, 5, 6, 7 +@item (1530) @tab +:1 <- .1 times .2 +@tab 2, 3, 4, 5, 6, 7 +@item (1540) @tab +:3 <- :1 times :2, error exit on overflow +@tab 2, 3, 4, 5, 6, 7 +@item (1549) @tab +:3 <- :1 times :2, overflow checked +@tab 2, 3, 4, 5, 6, 7 +@item (1550) @tab +:3 <- :1 divided by :2 +@tab 2, 3, 4, 5, 6, 7 +@item (1700) @tab +:2 <- :1 times #2, overflow captured in .1 +@tab 4, 6 +@item (1710) @tab +:2 <- :1 divided by #2, one digit after the quartic or sextic point +stored in .1 +@tab 4, 6 +@item (1720) @tab +:2 <- :1 times the least significant digit of .1, overflow captured in +.2 +@tab 5, 7 +@item (1900) @tab +.1 <- uniform random number from #0 to #65535 +@tab 2, 3, 4, 5, 6, 7 +@item (1910) @tab +.2 <- normal random number from #0 to .1, with standard deviation .1 +divided by #12 +@tab 2, 3, 4, 5, 6, 7 +@end multitable + +If you happen to be using base 2, and are either using the external +call system (@pxref{External Calls}) or are willing to use it, it is +possible to use a version of the system library written in C for +speed, rather than the default version (which is written in @ical{}). +To do this, use the command line options @option{-eE} (before the +@ical{} file), and @option{syslibc} (at the end of the command line). + +@ifset notsplit +@partheading{PART III: @ical{} DIALECTS AND EXTENSIONS} +@end ifset +@node TriINTERCAL +@chapter TriINTERCAL +@cindex TriINTERCAL +@cindex ternary +@cindex whirlpool +@cindex sharkfin +@cindex BUT +@cindex add-without-carry +@cindex subtract-without-borrow +@cindex controlled unary operator +@findex ^ +@findex @@ + +@portability{no, version 0.7+, version 1.-94.-8+, no} + +One extension to @ical{} that is implemented by both @cic{} and +@clcic{} is known as TriINTERCAL, and extends @ical{} to bases other +than binary. Unlike ordinary @ical{} programs, which have the +extension @samp{.i}, TriINTERCAL programs in bases from 3 to 7 (the +only allowed bases) have extensions from @samp{.3i} to @samp{.7i} +respectively. + +The change of numeric base only affects expressions, and in particular +the behaviour of operators, and the range of variables. (The onespot +and twospot ranges become the highest number of trits or other digits +in the base required that fit inside the binary ranges, so for +instance, the maximum value of a onespot variable in ternary is 59048, +or 3 to the power 10 minus 1.) Interleave/mingle is the simplest to +explain; it alternates digits just as it alternated bits in binary. +The other operators all change, as follows: + +@itemize + +@item +Exclusive-or becomes two operators, known either as +subtract-without-borrow and add-without-carry due to their +mathematical interpretations, or what and sharkfin after their Atari +syntax representations (@code{?} and @code{^}). (In Princeton syntax, +these are the bookworm or yen sign, and a spike (@code{|}).) The two +operators do the same thing in binary, but differ in higher bases. +(Nevertheless, it is an error to use a sharkfin in binary, because it +is a so-called `controlled unary operator', as are the rest of the +new operators defined in this section, which has a lower limit on +which base it is allowed in.) Instead of doing the exclusive-or +operation, the bits being combined are either subtracted or added; if +the result is out of range for the base being used, the base is added +or subtracted from the result until it is in range. (For the +subtraction, the bit that was less significant is subtracted from the +bit that was more significant in any given pair of bits, except for +the subtraction between the most and least significant bits, where the +most significant bit is subtracted from the least.) + +@item +The AND and OR operators are generalised into an entire sequence of +operators; the number of operators available is the same as the base +that is being used. In base 3, the third operator is known as BUT; in +other bases, there are no commonly accepted names for the extra +operators, so names that reflect the notation are used here. + +The way to think of it is this: in base 2, an AND gives the result 0 +if either argument is a 0, and otherwise a 1, and likewise, an OR +gives the result 1 if either argument is a 1, and otherwise a 0; they +could be said to favour 0 over 1 and 1 over 0 respectively. In base +3, AND favours 0 over 2 over 1, OR favours 2 over 1 over 0, and BUT +favours 1 over 0 over 2. (The symbol for BUT is @code{@@} (a +`whirlpool', which is another name for the BUT operation) in Atari +syntax, and @code{?} in Princeton syntax.) The pattern continues: in +base 4, AND favours 0 over 3 over 2 over 1, BUT favours 1 over 0 over +3 over 2, 2BUT (written @code{2@@} or @code{2?}) favours 2 over 1 over +0 over 3, and OR favours 3 over 2 over 1 over 0. (This can be +extended to higher bases following the same pattern, introducing +operators @code{3@@} or @code{3?}, etc., to favour 3, etc., when +neither AND (which always favours 0) nor OR (which favours the highest +digit in the base) are available.) All the whirlpool operators are +controlled unary operators, which are only legal when both the base +contains the favoured digit, and they aren't redundant to AND nor OR. + +@item +Select has its semantics modified to deal with more than one nonzero +digit in the base. It starts off by doing an AND (in whatever base is +being used) between the two numbers being selected; then the bits of +the result are sorted by the bits of the right-hand argument to the +select, with bits corresponding to 0s in the right-hand argument +ending up more significant than bits corresponding to high digits in +the right-hand argument. In base 2, this has the same effect as a +traditional-style select. + +@end itemize + +Note that the base doesn't affect anything other than variable ranges +and expressions; in particular, it doesn't affect the bit-reversal +used by Turing Tape I/O. (The tape still has characters written on it +in binary, even though the program uses a different base.) + +@node Multithreading and Backtracking +@chapter Multithreading and Backtracking +@cindex multithreading +@cindex threading +@cindex Threaded INTERCAL +@cindex Backtracking INTERCAL + +The multithreading and backtracking extensions to @ical{} were +originally invented by Malcom Ryan, who implemented @code{COME +FROM}-based multithreading as a modified version of @cic{}, known as +Threaded @ical{}, but did not implement backtracking. (The same +functionality is implemented in @cic{} today, but with different code. +Most likely, this means that the original code was better.) He also +invented the original version of Backtracking @ical{}, but did not +implement it; the only known implementation is the @cic{} one. A +different version of multithreading, using @code{WHILE}, was +implemented as part of @clcic{} (like all extensions first available +in @clcic{}, it is most likely due to Claudio Calvelli) and then added +to @cic{}, although its implications were not noticed for some time +afterwards. + +So nowadays, three freely-mixable threading-like extensions to @ical{} +exist, all of which are implemented in @cic{}. (A fourth, Quantum +@ical{}, is implemented in @clcic{} but not @cic{}, and so will not be +discussed further here.) If you're wondering about the description of +backtracking as a threading-like extension, it's implemented with much +of the same code as multithreading in @cic{}, because the @ical{} +version can be seen as roughly equivalent to multithreading where the +threads run one after another rather than simultaneously. (This +conceptualisation is probably more confusing than useful, though, and +is also not strictly correct. The same could probably be said about +@ical{} as a whole, for that matter.) + +@menu +* Multithreading using COME FROM:: Creating separate threads. +* Multithreading using WHILE:: Creating connected threads. +* Backtracking:: Multithreading in series, not parallel. +@end menu + +@node Multithreading using COME FROM +@section Multithreading using COME FROM +@cindex @code{COME FROM}, multithreading +@cindex @code{NEXT FROM}, multithreading +@cindex multithreading, separate threads +@cindex threading, separate +@cindex threading, unwoven +@cindex separate threads +@cindex unwoven threads + +@portability{no, version 0.25+, version 0.05+, no} + +The original multithreading implementation worked by giving a new +meaning to what was previously an error condition. If in a +multithreaded program (a program is marked as multithreaded using +options to a compiler) two or more @code{COME FROM}s or @code{NEXT +FROM}s (or a mixture of the these) attempt to steal control +simultaneously, the original thread splits into multiple threads, one +for each of the commands trying to take control, and a different +command gains control of the program in each case. + +From then on, all the threads run simultaneously. The only thing +shared between threads (apart from the environment in which they run) +is the abstained/reinstated status of each command; everything else is +separate. This means, for instance, that it's possible to change the +value of a variable in one thread, and it will not affect the +corresponding variable in other threads created this way. Likewise, +there is a separate NEXT stack in each thread; if both a @code{COME +FROM} and a @code{NEXT FROM} aim at the same line, for instance, the +@code{NEXT FROM} thread will end up with a NEXT stack entry that isn't +in the @code{COME FROM} thread, created by the @code{NEXT FROM} +itself. This is known as unwoven thread creation; none of the threads +created this way are `woven' with any of the other threads created +this way. (Whether threads are woven depends on how they were +created.) If the thread being split was itself woven with other +threads, exactly one of the resulting threads after the split is woven +with the threads that the original thread was woven to, but the rest +will not be woven to anything. (If that seems a somewhat unusual +rule: well, this is @ical{}.) + +In @cic{}, there are other guarantees that can be made about unwoven +threads (that is, threads not woven to any other thread). In +particular, they can all be guaranteed to run at approximately the +same speed; to be more precise, the number of commands that have been +given the chance to execute in any given thread will not differ by +more than 2 from the number of commands that have been given the +chance to execute in any other thread that was created at the same +time. (However, @code{COME FROM}s and @code{NEXT FROM}s can make this +relationship less precise; it is unspecified (in the technical sense +that means the compiler can choose any option it likes and change its +mind on a whim without telling anyone) whether a @code{COME FROM} or +@code{NEXT FROM} aiming at the current command counts towards the +command total or not, thus causing the relationship to become weaker +the more of them have the chance to execute. In versions of @cic{} +from 0.27 onwards, there is a third guarantee; that if a @code{COME +FROM} comes from itself, it will actually give other threads at least +some chance to run, at some speed, by counting itself as a command +every now and then; previously this requirement didn't exist, meaning +that a @code{COME FROM} could block all threads if it aimed for itself +due to the speed restrictions and the fact that @code{COME FROM}s need +not count towards the total command count.) Also, all commands, +including any @code{ONCE} or @code{AGAIN} attached to the command, are +atomic; this means that it's impossible for another thread to conflict +with what the command is doing. (In a departure from the usual +@ical{} status quo, these guarantees are somewhat @emph{better} than +in most other languages that implement threading, amusingly continuing +to leave @ical{} with the status of being unlike any other mainstream +language.) + +The only way to communicate between unwoven threads is by changing the +abstention status of commands; this always affects all threads in the +program, whether woven or not. (The combination of @code{ABSTAIN} and +@code{ONCE} is one way to communicate atomically, due to the atomic +nature of @code{ONCE}.) + +If there are at least two threads, the @code{GIVE UP} command ends the +current thread, rather than the current program. + +@node Multithreading using WHILE +@section Multithreading using WHILE +@findex WHILE +@anchor{WHILE} +@cindex multithreading, connected threads +@cindex threading, connected +@cindex threading, woven +@cindex connected threads +@cindex woven threads + +@portability{no, version 0.27+, version 0.05+, no} + +The @code{WHILE} command (which is not strictly speaking a command, +but more a sort of metacommand that joins commands) is a second method +of achieving multithreading. (In @clcic{}, there are at least two +other meanings for @code{WHILE}, but only the one implemented in +@cic{} is discussed here.) The syntax is somewhat unusual, and +consists of two commands separated by the @code{WHILE} keyword, but +sharing the statement identifier, execution chance, and any +@code{ONCE}/@code{AGAIN} keyword that may be present. For instance: + +@example +(1) DO COME FROM ".2~.2"~#1 WHILE :1 <- + "'?.1$.2'~'"':1/.1$.2'~#0"$#65535'"$ + "'"'&.1$.2'~'#0$#65535'"$#0'~#32767$#1" +@end example + +(OK, maybe that's an unnecessarily complicated example, and maybe it +shouldn't have included the @code{/} operator which is part of another +@ical{} extension (@pxref{Operand Overloading}). Still, I thought +that maybe you'd want to see how addition can be implemented in @ical{}.) + +A @code{WHILE} command starts two threads (the original thread that +ran that command and a new one), one of which runs the command to the +left of the @code{WHILE} and one of which runs the command to the +right. Any line number applies to the left-hand command, not the +WHILE as a whole, which is a metalanguage construct. @code{NEXTING +FROM}, @code{ABSTAINING FROM} or similar behaviour with respect to the +@code{WHILE} itself is impossible, although it's certainly possible to +abstain from either of its operands (and abstaining from the left +operand has much the same effect as abstaining from the @code{WHILE} +itself; the right-hand thread deliberately takes a bit of time to get +started just so that this behaviour happens). The right-command +thread starts just before the left command is run (so @code{NEXTING}, +etc.@:, directly to the left command will not start that loop in the +first place); if that command finishes (which may be almost +immediately for something like a calculate command, or take a long +time for something like @code{NEXT}), that thread loops and reruns +that command as long as the left command has not finished; +@code{COMING FROM} that command, or a @code{NEXT}/@code{NEXT FROM} +from/aiming at that command, doesn't count as finishing that command +until it is @code{RESUME}d back to (if possible; if it's come from, +that command can never end and the right-hand loop will continue +forever, or until it @code{GIVE}s @code{UP} or the loop ends due to +the command ending later in another thread). A @code{WHILE} command +itself exists across all threads of a multithreaded program in a way; +for each left-hand command that ends (in any thread), the next time a +right-hand command of the same @code{WHILE} ends it will cause the +thread it's looping in to end, regardless of whether that thread +corresponds to the thread in which the left-hand command ended. (As +well as a right-hand command ending, there's also the possibility that +it never got started; there is a delay before the right-hand command +runs during which a left-hand command ending can prevent the +right-hand thread starting in the first place; this counts as the same +sort of event as terminating a right-hand loop, and can substitute for +it anywhere a right-hand command ending is mentioned.) There is one +exception, in that if two or more left-hand commands end in a space of +time in which no right-hand commands for that @code{WHILE} ends, they +together only cause one right-hand command to end. (What, did you +expect the logical and orthogonal behaviour?) + +The two threads produced by a @code{WHILE} (the original thread and a +new copy of it) have more in common than ordinary @ical{} threads +created by @code{COME FROM}; ordinary threads share only +@code{ABSTAIN}/@code{REINSTATE} information, whereas the +@code{WHILE}-produced threads count as `woven' threads which also +share variables and stashes. (They still have separate instruction +pointers, separate instruction pointer stacks, such as the NEXT stack, +and separate choicepoint lists. Overloading information is shared, +though.) Being woven is a relationship between two or more threads, +rather than an attribute of a thread, although a thread can be +referred to as being unwoven if it is not woven to any other thread. + +Ordinary multithreading cannot create woven threads. When threads are +created by multiple @code{COME FROM}s from an original thread, which +was woven with at least one other thread, one of the resulting threads +counts as the `original' thread and remains woven; the rest are `new' +threads which initially start out with the same data as the original, +but are not woven with anything. Backtracking in a thread +(@pxref{Backtracking}) causes it to unweave with any threads it may be +woven with at the time (so the data in the thread that backtracks is +set back to the data it, and the threads it was woven with at the +time, had at the time of the @code{MAYBE}, but the other threads +continue with the same data as before). The only way to cause three +or more threads to become woven is with a new @code{WHILE} inside one +of the threads that is already woven, which causes all the new threads +to be woven together (the weaving relationship is transitive). + +@node Backtracking +@section Backtracking +@cindex backtracking +@cindex choicepoints +@cindex dormant thread +@cindex threading, in series +@cindex threading, dormant + +@portability{no, version 0.25+, no, no} + +A somewhat unusual threading construct that's available is +backtracking. In case you haven't come across it before (the concept +exists in other languages but is implemented differently and usually +in a less general way), the basic idea is that instead of executing or +not executing a command, you can @code{MAYBE} execute a command. This +causes the command to be executed, but also creates a dormant thread +in which the command wasn't executed; at any time later, the program +can either decide that it liked the consequences of the command and +@code{GO AHEAD} and get rid of the dormant thread, or decide that it +didn't like the consquences of the command and @code{GO BACK} to the +dormant thread, discarding the current one. The dormant thread is +more commonly called a `choicepoint', that is, a point at which a +choice was made but a different choice can still be made, and is +generally not thought of as a thread at all by most programmers. (In +case you're wondering: dormant threads are always unwoven.) + +@anchor{MAYBE} +@findex MAYBE +@cindex choicepoints, creating +To create a choicepoint, the statement identifier @code{MAYBE} is +used, rather than the more usual @code{DO} or @code{PLEASE}. +(Combination statement identifiers are still allowed, but must be in +the order @code{MAYBE PLEASE DO NOT} with optionally some parts +omitted, or different versions of @code{NOT} used, or both.) Here's an +example: + +@example +MAYBE DON'T GIVE UP +@end example + +When a command whose statement identifer contains @code{MAYBE} is +reached, it is executed or not executed as normal, but in addition a +choicepoint is created containing the program as it is at that time. +Only @code{ABSTAIN} and @code{REINSTATE}, which always affect all +threads in a program (even choicepoints), can alter the values stored +in the choicepoint; so in this way, a choicepoint is also somewhat +similar to the concept of a continuation in other languages. The +choicepoint is placed on a choicepoint stack, which is maintained +separately for each thread in much the same way that stashes and the +@code{NEXT} stack are. + +@anchor{GO BACK} +@findex GO BACK +@cindex choicepoints, activating +The choicepoint does not actually do anything immediately, but if the +program doesn't like the look of where it's ended up, or it decides to +change its mind, or just wants to try all the possibilities, it can +call the @code{GO BACK} command (which has no arguments, and is just +the statement identifier, optional execution chance, @code{GO BACK}, +and optional @code{ONCE} or @code{AGAIN}). This causes the current +thread to unweave from all other threads and then replace itself with +the thread created by the choicepoint on top of the choicepoint stack. +The difference is that this time, the abstention or reinstatement +status of the command that was modified with @code{MAYBE} is +temporarily reversed for determining whether it runs or not (this +reversal only lasts immediately after the @code{GO BACK}, and does not +affect uses of the command in other threads or later in the same +thread), so unless it has been @code{ABSTAIN}ed or @code{REINSTATE}d +in the meantime it will run if and only if it wasn't run the first +time. The choicepoint stack's top entry is replaced by a `stale' +choicepoint that definitely isn't a thread; attempting to @code{GO +BACK} to a stale choicepoint instead causes the stale choicepoint to +be deleted and the program to continue executing. (This is what gives +@ical{}'s backtracking greater flexibility in some ways than some +other languages; to get backtracking without the stale choicepoints +having an effect, simply run @code{COME FROM} the @code{GO BACK} as +the previous statement.) + +Note that, though, when a thread splits into separate threads (whether +woven or unwoven), the choicepoint stack doesn't split completely, but +remains joined at the old top of stack. The two choicepoint stacks +can add and remove items independently, but an attempt to @code{GO +BACK} to before the current thread split off from any other threads +that are still running instead causes the current thread to end, +although it will @code{GO BACK} as normal if all other threads that +split off from it or that it split off from since the top choicepoint +of the stack was created have ended since. This means that it's +possible to backtrack past a thread splitting and get the effect of +the thread unsplitting, as long as both resulting threads backtrack; +this is another way in which @ical{}'s backtracking is more flexible +than that of some other languages. + +@anchor{GO AHEAD} +@findex GO AHEAD +@cindex choicepoints, discarding +If, on the other hand, a program decides that it likes where it is and +doesn't need to @code{GO BACK}, or it wants to @code{GO BACK} to a +choicepoint lower down the stack while skipping some of the ones +nearer the top of the stack, it can run the @code{GO AHEAD} command, +which removes the top choicepoint on the stack, whether it's a genuine +choicepoint or just a stale one. + +Both @code{GO AHEAD} and @code{GO BACK} cause errors if an attempt is +made to use them when the choicepoint stack is empty. + +@node Operand Overloading +@chapter Operand Overloading +@cindex operand overloading +@findex / +@cindex slat +@cindex reverse assignment + +@portability{no, version 0.26+, version 0.05+, no} + +(Operand overloading in @cic{} is nowhere near as advanced as it is in +@clcic{}. This chapter only explains the partial implementation used +by @cic{}; for a full implementation, see @clcic{} and its +documentation.) + +Operand overloading is a method of using a onespot or twospot variable +as a substitute for an expression. When a variable is overloaded to +an expression (which could be another variable, or something more +complex), any uses of that variable cause the expression to be +substituted instead. + +At the beginning of the program, all variables stand for themselves; +so @code{.1} really does mean @code{.1}, for instance. The meaning of +a variable can be overloaded using the slat operator (@code{/}), which +is the same in both Princeton and Atari syntax: it is a binary +operator whose left argument must be a onespot or twospot variable and +whose right argument can be any expression. The slat operator returns +the true value of its left argument, but as a side effect, changes the +meaning of its left argument to be its right argument. Here is an +example: + +@example +DO .1 <- .2/'.3~.4' +@end example + +The example causes @code{.2}'s true value to be assigned to @code{.1} +(unless of course @code{.1} is read-only), but also causes @code{.2} +from then on to actually mean @code{'.3~.4'}, except when it's the +left operand of a slat operator. So for instance, @code{DO .1 <- .2} +would actually assign @code{'.3~.4'} to @code{.1}. Somewhat +confusingly, this also works in the other direction; @code{DO .2 <- +.1} would assign @code{.1} to @code{'.3~.4'}, which would have the +effect of changing the values of @code{.3} and @code{.4} so that +@code{'.3~.4'} had the correct value, or throw an error if it couldn't +manage this. (The general rule in this case is that any variable or +constant in the expression that overloads the variable is at risk of +being changed; this is known as a `reverse assignment'. Code like +@code{DO .1 <- .1/#1} is entirely capable of changing the value of +@code{#1}, although to protect new @ical{} users @cic{} will refuse to +carry out operations that change the value of constants unless a +command-line switch (@pxref{-v}) is used to give it permission. In +@cic{}, changing the value of a constant only changes meshes with that +value, but in @clcic{} it can also change non-mesh uses of that +constant, so doing so is not portable anyway.) + +When multiple overloading rules are in effect, they are all applied; +overloading @code{.1} to @code{'.2~.3'} and @code{.2} to +@code{'.3$.4'} will cause @code{.1} to refer to @code{''.3$.4'~.3'}. +However, this expansion stops if this would cause a loop; to be +precise, overloading is not expanded if the expansion is nested within +the same expansion at a higher level (so @code{.1/.2} and @code{.2/.1} +together cause @code{.1} to expand to @code{.2}, which expands to +@code{.1}, which cannot expand any further). In @cic{}, the +expression on the right hand side of a slat is not evaluated and not +expanded by operand overloading. + +@code{STASHING} a variable causes its overloading information to be +stashed too; @code{RETRIEVING} it causes its overload rule to also be +retrieved from the stash (or any overload rule on the variable to be +removed if there wasn't one when the variable was stashed). + +Overloading a onespot variable to a twospot variable or vice versa is +possible, but the results are unlikely to be predictable, especially +if a onespot variable is used to handle a twospot value. Possible +outcomes include truncating the value down to the right bitwidth, +throwing an error if a value outside the onespot range is used, and +even temporarily handling the entire twospot value as long as it +doesn't end up eventually being assigned a value greater than twospot. + +Note that reverse assignments can cause unpredictable behaviour if an +attempt is made to reverse-assign the same variable twice in the same +expression. In particular, sequences of commands like @code{DO .1 <- +.2/'.3$.3' DO .2 <- #6} are liable to succeed assigning garbage to +@code{.3} rather than failing as they ought to do, and likewise any +situation where a variable is reverse-assigned twice in the same +expression may assign garbage to it. This behaviour is seen as +unsatisfactory, though, and plans exist to improve it for future +versions. + +@node PIC-INTERCAL +@chapter PIC-INTERCAL +@cindex PIC-INTERCAL +@cindex embedded systems +@cindex microcontrollers + +@portability{no, version 0.26+, no, no} + +PIC-INTERCAL is a simplified version of @ical{} designed especially +for embedded systems, designed to minimise code and data usage by +@ical{} programs so that they can fit on devices whose memory is +measured in bytes rather than megabytes. (It is named after the first +microcontroller for which code was successfully generated, and which +influenced the choices of commands, the PIC16F628 manufactured by +Microchip, and is most likely to be portable to other microcontrollers +in the same range.) @cic{} only compilers as far as C code when +producing PIC-INTERCAL; it is up to the user to find the appropriate +cross-compiler to translate this C into the relevant dialect of +machine code. (Two header files in the distribution, +@file{src/pick1.h} and @file{src/pick2.h}, don't have any affect on +the compiler but are referenced by the generated code, and the intent +is for the user to change them to suit the behaviour of the PIC +compiler used, because these are not as standardised as C compilers +for everyday systems.) + +There are several restrictions on PIC-INTERCAL programs: + +@itemize + +@item +It's impossible to store more than one item in the STASH for any given +variable. + +@item +Many errors are not checked at runtime; it is the programmer's job to +ensure that runtime errors are avoided. (The few errors that are +detected will send the program into an infinite loop, as there is no +sensible way to exit from a PIC program.) + +@item +Double-oh-sevens are not randomised, but instead depend merely on +whether the probability given is greater than 50% or not. + +@item +The NEXT stack is limited to 16 entries rather than the usual 80. + +@item +@code{ABSTAIN} and @code{REINSTATE} still work, but cannot be computed +@code{ABSTAIN}s, and will not necessarily work when used to affect the +system library or calls to it. + +@item +@code{READ OUT} and @code{WRITE IN} don't work. (See below for a +replacement.) + +@item +@code{COME FROM} and @code{NEXT FROM} must aim at a label, not an +expression or gerund. + +@item +Multithreading and TriINTERCAL cannot be used on PICs. (Operand +overloading can be used, but only if your PIC cross-compiler supports +function pointers; some don't.) + +@end itemize + +@anchor{PIN} +@findex PIN +@cindex I/O, PIC-INTERCAL +In order to provide I/O capabilities, a new command @code{PIN} is +available. It controls up to 16 I/O pins on the PIC or other embedded +system; an I/O pin is capable of receiving or sending voltages to an +electrical or electronic circuit. This explanation assumes that the +device being controlled is a PIC16F628A, and therefore has its pins in +two blocks of 8 named @samp{PORTA} and @samp{PORTB}; for other +microcontrollers, adapting the code in @file{src/pick1.h} is likely to +be necessary to tell the compiler how to control the I/O pins, and the +way in which this done will affect which I/O pins it is that the +program will end up being able to communicate with. + +The @code{PIN} command takes one twospot variable as its argument, +like this: + +@example +DO PIN :2 +@end example + +The twospot variable is conceptually divided into 4 blocks of 8 bits. +The highest two blocks control the directions of the pins in +@code{PORTB} (most significant block) and @code{PORTA} (second most +significant block); a 1 on any bit means that the corresponding I/O +pin should be set to send data, and a 0 means that it should be set to +receive data. The lower two blocks control the values on the pins +that are sending (and are ignored for receiving pins); the second +least significant block controls @code{PORTB} and the least +significant block controls @code{PORTA}, with a 1 causing the program +to set the output voltage to that of the microcontroller's negative +voltage supply rail, and a 0 causing the program to set the output +voltage to that of the microcontroller's positive voltage supply +rail. (These voltages may vary on other systems; consult your +system's datasheet and the changes you made to the header files.) +After setting the pins, the @code{PIN} command then reads them as part +of the same operation, this time setting the values of the lower +blocks that are receiving, rather than setting the pins from the lower +blocks that are sending. However, 1 and 0 bits on all bits of the +twospot variable have the opposite meaning when doing this, so that 1 +means receiving/positive voltage rail and 0 means sending/negative +voltage rail. There is no way to input without output, or vice versa, +but it's trivial to just send the same output again (which has no +effect, because the voltage on sending pins is maintained at the same +level until it is changed), or to ignore the input received. + +@node CREATE +@chapter CREATE +@findex CREATE +@cindex creating syntax +@cindex syntax, creating + +@portability{no, version 0.28+, see text, no} + +The @code{CREATE} command allows the creation of new syntax at +runtime. @clcic{} has had such a command since 1.-94.-8, but its +syntax is completely different and incompatible with the @cic{} +version, and so is not documented here (see the @clcic{} documentation +for more details). The @cic{} version is only defined if the +@code{-a} option is used on the command line (and a runtime error E000 +otherwise), because it forces the operand overloading code to be +introduced and so slows down every variable access in the program. + +The syntax of the @code{CREATE} command is to write @code{CREATE}, +then a line label, then anything. OK, well not quite anything; you're +restricted to syntax that is supported by the `just-in-case' compiler +that runs on comments at compile time just in case they gain a meaning +later (see below). The anything provides an example statement to +@code{CREATE}; statements which look the same (but may differ in +details) are created. Typical syntax for a @code{CREATE} statement +would therefore look something like this: + +@example +DO CREATE (5) SWITCH .1 WITH .2 +@end example + +There is also computed @code{CREATE}, working identically to ordinary +@code{CREATE} except that the line number is taken from an expression +and the created command must start with a letter (to avoid an +ambiguity if the expression giving the line label happens to be an +array reference), with a syntax like this: + +@example +DO CREATE .5 SWITCH .1 WITH .2 +@end example + +Here, a new @code{SWITCH WITH} statement (there is no such statement +in @ical{} normally) is being created. This command makes it possible +to do this: + +@example +DO SWITCH .3 WITH .4 +@end example + +Normally that line would be an error (E000) due to being unrecognised, +but having been @code{CREATE}d, it's now a real statement. (The +gerund to affect created statements is @code{COMMENT}, just like +before they were created; the gerund to affect @code{CREATE} itself is +@code{CREATION} (@code{CREATING} is also allowed, but not as +elegant).) When the created statement is encountered, it @code{NEXT}s +to line (5), the line number specified in the @code{CREATE} statement. +In order for the code there to be able to affect the variables +mentioned in the statement, the variables @code{:1601} (for the first +variable or expression mentioned), @code{:1602} (for the second +variable or expression mentioned), and so on, are @code{STASH}ed and +then overloaded to the respective expressions or variables mentioned +in the created command; so @code{:1601} has been overloaded to mean +@code{.3} and @code{:1602} has been overloaded to mean @code{.4} at +this point. Then, the code at (5) runs; if it returns via a +@code{RESUME #1}, @code{:1601} and @code{:1602} will be +@code{RETRIEVE}d automatically and the program will continue from +after the created statement. (If you do not resume to that point, say +if you're creating a flow control statement, you'll have to deal with +the stashes for the 1600-range variables yourself.) + +So what syntax is available in created statements@? All the capital +letters except @samp{V} (which is an operator in @ical{}) are +available and can be used freely and as many times as desired; they +match themselves literally. However, they are not allowed to spell an +@ical{} keyword at any point (so watch out for @code{DO} and +@code{FROM}, for instance). Whitespace is allowed, but is ignored +(both in the @code{CREATE} template statement, and in the code being +created; so @code{DO SW ITCH :8 WITH :50} will also have been +created). Then, there are three groups of matchable data: scalar +variables (onespot or twospot variables, as used in the examples +above) match other scalar variables, array elements (like @code{,4 SUB +'.5~.6'}) match other array elements, and other expressions match +other other expressions. Two matchable data may not appear +consecutively in a created command, but must be separated by at least +one capital letter (to prevent array-subscript-related ambiguities; +remember that the just-in-case compiler has to compile these +statements at compile time without knowing what they are). The actual +expressions used in the @code{CREATE} statement don't matter; they're +just examples for the runtime to match against. + +@cindex CREATE, operators +It is also possible (from @cic{} version 0.29 onwards) to create new +operators. Such operators are always binary operators (that is, they +take two arguments and parse like mingle or select), and always return +32-bit results. There are three types of legal names for such +operators, all of which are treated equivalently: lowercase letters, +punctuation marks otherwise unused in @ical{}, and overstrikes +consisting of a character, a backspace, and another character (apart +from overstrikes already used for built-in @ical{} operators). The +syntax for creating an operator looks like one of these: + +@example +DO CREATE (5) x +DO CREATE .5 = +@end example + +The arguments to the operator will be overloaded onto :1601 and :1602 +(which are, like with @code{CREATE}d statements, stashed before the +overloading happens), and the return value is read from :1603 (which +is stashed, then overloaded to itself). All these three variables are +retrieved again after the operator finishes evaluating. + +Note that it is a very unwise idea to use a @code{CREATE}d operator in +the expression for a computed @code{COME FROM} or @code{NEXT FROM}, +because this always leads to an infinite regress; whenever any line +label is reached (including the line label that the @code{CREATE} +statement pointed at), the expression needs to be evaluated in order +to determine whether to @code{COME FROM} that point, which in turn +involves evaluating lines which have labels. + +Some other points: a newer @code{CREATE} statement supercedes an older +@code{CREATE} statement if they give equivalent templates, multiple +@code{CREATE} statements may aim at the same line (this is the +recommended technique for creating a statement that can handle +expressions even if they're array elements or variables; you do this +by specifying multiple templates in multiple @code{CREATE} +statements), and strange things happen if a twospot variable in the +1600-range is used as an argument to a created statement itself +(because of the stash/retrieve, such a variable can usually be read, +but may not always be able to be written without the data being lost). + +@node External Calls +@chapter External Calls +@cindex external calls +@cindex other languages +@cindex foreign functions +@cindex calls, external + +@portability{no, version 0.28+, no, no} + +@cic{} has a feature allowing @ical{} and non-@ical{} code to be +mixed. This is achieved by causing the non-@ical{} programs to +participate in the @ical{} line-numbering model. The same feature +allows expansion libraries to be linked into the code. + +To create a combined program containing @ical{} and non-@ical{} code, +use @command{ick} as the compiler as normal, but specify both the +@ical{} and non-@ical{} source files on the command line, and use the +@option{-e} command-line option. @command{ick} will invoke other +compilers as necessary, after modifying the source files accordingly. +At present, external calls are only supported to and from C. + +In each case, it will be the @ical{} program that is invoked first. +(This means that it is impossible to link together more than one +@ical{} program, but you probably don't want to, because concatenating +the programs is likely to have a similar effect.) You can get the +@ical{} program to @code{NEXT} to the non-@ical{} program immediately, +or the non-@ical{} program to @code{COME FROM} or @code{NEXT FROM} the +@ical{} program immediately, to obtain the effect of running the +non-@ical{} program first. + +Note that external calls are incompatible with PIC-INTERCAL and with +multithreading; note also that you must use @command{gcc} as your +compiler, and @acronym{GNU} cpp and ld, for them to work in the +current version of @cic{}. + +@menu +* External Calls to C:: How to put @ical{} calls in C. +* External Calls to Funge-98:: Linking Befunge-98 and @ical{}. +* Miscellaneous External Calls:: Other things you can link in. +* Using External Calls:: What happens when you use -e. +* Expansion Libraries:: Expanding the compiler's capabilities. +@end menu + +@node External Calls to C +@section External Calls to C +@cindex C +@cindex other languages, C +@cindex external calls, to C + +@portability{no, version 0.28+, no, no} + +Linking C and @ical{} programs is achieved by placing various +constructs into the C programs that are equivalent to various @ical{} +constructs. It is possible to simulate a line with a label and a +dummy command (which serves as a @code{COME FROM} suckpoint and +@code{NEXT} target), a command with a line label, @code{NEXT}, +@code{RESUME}, and @code{FORGET}, and @code{COME FROM} and @code{NEXT +FROM}. Onespot and twospot variables are accessible from inside the C +program, where they can be read and written; however, the @ical{} +program cannot access any variables inside the C program that weren't +part of the @ical{} program originally. + +To prevent various logical impossibilities, there are restrictions on +where these can be used and what preparation is needed before they are +used. Also, the semantics are not always exactly what you might +expect for technical reasons. + +It should be observed that the @ical{} link intrudes on the user +namespace. To prevent possible namespace clashes, no identifiers +starting with @code{ick_} or @code{ICK_} should be used anywhere in +the linked C program for any reason, except where specified in this +manual. + +@menu +* External C Call Infrastructure:: Enabling a C program for external calls +* ick_startup:: Doing things at startup +* ick_linelabel:: Labelling lines... +* ick_labeledblock:: ...and labelling blocks +* ick_comefrom and ick_nextfrom:: Stealing control from elsewhere +* ick_next:: The INTERCAL answer to subroutine calls +* ick_resume:: Going back to before a NEXT +* ick_forget:: Discarding NEXT stack entries +* ick_get/setone/twospot:: Accessing INTERCAL variables from C +* ick_create:: CREATE statements via external calls +* External Calls and auto:: Considerations for auto variables +@end menu + +@node External C Call Infrastructure +@subsection External C Call Infrastructure +@cindex C, external call infrastructure +@cindex external calls, C infrastructure + +For a C program to be connected to an @ical{} program, it needs to be +marked with the correct header file, and needs to have functions marked +for communication with the @ical{} program. + +@table @code + +@item #include <ick_ec.h> +@cindex ick_ec.h +The header file @file{ick_ec.h} must be included using the +preprocessor in any file which uses any of the @ical{} external call +functions, variables, or macros. (Note that this file may not +necessarily exist, or exist in the usual place; @command{ick} will +deal with making sure the correct header file is included.) This will +include @file{stdint.h} (a standard C header file, which must exist on +your system), so that you can access @ical{} variables (the @ical{} +types onespot, twospot, tail, hybrid correspond to the C types +uint16_t, uint32_t, uint16_t*, uint32_t* respectively); also, it will +provide the prototypes for all the functions and definitions for all +the macros needed to use the external calls system with C. + +@item ICK_EC_FUNC_START +@itemx ICK_EC_FUNC_END +@findex ICK_EC_FUNC_START +@findex ICK_EC_FUNC_END +Many of the @ical{} interface macros (@code{ick_linelabel}, +@code{ick_comefrom}, and @code{ick_nextfrom}) make it possible to +jump from an @ical{} program to a C program. Because C doesn't allow +jumping into the middle of a function, there has to be some way to +create a block of code which @emph{can} be jumped into. This is what +these two macros achieve. + +This declaration and definition: + +@example +ICK_EC_FUNC_START(identifier) +@{ + /* code goes here */ +@} +ICK_EC_FUNC_END +@end example + +is equivalent to this: + +@example +void identifier(void) +@{ + /* code goes here */ +@} +@end example + +except that it is possible to jump from an @ical{} program into the +declared and defined program. (If you need to write a prototype for +the function early, @code{void identifier(void);} is perfectly +acceptable, but an early prototype is not required unless you call the +function from earlier within the C code.) Of course, you can +substitute any identifier that's legal as a function name for +@code{identifier} (as long as it doesn't start with @code{ick_} or +@code{ICK_}). The resulting function is a function (for instance, you +can take its address or call it in the usual ways); the only +differences are that it can be jumped into from @ical{} code and that +it is constrained to take no arguments and return no data. (It can +still access global and @ical{} variables.) If the function is jumped +into from @ical{} code, but then control flow reaches the end of the +function, or the function @code{return;}s but was not called from C, +the resulting behaviour is undefined; @cic{} will attempt to continue +by some means at that point, but may fail. If a function is unsure +whether it gained control from C or from INTERCAL code, it may use +@code{ick_return_or_resume} (described below). + +Because you are not allowed to declare two C functions with the same +name (even in different modules), all functions declared with +@code{ICK_EC_FUNC_START} must have unique names across the entire +compilation. + +@end table + +@node ick_startup +@subsection ick_startup +@findex ick_startup +@cindex startup code, C + +It is sometimes necessary for a C program to do its own initialisation +before the INTERCAL program starts running. To do so, it can use the +@code{ick_startup} macro inside a function declared with +@code{ICK_EC_FUNC_START}; the syntax is @code{ick_startup(block)}, +where the argument is an expression, statement, or compound statement +to run. The argument itself must not contain any ick_-prefixed macros +or functions except possibly ick_create, may have side effects, and +must fit the C preprocessor's idea of what a macro argument should +look like (it's more used to parsing expressions than blocks; the +general rule is to avoid commas except when they're directly or +indirectly inside parentheses or strings). + +@node ick_linelabel +@subsection ick_linelabel +@findex ick_linelabel +@cindex line labels, C + +A line label is something that can be @code{NEXT}ed to and @code{COME +FROM}. Unlike an @ical{} line label, it does not label a statement, +and therefore attempts to @code{ABSTAIN} or @code{REINSTATE} it may be +errors, or may be ignored (it's unspecified which, which means that +either may happen for any or no reason, but exactly one will happen in +any given case, although the choice might not be consistent). + +The macro @code{ick_linelabel(expression);} may appear anywhere a +compound statement would normally be able to appear. (That is, it +looks like a function call being used as a standalone expression, but +in fact the places where it can appear are more limited.) In contrast +to ordinary line labels, an expression can be used rather than just a +constant; however, the behaviour is undefined if the expression has +side-effects. Upon encountering the line label, any @code{COME FROM}s +or @code{NEXT FROM}s aiming at the line label (including +@code{ick_comefrom}s and @code{ick_nextfrom}s) will steal control from +the program; @code{RESUMING} after a @code{NEXT FROM} will work, but +suffers from the same caveats as setjmp/longjmp do (any auto variables +that change their value between the @code{NEXT FROM} and @code{RESUME} +will have their value clobbered (i.e. their value is no longer +reliable and should not be accessed)). Note that the @ical{} +variables are immune to this problem. You can also avoid the problem +by marking variables as @code{volatile} in the C program. + +It is possible to @code{NEXT} or @code{ick_next} to a +@code{ick_linelabel}, which has the same effect as saving the +@code{NEXT} stack, calling the function containing the +@code{ick_linelabel} and then immediately doing a C @code{goto} to an +imaginary label preceding it. Due to this possibility, an +@code{ick_linelabel} is only allowed within a function defined with +@code{ICK_EC_FUNC_START}. + +@node ick_labeledblock +@subsection ick_labeledblock +@findex ick_labeledblock +@cindex labeled blocks +@cindex blocks, labeled + +In @ical{} programs, labels don't stand on their own, but instead +label a statement. The difference between a standalone line label and +a line label that labels a statement is that @code{COME FROM}s will +come from the @emph{label itself} (which is before the next statement) +when aiming at a standalone line label, but the @emph{end of the +statement} when aiming at a labeled statement. To achieve the same +effect in C, the macro @code{ick_labeledblock} is available; it can be +used as @code{ick_labeledblock(expression,expression)} or +@code{ick_labeledblock(expression,statement)}; the first argument is +the label, and the second argument is an expression or statement to +label (if an expression is labeled, it will be converted to a +statement that evaluates it for its side effects and discards the +result). It is even permitted to label a block statement in this way. +Note, however, that you have to contend with the C preprocessor's +ideas of where macro arguments begin and end when doing this. Other +than the position of the @code{COME FROM} target created by the label, +this behaves the same way as @code{ick_linelabel} (so for instance, +computed line labels are allowed, but the expression that computes +them must not have side effects, and it is only allowed within a +function defined with @code{ICK_EC_FUNC_START}). + +@node ick_comefrom and ick_nextfrom +@subsection ick_comefrom and ick_nextfrom +@findex ick_comefrom +@findex ick_nextfrom +@cindex COME FROM, in C +@cindex NEXT FROM, in C + +The @code{ick_comefrom} and @code{ick_nextfrom} macros are, like the +other @ical{} flow control macros (as opposed to functions), only +allowed within a function defined with @code{ICK_EC_FUNC_START}. They +act almost exactly like the @ical{} statements of the same name +(although note that C statements cannot be @code{ABSTAIN}ed +@code{FROM} even if they act the same way as @ical{} statements); +they are written as @code{ick_comefrom(expression);} and +@code{ick_nextfrom(expression);} respectively (note that they must be +called as statements, and cannot be used as part of an expression). +Whenever a standalone line label is encountered whose expression +evaluates to the same number as the expression inside the +@code{ick_comefrom} or @code{ick_nextfrom}, and that number is at most +65535, then control will be transferred to the @code{ick_comefrom} or +@code{ick_nextfrom}, leaving a @code{NEXT} stack entry behind in the +case of @code{ick_nextfrom}; likewise, if the end of a labeled +statement, expression or block is reached and the label has the right +number. Some caveats: the expression need not be constant, but must +not have side effects, must not be negative, and must fit into the +range of an @code{unsigned long} in the C program (and the statement +will do nothing if the expression evaluates to a value larger than +65535). In keeping with the best C traditions, these caveats are not +checked, but instead result in undefined behaviour if breached. + +@findex ick_comefromif +@findex ick_nextfromif +There are also versions @code{ick_comefromif} and @code{ick_nextfromif}, +which take a second parameter, which is a condition that specifies +whether control is actually stolen from the target. The condition may +have side effects, and is only run when the line numbers match; it should +return 0 or NULL to leave control flow alone, or nonzero to steal +control, and should be either an integral type or a pointer type. +Although side effects are allowed, the condition must not look at or +alter @code{auto} or @code{register} variables in the enclosing function, +not even if they are also marked @code{volatile}. (Global and +@code{static} variables are fine, though.) + +@node ick_next +@subsection ick_next +@findex ick_next +@cindex NEXT, in C + +@code{ick_next} is a macro that acts like the @ical{} statement +@code{NEXT}. Contrary to the other @ical{}-like macros, it can be used +in any function regardless of whether it was defined with +@code{ICK_EC_FUNC_START}; however, it must still be used as a statement +by itself, and a call to it looks like @code{ick_next(expression);}. The +expression is the label to @code{NEXT} to, and works under the same rules +as the expressions for @code{ick_comefrom}; it need not be constant +(unlike in @cic{}!), but must not have side effects, must not be +negative, must fit into the range of an unsigned long, and is ignored if +it is over 65535. If there happen to be multiple labels with the correct +value at the time, the compiler will @code{NEXT} to one of them. Bear in +mind that there is a limit of 80 entries to the @code{NEXT} stack, and +that this limit is enforced. + +If the resulting @code{NEXT} stack entry is @code{RESUME}d to, the +program will continue after the @code{ick_next} as if via @code{setjmp}, +with all the usual restrictions that that entails; if the resulting +@code{NEXT} stack entry is forgotten, then the @code{ick_next} call will +never return. (Notice the 'as if via setjmp' condition allows you to +preserve the vales of @code{auto} and @code{alloca}-allocated storage as +long as its value has not changed since the @code{ick_next} was called, +which is a significantly more lenient condition than that normally +imposed on such variables (@pxref{External Calls and auto}). + +@node ick_resume +@subsection ick_resume +@findex ick_resume +@cindex RESUME, in C + +@code{ick_resume} is a macro, but there are few restrictions on its use; +it is permitted to use it inside an expression (but it returns void, +making this not particularly useful), and acts like a function which +takes an unsigned short argument, returns void, and has a prototype (but +you cannot take its address; if you need to be able to do that, write a +wrapper function for it). It can be used within any function regardless +of how it was declared, and never returns; instead, it pops the specified +number of @code{NEXT} stack entries and resumes execution at the last one +popped, just as the @ical{} statement does. This causes the same errors +as the @ical{} statement if the number of entries popped is zero or +larger than the @code{NEXT} stack. + +@findex ick_return_or_resume +There is also a macro @code{ick_return_or_resume();}; it can only be used +inside a function defined with @code{ICK_EC_FUNC_START}, and is +equivalent to @code{return;} if the function was called from C, or +@code{ick_resume(1);} if the function was called from @ical{}. It's +therefore a safe way to return from such a C function if you don't know +how control reached it in the first place. + +@node ick_forget +@subsection ick_forget +@findex ick_forget +@cindex FORGET, in C + +The @code{ick_forget} macro removes @code{NEXT} stack entries, and the +corresponding C stack entries. It must be called as a statement by +itself, and its invocation looks like this: @code{ick_forget(expr);}, +where the expression is the number of @code{NEXT} stack entries to forget +(all of them will be forgotten if the number is higher than the number of +entries). The expression will be casted to an @code{unsigned short}. + +@code{ick_forget} can only be used inside a function declared with +@code{ICK_EC_FUNC_START}. As it is removing stack entries both in +@ical{} and in C, it will clobber the value of all @code{auto} variables +created since the highest remaining @code{NEXT} stack entry came into +being (or since the start of the program, if the @code{NEXT} stack is +emptied by the command) and also deallocate all @code{alloca} storage +allocated since then. It also causes the return address of the current +function to become undefined, so that function must not return; control +may leave it via @code{RESUME}, or via @code{COME FROM}, or via +@code{NEXT} or @code{NEXT FROM} followed by the relevant @code{NEXT} +stack entry being forgotten (the function is still 'running' but +suspended while the @code{NEXT} stack entry still exists). (Note that +these restrictions are stronger than those on @code{RESUME}; this is +because @code{RESUME} preserves most of the stack, but @code{FORGET} +destroys parts of the stack and therefore cannot avoid destroying the +data stored there. It could be much worse; a previous (never released) +version of the code didn't remove those parts of the stack in many +circumstances, leading to a stack leak that caused programs to segfault +after a while.) + +@node ick_get/setone/twospot +@subsection ick_get/setone/twospot +@findex ick_getonespot +@findex ick_setonespot +@findex ick_gettwospot +@findex ick_settwospot +@cindex variables, from C + +This class of four functions make it possible to get and set @ical{} +scalar variables from C code. Their prototypes are as follows: + +@example +uint16_t ick_getonespot(unsigned short varnumber); +void ick_setonespot(unsigned short varnumber, uint16_t newvalue); +uint32_t ick_gettwospot(unsigned short varnumber); +void ick_settwospot(unsigned short varnumber, uint32_t newvalue); +@end example + +The program will error out with a fatal error (@pxref{E200}) if the +variable you request is mentioned nowhere in the @ical{} program; if +you attempt to set an @code{IGNORE}d variable, the attempt will +silently fail (just as if you assigned to it in an @ical{} program). +The get functions are safe to use in a computed line label, so you can +use them to produce computed line labels that depend on @ical{} +variables. (@code{uint16_t} and @code{uint32_t} are standard C data +types; if your system doesn't provide them, get better system header +files.) + +If you care about speed, note that .1 is the fastest variable of all +to access, and otherwise variables first mentioned near the top of the +@ical{} program will be faster to access than variables mentioned +lower down. + +@node ick_create +@subsection ick_create +@cindex CREATE, in C +@cindex C, CREATE + +The @code{ick_create} function (prototype: @code{void +ick_create(char*, unsigned long)}) allows the external calls system to +be used to create new @ical{} syntax; to do this, you give a +`signature' representing the syntax you want to define and a line +number to the function (which are its two arguments, respectively). +The signature defines the syntax that you are defining; whenever that +syntax is encountered within the @ical{} program, it will @code{NEXT} +to the line number you specify, which can do various clever things and +then @code{RESUME} back to the @ical{} program (or if you're defining +a flow-control operation, you might want to leave the @code{NEXT} +stack entry there and do other things). However, note that the +overloading of @code{:1601}, etc.@:, will still take place as in the +@ical{} version of @code{CREATE} if the @option{-a} option is used +(@pxref{-a}), so care is needed when writing flow control statements +that they work both with and without the option and don't cause +@code{STASH} leaks (which means no @code{FORGET}ting the relevant +@code{NEXT} stack entry, and no looking at 1600-range variables). +This allows the external calls system to define whole new @ical{} +commands, with the same power as any other programming language. + +There are various restrictions on what syntax you can @code{CREATE} +with this method, which are best explained by an explanation of the +relevant @cic{} compiler internals. When an @ical{} program is +compiled by @cic{}, any unrecognised statements it comes across are +compiled by a `just-in-case' compiler that attempts to compile them +anyway with no knowledge of their syntax, just in case the syntax +becomes defined later. (E000 (@pxref{E000}) will be thrown when such +statements are encountered at runtime, unless the syntax has been +@code{CREATE}d since to give a statement a meaning.) For the +just-in-case compiler to run, the resulting statement must be +completely unrecognised; this means that it may contain no keywords +(not even a sequence of letters that forms a keyword, such as +@code{FROM} or @code{DO}), it must consist only of variable names, +expressions, and capital letters other than @samp{V} (because @samp{V} +is a unary operator, so otherwise there would be ambiguity), and in +which any two variable names or expressions are separated by at least +one capital letter. The compiler will produce a `signature' for the +unknown command that can be defined. + +@cindex signatures +@cindex CREATE, signatures +A signature consists of a sequence of characters (and is represented +as a null-terminated string; the runtime makes a shallow copy of the +string and keeps it until the end of the program, so arrangements must +be made to ensure that the storage in which the string is allocated +stays around that long, but this opens up interesting possibilities in +which the signature that was actually @code{CREATE}d can be modified +retroactively); whitespace is not allowed in a signature. Capital +letters can be used (apart from @samp{V}), and match the same capital +letters literally in the @ical{} syntax being created; also available +are the special characters @samp{.,;~}, which match respectively a +scalar variable (a onespot or twospot variable such as @code{:1}), an +array variable (such as @code{;2}), an array element (such as @code{,3 +SUB #4 #5}), and an expression that isn't a variable name and isn't an +array element (such as @code{.4$.5}). If you want to be able to match +other things (say, to be able to match all expressions), you will need +to submit multiple signatures using multiple calls to +@code{ick_create}; maybe you could write a library to do that +automatically. + +@code{CREATE}d operators also have signatures, but of quite a +different form. The signature for a single-character operator is a +lowercase u, followed by its character code in hexadecimal (no leading +zeros, and in lowercase); the signature for an overstrike is a +lowercase o, followed by the lower relevant character code in +hexadecimal, followed by a lowercase x, followed by the higher +relevant character code in hexadecimal. + +The routine that is @code{NEXT}ed to will presumably want to be able +to see what in the @ical{} program was matched by the signature, so a +range of function-like macros is provided to access that. They must +be run from within the invocation of the function which was +@code{NEXT}ed into by the created syntax (@pxref{External Calls and +auto} for when a function invocation ends, which could be sooner than +you think when the @cic{} external calls system is used), and are +undefined behaviour when that invocation did not gain control from a +@code{CREATE}d statement. Here are their effective prototypes: + +@example +int ick_c_width(int); +int ick_c_isarray(int); +unsigned short ick_c_varnumber(int); +uint32_t ick_c_value(int); +/* These require -a to work */ +uint32_t ick_c_getvalue(int); +void ick_c_setvalue(int, uint32_t); +@end example + +The first argument to all these macros is the position of the match in +the signature (0 for the first non-capital-letter match in the +signature, 1 for the second, and so on until no more items are left in +the signature to match); specifying a position that isn't in the +signature is undefined behaviour. + +@code{ick_c_width} returns the data type, as a width in bits, of the +expression (or the width in bits of an element of the passed in +array), and @code{ick_c_isarray} returns 1 if the argument was an +array variable or 0 if it was an expression (array elements and scalar +variables are expressions). @code{ick_c_varnumber} returns the +variable's number (for instance 123 for @code{.123}), or 0 if the +corresponding argument was not a variable; in the cases where the +argument was a variable, these three functions together provide enough +information to figure out which variable (which is useful if you're +writing an extension which takes a variable name as an argument). + +@code{ick_c_value} returns the value of the corresponding expression +at the time the @code{CREATE}d command was called; +@code{ick_c_getvalue} is almost equivalent, but only works if the +@option{-a} option (@pxref{-a}) was used during compilation, and +returns the value of the corresponding expression now. (The uint32_t +return type is large enough to hold either a onespot or twospot value, +and will be zero-extended if the corresponding expression had onespot +type.) @code{ick_c_setvalue} also depends on @option{-a}, and will +assign to the corresponding expression (be careful not to provide a +value that is too large for it!@:). In the case that the corresponding +expression is not a variable, this will attempt to perform a reverse +assignment to the expression, and can produce ordinary @ical{} errors +if it fails. It is not possible to redimension an array this way, as +this is assignment, not a calculate operation. + +@node External Calls and auto +@subsection External Calls and auto +@cindex auto +@cindex alloca +@cindex external calls, and auto +@cindex C, auto/alloca + +Because the external calls system merges the @ical{} @code{NEXT} stack +with the C return value and data storage stack (note for pedants: the C +standards nowhere mandate the existence of such a stack, or even mention +one, but the restrictions stated in them imply that implementations have +to act as if such a stack existed, because of the way the scoping rules +and recursion work), the external calls system therefore has severe +effects on data that happens to be stored there. (In @ical{} terms, +imagine what would happen if data could be stored on the @code{NEXT} +stack; if C used the more sensible system of having a @code{STASH} for +each variable, these problems would never occur in the first place, +instead causing an entirely different set of problems.) Similar +considerations apply to the common nonstandard C extension @code{alloca}, +which dynamically alters the size of the stack; also, in what goes below, +@code{register} variables should be considered to be @code{auto}, because +the compiler may choose to allocate them on the stack. Theoretical +considerations would lead one to conclude that variable-length arrays +should obey most of the same restrictions; in practice, though, it's +unwise to attempt to mix those with @ical{} code at all, except by +separating them into separate functions which aren't flagged with +@code{ICK_EC_FUNC_START} and use no @code{ick_}-prefixed identifiers, +even indirectly. (They may cause a compile to fail completely because +they don't mix well with @code{goto}.) + +In the description below, @ical{} commands should be taken to include the +equivalent C macros. + +@code{NEXT}/@code{NEXT FROM} paired with @code{RESUME} have the least +effect, and the most obvious effect, on @code{auto} variables in the +function that was @code{NEXT}ed from, which is the same effect that the +standard C function @code{longjmp} has. That is, @code{alloca} storage +stays intact, and @code{auto} variables have their values `clobbered' +(that is, their value is no longer reliable and should not be used) if +they changed since the corresponding @code{NEXT} and are not marked as +@code{volatile}. (This is a very easy restriction to get around, because +changing the values of such variables is quite difficult without using +statically-allocated pointers to point to them (a dubious practice in any +case), and @code{volatile} is trivial to add to the declaration.) + +@code{COME FROM} has more restrictions; it deallocates all @code{alloca} +storage in the function that was @code{COME FROM}, and functions that +called it or that called functions that called it, etc.@:, using C calls +(as opposed to @code{NEXT}), and those invocations of the functions will +cease to exist (thus destroying any @code{auto} variables in them), even +in the case of @code{COMING FROM} a function into the same function. +@code{auto} variables in the function that is come into will start +uninitialised, even if initialisers are given in their declaration, and +it will be a `new' invocation of that function. (It is quite possible +that the uninitialised values in the @code{auto} variables will happen by +chance to have the values they had in some previous invocation of the +function, though, because they are likely to be stored in much the same +region of memory; but it is highly unwise to rely on this.) Note that +@code{volatile} will not help here. Observant or source-code-reading +readers may note that there is a mention of an @code{ick_goto} in the +source code to @cic{}; this is undocumented and this manual does not +officially claim that such a macro exists (after all, if it did, what in +@ical{} could it possibly correspond to?), but if such a macro does exist +it obeys the same restrictions as @code{COME FROM}. + +@code{FORGET} is the worst of all in terms of preserving data on the +stack; it deallocates @code{alloca} data and clobbers or deletes +@code{auto} variables in all function invocations that have come into +existence since the @code{NEXT} that created the topmost remaining +@code{NEXT} stack entry was called, or since the start of the program if +the @code{NEXT} stack is emptied, and the current function will continue +in a new invocation. @code{volatile} is useless in preventing this, +because the relevant parts of the stack where the data were stored are +deleted by the command (that's what @code{FORGET} does, remove stack). +If any of these data are required, they have to be backed up into static +storage (variables declared with @code{static} or global variables), or +into heap storage (as in with @code{malloc}), or other types of storage +(such as temporary files) which are not on the stack. (Incidentally, +suddenly deleting parts of the stack is excellent at confusing C +debuggers; but even @code{RESUME} and @code{COME FROM} tend to be +sufficient to confuse such debuggers. More worrying is probably the fact +that the C standard provides a portable method for deleting the stack +like that, and in fact the external calls runtime library is written in +standard freestanding-legal C89 (with the exception of +@option{+printflow} debug output which requires a hosted implementation), +meaning that in theory it would be possible to split it out to create an +implementation of a C-plus-COME-FROM-and-NEXT language, and doing so +would not be particularly difficult.) + +Note that @ical{} variables are not stored on the C stack, nor are any of +the metadata surrounding them, and so are not affected unduly by control +flow operations. + +@node External Calls to Funge-98 +@section External Calls to Funge-98 +@cindex .b98 +@cindex external calls, Funge +@cindex external calls, Befunge +@cindex Funge +@cindex Befunge + +@portability{no, version 0.29+, no, no} + +@cic{} supports linking @ical{} programs with Funge-98 programs (to be +precise, only Befunge-98 programs are currently supported). However, +it does not ship with a Funge-98 interpreter, and such an interpreter +needs to be linked to the resulting program in order to run the +Befunge program. Therefore, you need to convert a third-party +Funge-98 interpreter to a library usable by @cic{} before you can use +this part of the external calls system (@pxref{Creating the Funge-98 +Library}); however, this only has to be done once. + +Once the library has been created, you can link an @ical{} program +with a Befunge-98 program by invoking @command{ick} like this: + +@example +ick -e intercalprogram.i befungeprogram.b98 +@end example + +You can link no more than one Befunge-98 program at once (just like +you can link no more than one @ical{} program at once). Also, the +@ical{} program must come first on the command line. + +It is legal to link @ical{}, C, and Befunge-98 simultaneously; +however, the identifiers used in the third-party Funge-98 interpreter +have not been mangled to avoid collisions, and therefore problems may +be caused if the C program uses the same identifiers as the Funge-98 +interpreter. + +@menu +* Creating the Funge-98 Library:: How to create the Funge-98 library. +* The IFFI Fingerprint:: External calls from Funge's view. +@end menu + +@node Creating the Funge-98 Library +@subsection Creating the Funge-98 Library +@cindex libick_ecto_b98.a +@cindex Funge, installing +@cindex Befunge, installing +@cindex libraries, Funge +@cindex libraries, Befunge + +Before external calls to Funge-98 can be used, the relevant library +must be compiled. (After the library has been compiled, then you will +need to reinstall @cic{}; however, you will not need to recompile +@cic{}.) + +At present, only the cfunge Funge-98 interpreter can be converted into +a library suitable for use by @cic{}; also, doing this is only +supported on POSIX systems (although if someone gets it to work on +DOS/Windows, the author of this manual would be interested to hear +about it.) Also, a source-code distribution (rather than a binary +distribution) is needed. One way to obtain the latest cfunge sources +is via the bzr version-control system, using the following command +(correct as of the time of writing, but as always, links can become +dead): + +@example +bzr branch http://rage.kuonet.org/~anmaster/bzr/cfunge +@end example + +(As a licensing note, note that cfunge is licensed under the GNU +General Public licence version 3, whereas @cic{} is licensed under +version 2 and all later versions of that licence; although these terms +are obviously compatible with each other, you must ensure yourself +that your program has appropriate licensing terms to allow a GPLv3 +library to be linked to it.) + +Once you have downloaded the cfunge sources, you need to compile them +into a library suitable for use with @cic{} (note that this is a +somewhat different process to compiling them into a standalone +Funge-98 interpreter). There is a script provided in the @cic{} +distribution to do this, @file{etc/cftoec.sh}. It must be run in the +@file{etc} subdirectory of the @cic{} distribution (i.e. the directory +the script itself is in), and must be given the path to the root +directory of the cfunge source distribution (that is, the directory +that contains the @file{src}, @file{lib} and @file{tools} +subdirectories of that distribution) as its only argument. Note that +it may give some compiler warnings on compilation; my experience is +that warnings about C99 inlining can be safely ignored (they reflect a +deficiency in @command{gcc} itself that luckily seems to be irrelevant +in this case), but other warnings may indicate problems in the exact +versions of the sources that you downloaded (and errors definitely +indicate such problems). + +Once the library has been created, it will appear as the new file +@file{lib/libick_ecto_b98.a} in the @cic{} distribution (the cfunge +distribution will be left unchanged); reinstalling @cic{} will install +this file to its proper location. (It is also in a valid location to +be able to be run if you aren't installing @cic{} but instead just +running it from the distribution's directory.) + +@node The IFFI Fingerprint +@subsection The IFFI Fingerprint +@cindex IFFI +@cindex fingerprint +@cindex external calls, from Funge's view +@cindex Funge, fingerprint +@cindex Befunge, fingerprint + +@i{This section will not make much sense to a non-Funge programmer; +therefore, if you are not used to Funge, you probably want to skip it.} + +To a Funge program, the external calls interface is accessed via a +Funge-98 'fingerprint' defined by the interpreter. The name of the +fingerprint is 0x49464649, or as text, @samp{IFFI}. + +When a program formed by linking @ical{} and Befunge-98 is run, the +first thing that happens is some internal @ical{} initialisation which +is not visible to either program, and then initialisation routines +specified in the Befunge-98 program run (if an initialisation routine +is also specified in a linked C program using ick_startup, it is +unspecified whether the C or Befunge-98 initialisation happens first.) +In the Befunge program, the initialisation routine consists of +everything that happens until the @samp{Y} command in the @samp{IFFI} +fingerprint is run; the author of the Funge-98 must load the +@samp{IFFI} fingerprint themselves during this initialisation to +access that command. (This is so that the Befunge program ends up +complying with the Funge-98 standard; commands not defined in that +standard cannot be used until a fingerprint is loaded.) During +initialisation, no commands from the @samp{IFFI} fingerprint may be +used except @samp{Y} and @samp{A}. (If a different command is used, +@samp{C}, @samp{M}, and @samp{X} remove the arguments they would use +from the stack (if any) but otherwise do nothing, and the other +commands in the @samp{IFFI} fingerprint reflect.) + +After the @samp{Y} command is called, the @ical{} program starts +running; in order for the Befunge program to regain control, it has to +be @code{NEXT}ed to from the @ical{} program, or @code{COME} or +@code{NEXT FROM} the @ical{} program, or contain the line label to +which syntax in the @ical{} program was @code{CREATE}d. (In other +words, the normal @ical{} ways of transferring information between +parts of a program.) In order to do this, therefore, line labels and +@ical{} control flow statements must be placed into the Befunge +program. + +@cindex marker +@cindex Funge, marker +@cindex Befunge, marker +Code like @code{COME FROM (100)} is a single statement in @ical{}, but +several statements in Funge-98; therefore, some method of telling the +interpreter where to start executing to look for @code{COME FROM}s, +@code{NEXT FROM}s, and line labels is needed. The method used by +@cic{} is that of the 'marker'; a marker is represented by character +0xB7 (a mid-dot in Latin-1) in the input Funge-98 program, but is +transformed to a capital @samp{M} by @command{ick}. (The reason for +using a special character for a marker and transforming it rather than +just using @samp{M} is to prevent occurences of @samp{M} in comments +and string literals, etc.@:, having an effect on the control flow of +the program.) Whenever a @code{NEXT} or line label is encountered (in +the @ical{} program, the Funge program or elsewhere), the Funge +program is executed starting from each marker in each cardinal +direction to look for line labels or @code{COME}/@code{NEXT FROM}s +respectively. Therefore, @code{COME FROM (100)} is written in +Funge-98 as @code{Maa*C} (where the M is a marker in the source code), +and likewise the line label @code{(100)} would be written as +@code{Maa*L}. (This code can be written in any cardinal direction, +that is left to right, top to bottom, right to left, or bottom to top, +but not diagonally or flying.) There are likely to be unused +directions from markers, which will be evaluated too; you can (and +must) close these off by reflecting code execution back into that +marker, another marker, or a non-marker @code{M}. Note also that a +marker remains in Funge-space even if the @code{M} on the same square +is deleted (the marker itself is not visible to the @code{g} command, +though). + +Here are the commands in the @samp{IFFI} fingerprint: +@cindex IFFI, commands +@table @code +@item A +@cindex CREATE, in Funge +This command pops a line number and then an 0"gnirts"-format string +from the stack; they are used as the line number and signature to +@code{CREATE} syntax in the @ical{} program; for details of the format +of the signature, see @ref{ick_create}. Although using this command +during speculative execution works, doing so is not recommended; if +the target line number for @code{CREATE}d syntax is changed during +speculative execution to find the line that that syntax corresponds +to, its effect is delayed until after the original line is found and +execution continues from that point. (Side effects during speculative +execution are never recommended, because they might or might not be +optimised away.) +@item C +@cindex COME FROM, in Funge +During speculative execution to find @code{COME FROM}s and @code{NEXT +FROM}s, pops a line label off the top of the stack and does a +@code{COME FROM} that location. During speculative excution to find +line labels, pops the top of the stack and ends that particular +speculative execution as a failure. When not doing speculative +execution, pops and discards the top element of the stack. +@item D +This command must only be used when the Funge program is executing a +@code{CREATE}d command, and allows access to the arguments that +command has. It pops an integer off the top of the stack, and treats +it as an argument position (0-based, so 0 refers to the first +argument, 1 refers to the second, and so on). Note that providing an +invalid argument number, or running this command when not implementing +a @code{CREATE}d command, leads to undefined behaviour (possibly a +reflection, possibly a segfault, possibly worse). + +The command pushes information about the argument chosen onto the +stack; the following information is pushed from bottom to top: +@itemize +@item +The data type of the argument, in bits (16 if the argument was a +onespot variable or expression of onespot type, and 32 if the argument +was a twospot variable or expression of twospot type). Note that this +is under the @cic{} typing rules, rather than the @icst{} typing rules +(that is, select's type is always that of its right argument no matter +how many bits are actually selected). +@item +1 if the argument is an array variable, 0 if it is a scalar value. +@item +0 if the argument is not a variable, or the variable's number if it is +(e.g.@: @code{.123} would push 123 here, but @code{.1~.2} would push +0). +@item +The argument's value at the time that the @code{CREATE}d instruction +was called. +@item +The argument's value now, or alternatively a repeat of the previous +stack element if @option{-a} (@pxref{-a}) was not used. (Without +@option{-a}, the information needed to re-evaluate the expression is +not available.) +@end itemize +@item F +@cindex FORGET, in Funge +During speculative execution, this command reflects; otherwise, this +command pops an integer from the top of stack, and @code{FORGET}s that +many @code{NEXT} stack entries (or all of them if the argument given +is negative). +@item G +@cindex variables, Funge, accessing +This command pops an integer from the top of stack. If it is +positive, the value of the onespot variable whose name is the popped +integer is pushed onto the stack; if it is negative, the value of the +twospot variable whose name is minus the popped integer is pushed onto +the stack; and if it is zero, the command reflects. If the referenced +variable is not in the @ical{} program at all, this causes an @ical{} +error due to referencing a nonexistent variable. +@item L +@cindex line label, in Funge +During speculative execution to find @code{COME FROM}s and @code{NEXT +FROM}s, this command pops and discards the top stack element, then +ends that speculative execution. During speculative execution to find +a line label, this command pops an integer from the top of stack and +succeeds with that integer as the line label (that is, it is possible +to @code{NEXT} to an @code{L} in the Funge program if a marker, +followed by code to push the correct line number onto the stack, +precedes that @code{L}). When not doing speculative execution, the +integer on the top of the stack is used as a line label (assuming it +is in the range 1--65535, otherwise it is popped and discarded), and +a search is made for @code{COME FROM}s and @code{NEXT FROM}s aiming +for that line label (including in the @ical{} program and the Befunge +program itself, as well as programs in any other language which may be +linked in). Note that just as in @ical{}, it is possible to +@code{NEXT} to a line label which has a @code{COME FROM} aiming for +it, in which case the @code{COME FROM} will come from that line label +as soon as the @code{NEXT} transfers control to it. +@item M +Does nothing if not in speculative execution, or ends the current +speculative execution with failure. (This is so that code like +@example + v +>M5C + ^ +@end example +does exactly the same thing as @code{COME FROM (5)}, even when, for +instance, it is entered from the left in the Funge program, rather +than gaining control from the line label @code{(5)}.) +@item N +@cindex NEXT, in Funge +During speculative execution, reflects. Otherwise, pops the top stack +element, interprets it as a line label, and @code{NEXT}s to that line +label (this may start speculative execution to look for line labels, +but might not if it isn't needed, for instance if the line label in +question is in the @ical{} program or in a C program linked to the +Befunge program). +@item R +@cindex RESUME, in Funge +During speculative execution, reflects. Otherwise, pops the top stack +element, removes that many items from the @code{NEXT} stack, and +@code{RESUME}s at the last item removed. (If the top stack element +was zero, negative, or too large, this will cause a fatal error in the +@ical{} program.) +@item S +@cindex variables, Funge, setting +Pops a variable number (interpreted as onespot if positive, or minus +the number of a twospot variable if negative) and an integer from the +stack, and sets the referenced variable to the integer. This reflects +if an attempt is made to set the nonexistent variable 0, causes a +fatal error in the @ical{} program if an attempt is made to set a +variable that doesn't exist there, and does not set read-only +variables (but pops the stack anyway). If the integer is too high for +the variable it is being stored in, only the least significant 16 or +32 bits from it will be used; and likewise, if it is negative, it will +be treated as the two's complement of the number given. +@item V +Pops a @code{CREATE}d argument index and an integer from the top of +stack. (This is undefined behaviour if not in the implementation of a +@code{CREATE}d statement, or if the referenced argument does not +exist; as with the @code{D} instruction, 0 refers to the first +argument, 1 to the second, and so on.) If the @option{-a} option is +not used, this command does nothing; otherwise, the value of the +argument will be set to the integer. (This involves doing a reverse +assignment if the argument is a non-variable expression, as usual, and +causes a fatal error in the @ical{} program if the reverse assignment +is impossible or an attempt is made to assign a scalar to an array.) +@item X +@cindex NEXT FROM, in Funge +This is identical to @code{C}, except that it does a @code{NEXT FROM} +rather than a @code{COME FROM}. +@end table + +As with external calls to C, terminating any program involved (whether +the @ical{} program with @code{GIVE UP}, the Befunge program with +@code{@@} or @code{q}, or a C program with @code{exit()}) causes all +programs involved to terminate, and likewise a fatal error will end +all programs with an error. + +One final point which is probably worth mentioning is that flow +control instructions only record the IP's position and direction, +nothing else; so for instance, if the stack is modified in one part of +the code, those modifications will remain even after a @code{RESUME}, +for instance. + +@node Miscellaneous External Calls +@section Miscellaneous External Calls +@cindex external calls, miscellaneous +@cindex miscellaneous external calls +@cindex libraries, external calls +@cindex external calls, libraries +@cindex C99 +@cindex external calls, C99 + +@portability{no, version 0.29+, no, no} + +It is possible to specify other information to the external calls +system by using the filename list after all the options are given. To +be precise, certain filename patterns are recognised and used to +change the options that are used to compile the externally-called +files. + +The @samp{.c99} extension is treated identically to @samp{.c}, except +that it causes the file with that extension to be preprocessed as C99 +(the more modern version of the C standard, the older C89 is more +common), and that all C files involved will be compiled and linked as +C99. (This corresponds to @option{-std=c99} in @command{gcc}.) + +The @samp{.a} extension indicates that an object-code library should +be linked in to the final program. This is most commonly used to link +in the maths library @file{libm.a} and other such system libraries. +If the filename is of the form @samp{lib*.a}, then the file will be +searched for in the standard directories for libraries on your system, +and also where the @cic{} libraries are stored (which may be the same +place); otherwise, the current directory will be searched. +(Specifying @file{libm.a} on the command line corresponds to passing +@option{-lm} to @command{gcc}.) + +@node Using External Calls +@section Using External Calls +@cindex using external calls +@cindex external calls, using + +Whatever language your source files are written in, when @option{-e} +is used (@pxref{-e}), the compiler will go through much the same +steps. + +First, the @ical{} program specified is compiled into a C program that +uses the @ical{} external call conventions for its control flow +operations. The resulting @samp{.c} file will be left behind in the +same directory (even if @option{-g} isn't used); if you look at it, +you'll see the @code{#include <ick_ec.h>} line, and the other +hallmarks of an external call program (for instance, @ical{} +@code{NEXT}s will translate into slightly modified @code{ick_next}s; +the modification is simply to allow the correct line number to be +displayed in case of error). + +After that, the resulting files are preprocessed twice. First, the C +preprocessor is run on the files; then, a special @cic{} +`preprocessor' is run on the files. (`Preprocessor' is a bit of a +misnomer here, as it's near the end of the compilation process; +`postprocessor' would likely be more accurate, or maybe +`interprocessor'.) Its job is to fix line labels between the gotos +that are used to implement jumping into the middle of a C function, to +assign unique numbers to things that need them, and to keep track of +which functions need to be checked for line labels and for @code{COME +FROM}s and @code{NEXT FROM}s. The resulting file will have the +extension @samp{.cio}; it is almost human-readable, especially if you +run it through a C code indenter, and consists of C code (or code in +whatever language is being linked to the @ical{} code, but so far only +C is accepted) and instructions to @command{gcc}. The @samp{.cio} +file will be left behind for you to look at, if you like. + +Once the @samp{.cio} files have been produced, @command{gcc} is used +to compile all the @samp{.cio} files and link them together into an +executable; the executable will have the same name as the @ical{} +source, minus any extension (and on DJGPP, assuming that its version +of @command{gcc} could handle the resulting command line (not +necessarily guaranteed), a @samp{.exe} extension is added), and will +consist of all the C files linked together with the @ical{}. Any +functions named @code{main} in the C files will be deleted; likewise, +if there is a name clash between any two functions, the one in the +file named earlier on the command line will be used. There is +presumably some use for this feature, although I haven't figured out +what it is yet. + +Extending this to other compiled languages is mostly a problem of +determining how they fit into the @ical{} control structure, which is +not a trivial task, and of figuring out how to link them to C code, +which in some cases is trivial (especially if the language is one that +@command{gcc} can compile!) and in other cases is very difficult. If +anyone has any ideas of new languages that could be added to the +external calls system, feel free to contact the current @cic{} +maintainer with suggestions or patches. + +@node Expansion Libraries +@section Expansion Libraries +@cindex expansion libraries +@cindex libraries + +@portability{no, version 0.28+, no, no} + +The @cic{} distribution comes with libraries that can be used to +extend its capabilities; they are implemented using the external call +mechanism, and are in effect standard files to include using that +mechanism. To use an expansion library, give the @option{-e} option +to @command{ick} (note that this means you cannot use them with the +debugger or profiler, nor with multithreaded or backtracking +programs), and specify the expansion library's name at the end of the +command line (or to be precise, anywhere after the initial @ical{} +file). The libraries themselves are written in C and have a @samp{.c} +extension, and are human-readable; @cic{} will look for them in the +same places as it looks for the system library (including in the +current directory, so you can test your own expansion libraries +without having to install them). + +Expansion libraries use C identifiers which start with the string +@samp{ick_my_} (this is not used by the compiler, and is explicitly +not affected by the prohibition on identifiers starting @samp{ick_} +when writing an expansion library), and use line labels in the range +(1600) to (1699). (Most programs will be avoiding this range anyway, +because it's inside the (1000) to (1999) range reserved for the system +library, but the system library doesn't use it, in much the same way +that the identifiers used are inside the range reserved for the +compiler, but the compiler doesn't use them.) + +Expansion libraries are available from @cic{} version 0.28; @clcic{} +has a similar concept (that of `preloads'), but implemented a +completely different way. + +@subheading syslibc +@findex syslibc +@cindex system library, in C +@cindex C, system library + +@option{syslibc} is an implementation of the base-2 @ical{} system +library in C (@pxref{System Library}); using it in programs running in +other bases is accepted by the compiler, but likely to produce +unpredictable results. When using this expansion library, you also +need to give the @option{-E} option (@pxref{-E+,,-E}) so that the main +system library is not included, or it will be used in preference to +the expansion library. All documented features of the @ical{} base-2 +system library are implemented, but most undocumented features are +not, so @ical{} programs which relied on them (dubious behaviour in +any case) will not work with @option{syslibc}. The main reason to use +this library is to increase the speed of an @ical{} program; however, +note that the speed gains in arithmetic will be accompanied by the +performance penalty of using the external calls infrastructure, unless +you were already using it. + +@subheading compunex +@findex compunex +@cindex computed NEXT +@cindex NEXT, computed + +As an example of using @code{ick_create}, a very simple expansion +library is provided to enable a computed NEXT capability, by defining +a new command @code{COMPUNEX}. It is used as @code{DO .1 COMPUNEX} +(allowing any expression in place of the .1), and is similar to an +ordinary @code{NEXT}, but has two limitations: it takes up two +@code{NEXT} stack entries, and the top one should not be +@code{RESUMEd} past or forgotten (thus it isn't a particularly useful +command, except maybe to produce the equivalent of something like +function pointers). By the way, note that @cic{} avoids computed +@code{NEXT} mainstream for much the same way that @clcic{} avoids +@code{NEXT} altogether; it makes things too easy. This example is +provided mostly just to demonstrate the syntax, and the care that +needs to be taken with implementing flow control operators. + +@samp{compunex} is double-deprecated; an alternative is the following +sequence of commands involving computed @command{CREATE}: + +@example +DO CREATE .1 ABC +DO ABC +@end example + +This sequence emulates all features of @code{NEXT} (although it has +different gerunds and is two statements, not one), making it much more +useful for simulating computed @code{NEXT} than @code{COMPUNEX} +is. (There's no need to avoid forgetting the return value; although +this skips the @code{CREATE} cleanup, none is required because the +created statement @code{ABC} (any other statement would do just as +well) takes no arguments.) + +@node Differences to Other Compilers +@chapter Differences to Other Compilers +@cindex INTERCAL compilers + +The @cic{} compiler exists in a world of several other compilers. + +@subheading Differences to the Princeton compiler +@cindex Princeton compiler +The Princeton compiler was the first @ical{} compiler available, and +compiled @icst{}. Using @command{convickt} (@pxref{convickt}) to +translate its programs from the original EBCDIC to Latin-1 or +Atari-syntax ASCII is required to run them under the @cic{} compiler, +but apart from that there should be no problems; everything that that +compiler can do can be reproduced by @cic{}, even including some of +its bugs. The only potential problems may be where constructs were +nonportable or dubious to begin with (such as the +@code{IGNORE}/@code{RETRIEVE} interaction), or where commands intended +to be syntax errors were used in the program but have a meaning in +@cic{}. For extra portability, it's possible to use the @code{-t} +compiler option to @command{ick} (@pxref{-t}) to tell it to interpret +the program as @icst{}, but as @cic{}'s dialect of @ical{} is +basically backward-compatible anyway this mostly serves to check newer +programs for compatibility with older compilers. + +@subheading Differences to the Atari compiler +@cindex Atari compiler +The Atari compiler was another implementation of @icst{}, which was +basically identical to the Princeton compiler apart from its use of +ASCII and Atari syntax. Everything said under the previous section +applies, except that as it uses the same syntax as @cic{} anyway +(@cic{}'s syntax was based on the Atari compiler's), there is no need +to use @command{convickt}. + +@subheading Differences to @jic{} +@cindex J-INTERCAL +The @jic{} compiler is an implementation of @ical{} written in Java +that compiles @ical{} into Java (and so has a similar relationship +with Java to that of the @cic{} compiler (which is written in C and +compiles into C) with C). @jic{} has much the same feature set as +older versions of @cic{}, with a few changes (such as the addition of +Esperanto and error messages coming up in different situations). +@jic{} programs should run fine on @cic{} without trouble (as it is +also an Atari syntax compiler), except in nonportable cases such as +@code{IGNORE}/@code{RETRIEVE} interaction. + +@subheading Differences to @clcic{} +@cindex CLC-INTERCAL +The @clcic{} compiler is the most modern @ical{} compiler apart from +@cic{} (both compilers are maintained and updated every now and then +as of the time of writing, so which is more modern is normally a +matter of when you happen to check). Unlike the other three compilers +mentioned above, it has a quite significant feature set, including +many features not implemented or only partially implemented in @cic{}, +and is responsible for the origin of many of the features added in +more recent versions of @cic{}. Generally speaking, a @clcic{} +program that uses its advanced features is unlikely to run on @cic{}, +or vice versa, whatever you do (apart from completely rewriting the +more advanced parts of the program.) + +However, there are certain steps that can be taken to transfer less +advanced programs from one compiler to the other. First, translate +the program to Latin-1 Princeton syntax (if translating from @clcic{} +to @cic{}) or Atari syntax (if translating from @cic{} to @clcic{}), +maybe using @command{convickt}, if necessary. (Note that here the +program is being translated to the syntax that is not default for the +target compiler.) Then use command-line arguments to switch the +compiler into the correct emulation mode for the other compiler; +@cic{} uses the options @option{-xX}, and on @clcic{} this is done by +selecting the appropriate preloads, or by changing the program's file +extension to @samp{.ci}. In each case other options may be needed to +turn on various extensions (maybe @option{-m} or @option{-v} if +translating to @cic{}, maybe the preload for gerund-based @code{COME +FROM} if translating to @clcic{}), and if translating to @clcic{} you +need to append the system library to your program yourself because +@clcic{} doesn't load it automatically. + +In the case of very simple programs, or if you want to spend the +effort in translating compiler-specific code from one compiler to +another, you may be able to work without emulation options. (This is +a good target to aim for, in any case.) In such a case, you would do +nothing other than possibly edit the program to be more portable and a +possible character set and syntax change using @command{convickt}. If +you need compiler-specific code, you may be able to detect the +compiler in the code itself and adapt accordingly; making use of the +@code{IGNORE}/@code{RETRIEVE} interaction is one way to do this, as it +differs between @cic{}, @jic{}, and @clcic{}. The other things to +watch out for when doing this are that @clcic{} needs an explicit +option to enable the use of @code{NEXT}, that @clcic{} doesn't load +the system library itself (you need to manually append it to the end +of the program) and that you probably shouldn't number a line (666) +unless you know what you're doing, because that line number has a +special meaning in @clcic{}. + +@ifset notsplit +@partheading{PART IV: APPENDICES AND INDICES} +@end ifset +@node Character Sets +@appendix Character Sets +@cindex character sets +@cindex Atari, character set +@cindex Baudot +@cindex EBCDIC +@cindex Latin-1 + +The following table explains the equivalences between the various +character sets used for @ical{}: 7-bit ASCII Atari syntax, 5-bit +Baudot Princeton syntax, 8-bit EBCDIC Princeton syntax, and 8-bit +Latin-1 Princeton syntax. (The Baudot and EBCDIC are the @clcic{} +versions, which are used by @ical{} compilers but basically nowhere +else.) The characters themselves are not shown in the table below, +because they would have to be shown in some syntax, which would be +misleading. (Atari syntax is used throughout this manual; you could +convert from that, assuming you have an ASCII table handy.) You can +also use the @command{convickt} command-line tool to translate @ical{} +programs from one format to another (@pxref{convickt}). Note that +Baudot has more than one 'shift state'; the shift state (1, 2, 3, or +4) is written before the hexadecimal code for each character, and * +represents a character available in every shift state. To change from +one shift state to another, use character 1f to change from shift +states 3 or 4 to 1, or from 1 or 2 to 2, and character 1b to change +from shift states 1 or 2 to 3, or from 3 or 4 to 4. + +@multitable {@b{Atari}}{@b{Baudot}}{@b{EBCDIC}}{@b{Latin-1}} +@headitem Atari @tab Baudot @tab EBCDIC @tab Latin-1 +@item 09 @tab N/A @tab 09 @tab 09 +@item 0a @tab * 02 @tab 0a @tab 0a +@item 0d @tab * 08 @tab 0d @tab 0d +@item 20 @tab * 04 @tab 40 @tab 20 +@item 21 @tab 3 0d @tab 4f @tab 21 +@item 22 @tab 3 11 @tab 7f @tab 22 +@item 23 @tab 4 06 @tab 7b @tab 23 +@item 24 @tab 4 01 @tab 4a @tab a2 +@item 25 @tab 4 1c @tab 6c @tab 25 +@item 26 @tab 3 1a @tab 50 @tab 26 +@item 27 @tab 3 0b @tab 7d @tab 27 +@item 28 @tab 3 0f @tab 4d @tab 28 +@item 29 @tab 3 12 @tab 5d @tab 29 +@item 2a @tab 4 09 @tab 5c @tab 2a +@item 2b @tab 4 03 @tab 4e @tab 2b +@item 2c @tab 3 0c @tab 6b @tab 2c +@item 2d @tab 3 03 @tab 60 @tab 2d +@item 2e @tab 3 1c @tab 4b @tab 2e +@item 2f @tab 3 1d @tab 61 @tab 2f +@item 30 @tab 3 16 @tab f0 @tab 30 +@item 31 @tab 3 17 @tab f1 @tab 31 +@item 32 @tab 3 13 @tab f2 @tab 32 +@item 33 @tab 3 01 @tab f3 @tab 33 +@item 34 @tab 3 0a @tab f4 @tab 34 +@item 35 @tab 3 10 @tab f5 @tab 35 +@item 36 @tab 3 15 @tab f6 @tab 36 +@item 37 @tab 3 07 @tab f7 @tab 37 +@item 38 @tab 3 06 @tab f8 @tab 38 +@item 39 @tab 3 18 @tab f9 @tab 39 +@item 3a @tab 3 0e @tab 7a @tab 3a +@item 3b @tab 3 1e @tab 5e @tab 3b +@item 3c @tab 4 0f @tab 4c @tab 3c +@item 3d @tab 4 07 @tab 7e @tab 3d +@item 3e @tab 4 12 @tab 6e @tab 3e +@item 3f @tab 4 0c @tab 65 @tab a5 +@item 40 @tab 3 19 @tab 6f @tab 3f +@item 41 @tab 1 03 @tab c1 @tab 41 +@item 42 @tab 1 19 @tab c2 @tab 42 +@item 43 @tab 1 0e @tab c3 @tab 43 +@item 44 @tab 1 09 @tab c4 @tab 44 +@item 45 @tab 1 01 @tab c5 @tab 45 +@item 46 @tab 1 0d @tab c6 @tab 46 +@item 47 @tab 1 1a @tab c7 @tab 47 +@item 48 @tab 1 14 @tab c8 @tab 48 +@item 49 @tab 1 06 @tab c9 @tab 49 +@item 4a @tab 1 0b @tab d1 @tab 4a +@item 4b @tab 1 0f @tab d2 @tab 4b +@item 4c @tab 1 13 @tab d3 @tab 4c +@item 4d @tab 1 1c @tab d4 @tab 4d +@item 4e @tab 1 0c @tab d5 @tab 4e +@item 4f @tab 1 18 @tab d6 @tab 4f +@item 50 @tab 1 16 @tab d7 @tab 50 +@item 51 @tab 1 17 @tab d8 @tab 51 +@item 52 @tab 1 0a @tab d9 @tab 52 +@item 53 @tab 1 05 @tab e2 @tab 53 +@item 54 @tab 1 10 @tab e3 @tab 54 +@item 55 @tab 1 07 @tab e4 @tab 55 +@item 56 @tab 1 1e @tab e5 @tab 56 +@item 57 @tab 1 12 @tab e6 @tab 57 +@item 58 @tab 1 1d @tab e7 @tab 58 +@item 59 @tab 1 15 @tab e8 @tab 59 +@item 5a @tab 1 11 @tab e9 @tab 5a +@item 5b @tab 4 10 @tab 9e @tab 5b +@item 5c @tab 4 05 @tab N/A @tab 5c +@item 5d @tab 4 13 @tab 5a @tab 5d +@item 5e @tab 4 0d @tab 6a @tab 7c +@item 5f @tab 4 15 @tab 7c @tab 40 +@item 60 @tab N/A @tab N/A @tab 60 +@item 61 @tab 2 03 @tab 81 @tab 61 +@item 62 @tab 2 19 @tab 82 @tab 62 +@item 63 @tab 2 0e @tab 83 @tab 63 +@item 64 @tab 2 09 @tab 84 @tab 64 +@item 65 @tab 2 01 @tab 85 @tab 65 +@item 66 @tab 2 0d @tab 86 @tab 66 +@item 67 @tab 2 1a @tab 87 @tab 67 +@item 68 @tab 2 14 @tab 88 @tab 68 +@item 69 @tab 2 06 @tab 89 @tab 69 +@item 6a @tab 2 0b @tab 91 @tab 6a +@item 6b @tab 2 0f @tab 92 @tab 6b +@item 6c @tab 2 13 @tab 93 @tab 6c +@item 6d @tab 2 1c @tab 94 @tab 6d +@item 6e @tab 2 0c @tab 95 @tab 6e +@item 6f @tab 2 18 @tab 96 @tab 6f +@item 70 @tab 2 16 @tab 97 @tab 70 +@item 71 @tab 2 17 @tab 98 @tab 71 +@item 72 @tab 2 0a @tab 99 @tab 72 +@item 73 @tab 2 05 @tab a2 @tab 73 +@item 74 @tab 2 10 @tab a3 @tab 74 +@item 75 @tab 2 07 @tab a4 @tab 75 +@item 76 @tab 2 1e @tab a5 @tab 76 +@item 77 @tab 2 12 @tab a6 @tab 77 +@item 78 @tab 2 1d @tab a7 @tab 78 +@item 79 @tab 2 15 @tab a8 @tab 79 +@item 7a @tab 2 11 @tab a9 @tab 7a +@item 7b @tab 4 0a @tab 9c @tab 7b +@item 7c @tab 4 1e @tab fe @tab N/A +@item 7d @tab 4 11 @tab dc @tab 7d +@item 7e @tab 4 0b @tab a1 @tab 7e +@end multitable + +@node convickt +@appendix convickt +@cindex convickt +@cindex character sets, converting +@cindex converting between character sets + +A variety of character sets have historically been used to represent +@ical{} programs. Atari syntax was designed specifically for use with +ASCII-7, and all Atari-syntax-based @ical{} compilers accept that +character set as possible input. (@cic{} also accepts Latin-1 and +UTF-8.) However, the story is more complicated with Princeton syntax; +the original Princeton compiler was designed to work with EBCDIC, but +because modern computers are often not designed to work with this +character set other character sets are often used to represent it, +particularly Latin-1. The @clcic{} compiler accepts Latin-1, a custom +dialect of EBCDIC, Baudot, and a punched-card format as input; @cic{} +can cope with Latin-1 Princeton syntax, but for the other character +sets, for other compilers, or just for getting something +human-readable, it's useful to have a conversion program. +@command{convickt} is an @ical{} character set conversion program +designed with these needs in mind. + +The syntax for using @command{convickt} is + +@example +convickt @var{inputset} @var{outputset} [@var{padding}] +@end example + +(that is, the input and output character sets are compulsory, but the +parameter specifying what sort of padding to use is optional). + +The following values for @var{inputset} and @var{outputset} are +permissible: + +@table @samp +@item latin1 +Latin-1, or to give it its official name ISO-8859-1, is the character +set most commonly used for transmitting @clcic{} programs, and +therefore nowadays the most popular character set for Princeton syntax +programs. Because it is identical to ASCII-7 in all codepoints that +don't have the high bit set, most of the characters in it can be read +by most modern editors and terminals. It is also far more likely to +be supported by modern editors than EBCDIC, Baudot, or punched cards, +all of which have fallen into relative disuse since 1972. It is also +the only input character set that @cic{} supports for Princeton syntax +programs. It uses 8 bit characters. + +@item ebcdic +EBCDIC is an 8-bit character set that was an alternative to ASCII in +1972, and is the character set used by the original Princeton +compiler. Unfortunately, there is no single standard version; the +version of EBCDIC used by @command{convickt} is the one that @clcic{} +uses. It is the default input character set that @clcic{} uses +(although more recent versions of @clcic{} instead try to guess the +input character set based on the input program.) + +@item baudot +Baudot is a 5-bit character set with shift codes; therefore when +storing it in a file on an 8-bit computer, padding is needed to fill +in the remaining three bits. The standard Baudot character set does +not contain all the characters needed by @ical{}; therefore, @clcic{} +uses repeated shift codes to add two more sets of characters. +@command{convickt} uses the @clcic{} version of Baudot, so as to be +able to translate programs designed for that compiler; however, +standard Baudot is also accepted in input if it contains no redundant +shift codes, and if the input contains no characters not in standard +Baudot, the output will be written so that it is both correct standard +Baudot and correct @clcic{} Baudot for those characters. + +@item atari +This option causes @command{convickt} to attempt a limited conversion +to or from Atari syntax; this uses ASCII-7 as the character set, but +also tries to translate between Atari and Princeton syntax at the +character level, which is sometimes but not always effective. For +instance, @code{?} is translated from Atari to Princeton as a yen +sign, and from Princeton to Atari as a whirlpool (@code{@@}); this +sort of behaviour is often capable of translating expressions +automatically, but will fail when characters outside ASCII-7 (Atari) +or Latin-1 (Princeton) are used, and will not, for instance, translate +a Princeton @code{V}, backspace, @code{-} into Atari @code{?}, but +instead leave it untouched. ASCII-7 is a 7-bit character set, so on +an 8 bit computer, there is one bit of padding that needs to be +generated; note, however, that it is usual nowadays to clear the top +bit when transmitting ASCII-7, which the `printable' and `zero' +padding styles will do, but the `random' style may not do. + +@end table + +When using a character set where not all bits in each byte are +specified, a third argument can be given to specify what sort of +padding to use for the top bits of each character. There are three +options for this: + +@multitable {printable}{Keep the output in the range 32-126 where possible} +@headitem Option @tab Meaning +@item printable +@tab Keep the output in the range 32-126 where possible +@item zero +@tab Zero the high bits in the output +@item random +@tab Pad with random bits (avoiding all-zero bytes) +@end multitable + +Note that not all conversions are possible. If a character cannot be +converted, it will normally be converted to a NUL byte (which is +invalid in every character set); note that this will prevent +round-tripping, because NUL is interpreted as end-of-input if given in +the input. There is one exception; if the character that could not be +converted is a tab character, it will be converted to the other +character set's representation of a space character, if possible, +because the two characters have the same meaning in @ical{} (the only +difference is if the command is a syntax error that's printed as an +error message). (The exception exists to make it possible to +translate existing @ical{} source code into Baudot.) + +@node Optimizer Idiom Language +@appendix Optimizer Idiom Language +@cindex Optimizer Idiom Language +@cindex OIL + +One file in the @cic{} distribution (@file{src/idiotism.oil}) is written +in Optimizer Idiom Language, a programming language designed especially +for expressing optimizer idioms for @ical{} in an easily editable form +(well, at least it's easier than the unmaintainable set of idioms +hard-coded in C that were used in previous versions of the @ical{} +compiler). + +@menu +* Basics: OIL Basics. The basics of how an OIL program works. +* Syntax: OIL Syntax. How to write comments, idioms, and groups. +* Expressions: OIL Expressions. Expressions are the basis of idioms. +* Patterns: OIL Patterns. Filling in the left hand side of an idiom. +* Replacements: OIL Replacements. Syntax for the right hand side. +* Loops: OIL Loops. Simplifying and shortening programs. +* Tips: OIL Tips. Some tips about using OIL. +* Example: OIL Example. An example of how OIL can work. +@end menu + +@node OIL Basics +@appendixsec OIL Basics +@cindex OIL, basics +@cindex @file{src/idiotism.oil} +@cindex @file{idiotism.oil} +@cindex OIL, execution + +The structure of an @acronym{OIL} file consists of a sequence of idioms. +An optimizer idiom looks for a certain pattern in an expression (which +could be an @ical{} expression, or an expression that has already been +partly optimized and therefore contains some non-@ical{} operators), and +replaces it with a replacement that's `simpler' in some sense (in the +case of @cic{}, `simpler' is interpreted to mean `compiles into a faster +or smaller executable when run through a C compiler'). When an +@acronym{OIL} program acts on an input @ical{} file, it keeps on +matching idioms to simplify expressions, until none of the idioms act +any more (and if a situation occurs where idioms can keep matching +indefinitely, the compiler goes into an infinite loop; so don't allow +that to happen); at present, the idioms are tried from left to right, +from the leaves of an expression to its root, and from the start of the +OIL file to the end; but don't rely on that, because it's subject to +change (and gets confusing when you think about what happens when the +program actually does a replacement). Anyway, the point is that if an +idiom can match an expression, and another idiom doesn't change it +first, then the idiom will be matched against that part of the +expression eventually, and the program won't end until there are no +idioms that match the optimized expression. + +At present, the only place that @acronym{OIL} is used in the @cic{} +compiler is when the @option{-O} option (@pxref{-O+,,-O}) is used in +base 2. (Syntax is planned to extend @acronym{OIL} to higher bases, and +some of this is documented and even implemented, but there's no way to +use it.) The idioms are read from the file @file{src/idiotism.oil} +during the compilation of the @cic{} from sources; you can change the +idioms, but you will then have to recompile the distribution (and if you +are using the @command{config.sh} method, also reinstall, but that will +be pretty fast.) + +@node OIL Syntax +@appendixsec OIL Syntax +@cindex OIL, syntax +@cindex syntax, of OIL + +An @acronym{OIL} file is encoded as an @acronym{ASCII} text file using +no codepoints outside the range 0-127; using 10 for newline (as on a +UNIX or Linux system) is always acceptable, but using 13 then 10 (as is +common on Windows or DOS) for newline is acceptable only if your C +compiler recognizes that as a newline. I have no idea what happens if +you use just 13 on an Apple computer on which that is the common newline +convention. + +@cindex OIL, comments +@cindex comments, OIL +Comments can be given anywhere in the file by writing lines starting +with semicolons (known as hybrids to @ical{} programmers). It's also +possible to write a semicolon after part of a line to comment out the +rest of the line. Inside braced C expressions, comments can be given +anywhere whitespace would be allowed by placing them between @code{/*} +and @code{*/} (in such cases, the comments will be copied verbatim to +the C temporary files used when building the @cic{} compiler, where your +C compiler will ignore them). Whitespace is ignored nearly everywhere; +the only places it isn't ignored are in the middle of a decimal +constant, inside square brackets, immediately after one of the +characters @samp{.:#_@}}, and anywhere that C doesn't allow it in quoted +C code. (This means that you can even place it inside operators like && +if you like, as long as they're part of OIL code and not C code, +although doing this is not recommended.) If you use whitespace in a +situation where it isn't ignored, that's almost certainly an error. + +@cindex OIL, idiom groups +Idioms are grouped into groups of idioms by placing an identifier in +square brackets before the group; this follows the rules for C +identifiers, except that there's a maximum length of 30 characters. +This identifier is the `name' of the group, which has no effect except +on optimizer debug output; for that matter, the only effect a group has +is that all idioms in the group look the same in optimizer debug output, +because they have the same name. It's recommended that idioms only have +the same name if they are the same idiom, possibly written in several +ways. For example, a shift by 0 has no effect and may as well be +removed from the output; the way to express this in OIL is: + +@example +[nullshift] +(_1 >> #0)->(_1) +(_1 << #0)->(_1) +@end example + +Here, nullshift is the name of the group of idioms, and two idioms are +given; one which removes a null rightshift, and one which removes a null +leftshift. + +@cindex OIL, idioms +@cindex idiom +As the example above shows, the syntax of an idiom itself is + +@example +(pattern)->(replacement) +@end example + +The parentheses here are actually part of the pattern and/or +replacement, and as such sparks (apostrophes) or rabbit-ears (double +quotes) can be used instead; they're shown in the syntax because the +outer layer of parenthesising is always required. Both the pattern and +replacement are @acronym{OIL} expressions, although they both have their +own special syntax elements as well. + +@node OIL Expressions +@appendixsec OIL Expressions +@cindex expressions, OIL +@cindex OIL, expressions + +An @acronym{OIL} expression is built around subexpressions connected by +infix binary operators and/or preceded by prefix unary operators, the +same way as in C or @ical{} (although unary operators must be entirely +before their argument; the one character later position is not allowed.) +As in @ical{}, there is no operator precedence; expressions must be very +fully bracketed to show unambiguously what the precedences must be, and +then more so; for instance, bracketing marks must be placed around the +argument of a unary operator in most circumstances. Bracketing of +expressions can be done with parentheses, sparks (apostrophes) or +rabbit-ears (double-quotes). + +The following unary and binary operators are allowed in OIL expressions: + +@cindex OIL, operators +@cindex operators, OIL +@multitable {@code{@@216..@@516}}{@ical{} unary generalised whirlpool (16-bit)} +@item @code{$} @tab INTERCAL mingle +@item @code{~} @tab INTERCAL select +@item @code{&16} @tab INTERCAL unary AND (16-bit) +@item @code{V16} @tab INTERCAL unary OR (16-bit) +@item @code{?16} @tab INTERCAL unary XOR (16-bit) +@item @code{^16} @tab INTERCAL unary sharkfin (16-bit) +@item @code{@@16} @tab INTERCAL unary whirlpool (16-bit) +@item @code{@@216..@@516} @tab INTERCAL unary generalised whirlpool (16-bit) +@item @code{&32} @tab INTERCAL unary AND (32-bit) +@item @code{V32} @tab INTERCAL unary OR (32-bit) +@item @code{?32} @tab INTERCAL unary XOR (32-bit) +@item @code{^32} @tab INTERCAL unary sharkfin (32-bit) +@item @code{@@32} @tab INTERCAL unary whirlpool (32-bit) +@item @code{@@232..@@532} @tab INTERCAL unary generalised whirlpool (32-bit) +@item @code{&} @tab C binary bitwise AND +@item @code{|} @tab C binary bitwise OR +@item @code{^} @tab C binary bitwise XOR +@item @code{+} @tab C addition +@item @code{-} @tab C subtraction +@item @code{*} @tab C multiplication +@item @code{/} @tab C integer division +@item @code{%} @tab C modulus +@item @code{>} @tab C greater than +@item @code{<} @tab C less than +@item @code{~} @tab C unary bitwise complement +@item @code{!=} @tab C not equals operator +@item @code{==} @tab C equals operator +@item @code{&&} @tab C logical AND +@item @code{||} @tab C logical OR +@item @code{>>} @tab C bitwise rightshift +@item @code{<<} @tab C bitwise leftshift +@item @code{!} @tab C unary logical NOT +@end multitable + +(Note that in some cases two operators are expressed the same way, but +that this doesn't matter because one is unary and the other is binary so +that there can't be any ambiguity, only confusion. Also note that +unlike @ical{} unary logic operators, OIL unary logic operators must +have a bitwidth stated.) + +It hasn't yet been explained what operands these operators have to +operate on; the syntax for those depends on whether it's a pattern or +replacement that the expression is representing. + +@node OIL Patterns +@appendixsec OIL Patterns +@cindex patterns +@cindex OIL, patterns + +Patterns are simply @acronym{OIL} expressions; the expressions match +either original @ical{} input or expressions produced by earlier idioms. +Each operator must match the same operator in the (possibly +partially-optimised) input; the operands themselves are pattern +templates specifying what operands in the input they can match. + +One special simple form of match is possible: @code{#@var{NUMBER}}, +where @var{NUMBER} is in decimal, matches a constant with that value. +(Unlike in @ical{}, this constant is not limited to being a onespot +value; it is, however, limited to being at most twospot, as are all +operands and intermediate values in @acronym{OIL}.) + +Otherwise, an operand consists of the following parts, written in order: + +@cindex operands, OIL, in patterns +@cindex patterns, operands +@enumerate + +@item +A character to specify the data type of what's being matched. Usually, +this will be @code{_} to specify that any data type can be matched. In +a few cases, you may want to use @code{.} or @code{:} to specify that +you only want to match a onespot or twospot value respectively (that is, +16- or 32-bit). You can also use @code{#}; this specifies a value that +can be any width, but must be known to be a constant with a known value +at optimize time (either because it was hardcoded as a constant +originally or because a constant was produced there by the optimizer, +for instance via a constant folding optimization). + +@item +Optionally, an expression in braces (@code{@{} and @code{@}}). This +expression is written in C, not @acronym{OIL} (as are all expressions in +braces), and puts an extra condition on whether the pattern matches. +The exact meaning of this will be explained later. + +@item +A reference number, which must be one decimal digit long. A reference +number of 0 causes the operand to be discarded immediately after +matching; normally, you will want to specify a positive reference +number. Two operands with the same reference number must be exactly the +same for the pattern to match (for instance, both references to the same +variable, or identical subexpressions). The reference number also +allows the operand to be referenced by C expressions on other operands +and by replacements. Reference numbers must be unique within the idiom +(unless two or reference numbers are deliberately the same so that the +operands they reference have to be identical to produce a match), and +they are scoped only as far as the containing idiom; they don't carry +from one idiom to another. + +@end enumerate + +Note that syntax like @code{#2} is ambiguous given what comes so far; +the first interpretation is the one that is taken in practice, and if +the second interpretation is wanted the operand should be expressed as +@code{#@{1@}2}, using a no-op braced expression to tell them apart. +This particular no-op is recommended because it's detected and optimized +by the @code{OIL} compiler. + +Braced expressions, which must be written purely in C, add extra +conditions; they must return nonzero to allow a possible match or zero +to prevent one. They can reference the following variables and +functions: + +@cindex functions, OIL in C +@cindex OIL, functions in C +@cindex C, within OIL +@anchor{C functions in OIL} +@table @code + +@item c +@itemx c@var{NUMBER} +@findex c +@findex c1--c9 + +This accesses a calculation made automatically by the compiled +@acronym{OIL} program to identify which bits of the operand can possibly +be set, and which ones cannot be. @code{c} by itself refers to the +operand to which the braced expression is attached; if a number is +given, it refers to another node (the number is interpreted as a +reference number). The actual value of @code{c} is a 32-bit unsigned +integer, each bit of which is true, or 1, if there is any chance that +the corresponding bit of the operand might be 1, and false, or 0, if +it's known for certain that the corresponding bit of the operand is 0. + +For instance: + +@example +_@{!(c&4294901760LU)@}1 +@end example + +The constant given here is FFFF0000 when expressed in hexadecimal; the +point is that the expression matches any operand that is known to have a +value no greater than 65535. Unless the operand is the argument to a +unary AND, this check generally makes more sense than explicitly +specifying @code{.} rather than @code{_}, because it will identify both +16- and 32-bit values as long as they're small enough to fit into a +onespot variable. This code could, for instance, be used to check that +an argument to a mingle must be small enough before optimising it (this +is important because an optimisation shouldn't optimise an error -- in +this case, an overflowing mingle -- into a non-error). + +@item x +@itemx x@var{NUMBER} +@findex x +@findex x1--x9 + +@code{x} is like @code{c}, and refers to operands in the same way, +except that it can only refer to an operand marked with @code{#}. It +holds the value of that constant (a 32-bit unsigned integer), which will +be known to the optimizer at optimize time. One common use of this is +to detect whether a constant happens to be a power of 2, although there +are many other possibilities that may be useful. + +@item r +@findex r + +When inside a loop, @code{r} is the value of the loop counter. (It's +almost certainly a mistake if you have a loop but don't reference the +loop counter at least once, and usually at least twice, within the +loop.) @xref{OIL Loops}. + +@item and16 +@itemx and32 +@itemx or16 +@itemx or32 +@itemx xor16 +@itemx xor32 +@itemx iselect +@itemx mingle +@findex and16 +@findex and32 +@findex or16 +@findex or32 +@findex xor16 +@findex xor32 +@findex iselect +@findex mingle + +These are all functions with one argument (apart from iselect and +mingle, which each take two arguments); they exist so that @ical{} +operators can be used by C expressions. They all take unsigned longs as +input and output, even if they are onespot operators. Note that it's +entirely possible for these to cause a compile-time error if used on +invalid arguments (such as mingling with an operand over 65535), or to +silently truncate an invalid argument down to the right number of bits; +both of these should be avoided if possible, so the optimiser should +check first to make sure that it doesn't use any of these functions on +invalid arguments. + +@item xselx +@findex xselx + +This function returns its argument selected with itself; so +@code{xselx(c)} is shorthand for @code{iselect(c,c)}. When the argument +is very complicated, this can save a lot of space in the original +@acronym{OIL} program. + +@item setbitcount +@findex setbitcount + +This function simply returns the number of bits with value 1 in its +argument. This is sometimes useful with respect to various +select-related optimisations, and can be a useful alternative to having +to take logarithms in various situations. + +@item smudgeright +@itemx smudgeleft +@findex smudgeright +@findex smudgeleft + +The @code{smudgeright} function returns its argument but with all the +bits less significant than the most significant bit with value 1 set to +1; likewise, @code{smudgeleft} returns its argument with all the bits +more significant than the least significant bit with value 1 set to 1. + +@end table + +Note that all @acronym{OIL} character is done internally using unsigned +32-bit numbers, and C expressions you write should do the same. The +practical upshot of this is that you should write @code{LU} after any +constant you write in C code; if you don't do this, you are reasonably +likely to get compiler warnings, and the resulting program may not work +reliably, although the @acronym{OIL} compiler itself will not complain. + +Here's a more complicated example of an optimizer operand: + +@example +#@{!(x&2863311530LU)&&iselect(x,1431655765LU)== + xselx(iselect(x,1431655765LU))@}3 +@end example + +It helps to understand this if you know that 2863311530 in hexadecimal +is AAAAAAAA and 1431655765 in hexadecimal is 55555555. (It's worth +putting a comment with some frequently-used decimal constants in an +@acronym{OIL} input file to help explain what these numbers mean and +make the code more maintainable.) The operand matches any constant +integer which has no bits in common with AAAAAAAA, and for which if any +bit in common with 55555555 is set, all less significant bits in common +with that number are also set. + +@node OIL Replacements +@appendixsec OIL Replacements +@cindex OIL, replacements +@cindex replacements + +Replacements have much the same syntax as patterns. The expressions are +parsed in much the same way; however, one peculiarity of replacements is +that bitwidths must be specified. @ical{} has a typecaster that figures +out whether each expression is 16 bits or 32 bits wide, but it runs +before the optimizer, and as the optimizer can produce expressions whose +bitwidths don't obey @ical{}'s rules, this information needs to be +inserted somehow in a replacement. In @cic{}, it usually doesn't matter +what the bitwidth is, and in cases where it doesn't matter the normal +operators (@code{$}, @code{~}, and so on) can be used. (Note that the +bit width of the entire replacement is always set to the same bit width +as the bit width of the expression matched by the pattern; so you don't +have to worry about the effect on unary logical operators that might be +operating on the expression being optimized. This is an exception to +the normal bitwidth rules for a replacement.) In cases where it does +matter (due to @cic{}'s lenient interpretation of bitwidth on mingle +inputs, the only place it matters is in the input to @ical{} unary +logical operators), both the bitwidth of the operator and the argument +on which it operates must be explicitly given, and given as the same +value; to set the bitwidth of an operator's result, simply write the +bitwidth (16 or 32 for onespot and twospot respectively) immediately +after the operator; for instance, @code{!=32} will generate a not-equals +operation with a 32-bit bitwidth. If an operator's width is set to 16, +and during the course of execution of the optimized program, a value +that doesn't fit into 16 bits is encountered, that's undefined behaviour +and anything might happen (most likely, though, the program will just +act as though its width had been set to 32 bits instead); this error +condition is not detected. Also note that operators like @code{&32} +already have a bitwidth specified, so specifying @code{&3232} (or worse, +@code{&3216}) is not allowed. + +@cindex operands, OIL, in replacements +@cindex replacements, operands +Replacement operands are simpler than pattern operands, because there +are only a few forms they can take. + +@table @code +@item _@var{NUMBER} +@itemx .@var{NUMBER} +@itemx :@var{NUMBER} + +This tells the optimiser to copy the operand or expression with +reference number @var{NUMBER} to this point in the replacement used for +the expression matched by the pattern. The three forms are identical; +the last two are provided for aesthetic reasons (it can look better and +be clearer to match @code{.1} in the pattern with @code{.1} in the +replacement, for instance). You cannot use @code{#@var{NUMBER}} here to +copy in a constant from the left-hand side, though, nor +@code{#@{1@}@var{NUMBER}}, because the first means something else and +the second is undefined behaviour (that is, no behaviour for the second +case has been specifically implemented in the compiler and therefore its +behaviour is unpredictable and subject to change in future versions); +use @code{_@var{NUMBER}} to copy over a constant with an unknown at +optimizer compile time (but known at optimize time) value from the left +hand side, as you can do with any other operand being copied. + +@item #@var{NUMBER} + +Insert a constant with the literal value @var{NUMBER} here. + +@item #@{@var{EXPRESSION}@}0 + +Calculate the value of @var{EXPRESSION} (a C expression, which can +reference the same variables and functions as a C expression in a +pattern can; see @ref{C functions in OIL}) and insert a constant with +the calculated value here. (That is, a value is calculated at +optimise-time and the resulting value is therefore constant at +runtime.) + +@end table + +As an example, here's an idiom that moves C bitwise AND operations +inside leftshifts. (This is useful because if the optimizer has +generated a large sequence of mixed ANDs and bitshifts, moving all the +ANDs to one end allows them to be clumped together and optimized down to +one AND, whilst the shifts can all be combined into one large shift.) + +@example +((_1 << #@{1@}2) & #@{1@}3)->((_1 & #@{x3>>x2@}0) << _2) +@end example + +@node OIL Loops +@appendixsec OIL Loops +@cindex loops, OIL +@cindex OIL, loops + +When writing idioms, sometimes instead of using very complicated +expressions to try to match multiple situations at once it's easier to +have a separate idiom for each possible situation; for instance, it's +easier to write idioms for right-shift by 1, right-shift by 2, +right-shift by 3, etc.@:, rather than a general idiom to rightshift by any +amount. When the idioms follow a pattern, as they will do in basically +every case of this sort, it's possible to automatically generate them +using a loop. For instance, idioms to optimize a one-bit rightshift +and a two-bit rightshift are: + +@example +(_1~#@{xselx(x)<<1==x&&x@}2)->((_1&_2)>>#1) +(_1~#@{xselx(x)<<2==x&&x@}2)->((_1&_2)>>#2) +@end example + +Adding a loop to automatically generate the idioms, and placing a name +for the group of idioms at the start, produces the following code: + +@example +[rshift] +<#1-#31 +(_1~#@{xselx(x)<<r==x&&x@}2)->((_1&_2)>>#@{r@}0) +> +@end example + +That's 31 different idioms, generated with a loop. As the above example +shows, a loop starts with @code{<#@var{NUMBER}-#@var{NUMBER}} and ends +with @code{>}; a different idiom is generated for each possible value of +the loop counter @code{r} in the range given by the opening line of the +loop. Loops must be placed around idioms, but inside a group of +idioms. Note the use of @code{#@{r@}0} to generate a constant whose +value is equal to the value of the loop counter. + +@node OIL Tips +@appendixsec OIL Tips +@cindex tips, OIL +@cindex OIL, tips + +Here are some tips for the best use of @acronym{OIL}: + +@itemize + +@item +@findex MAXTOFREE +The @acronym{OIL} compiler has a few deficiencies, such as error +messages that don't give you much of an idea of what you did wrong (to +compensate for this, it does give a reasonably accurate line and +character number where the error happened), limits on things like how +deep expressions can be nested and how many idioms are allowed (if you +hit the first, you should really break it up into smaller idioms if +possible, and if you hit the second, increase @code{MAXTOFREE} in oil.y; +this isn't a limit on the number of idioms but on the number of strings +that are allocated internally to process the idioms), and lack of error +checking (invalid @acronym{OIL} may produce errors in the @acronym{OIL} +compiler, or cause the output C code to contain errors or warnings, or +may even appear to work). + +@item +When you have symmetrical operators in an idiom (like C binary logical +operators), you need to write the idiom both ways round (in the same +group of idioms, preferably), or write another idiom to standardise the +format first; the first method can get very tedious when there are many +symmetrical operators in an idiom, and the second is prone to optimizer +loops and subtle errors (both methods have been used in the provided +@file{idiotism.oil} file.) + +@item +Idioms should preferably be as general as possible, broken down into +many separate idioms rather than all as one big idiom, and match the +smallest part of the expression being optimized that is necessary for +the idiom to be correct in all circumstances; all of these help to +improve the performance of the optimizer in terms of what it can +optimize. + +@item +If a program's optimizing incorrectly, or you just want to see how the +optimizer deals with a particular program, it's possible to debug the +optimizer by giving the @option{-h}, @option{-H}, or @option{-hH} +(@pxref{-h}) switch to the @cic{} compiler, which will cause debug +information to be output on stderr. @option{-h} will show the initial +and final expressions for each expression that was given as input to the +optimizer, as well as a list of all optimizations used, in a language +that's a sort of mix of C, @ical{}, and @acronym{OIL}; @option{-H} will +do the same, and also show the intermediate stages in the optimization. +@option{-hH} is like @option{-H}, but produces its output entirely in C, +so that the various intermediate stages can be tried with a C compiler, +or for people who are fed up of reading @ical{}. @option{-H} can be a +useful learning resource for people who want to understand how a +particular @ical{} expression works. + +@item +Make sure that the optimizer doesn't change a statement from a run-time +error into something that silently succeeds@! Checking which bits can +and can't be 1 is one good way to avoid this, especially with mingles. +(At present, there are some idioms that can turn run-time errors into +compile-time errors, such as with the expression +@code{''#65535$#65535'$#0'}; this could be avoided, but for the time +being it isn't.) + +@item +You can help@! If you find an idiom that the optimizer isn't optimizing +correctly, feel free to add it, or multiple idioms that come to the same +thing, to @file{idiotism.oil}. In such a case, it would help other +users if you would submit your new optimizer idiom to the project +(@pxref{Reporting Bugs}); this will help other users and future releases +of @ical{}, and also has a chance of allowing other users to check your +new idioms to see if they cause problems or could be written better. + +@end itemize + +@node OIL Example +@appendixsec OIL Example +@cindex OIL, example +@cindex examples, OIL + +To finish off this appendix, here's an example of the power of +@acronym{OIL}; this is the optimization of an idiom from the @icst{} +system library, as shown with @option{-H}; this should give a good idea +of how @acronym{OIL} programs work. (All the relevant idioms are in +@file{idiotism.oil} as of the time of writing.) Note how the expression +is reduced one small step at a time; the smallness of the steps makes +the optimizer more general, because if the original expression had been +slightly different, the optimizer wouldn't have come to the same result +but could have optimized it quite a bit of the way, up to the point +where the optimizations were no longer valid; in an older version of +@ical{}, this idiom was simply hardcoded as a special case and so slight +variations of it weren't optimized at all. If you look at the idioms +themselves, it'll also be apparent how @code{c} (the record of which +bits of an expression can be 1 and which bits can't be) is important +information in being able to apply an optimization more aggressively. + +@ifhtml +@smallexample +.3 <- ((((((((.3 $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf)) +[minglefold] +.3 <- ((((((((.3 $ 0x0) ~ 0x2aaaaaab) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf)) +[lshift16] +.3 <- ((((((((((.3 >> 0x0) & 0x7fff) << 0x1) | 0x0) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf)) +[noopor] +.3 <- (((((((((.3 >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf)) +[minglefold] +.3 <- (((((((((.3 >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ 0x2aaaaaab) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf)) +[lshift16] +.3 <- (((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) | 0x0) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf)) +[noopor] +.3 <- ((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf)) +[minglefold] +.3 <- ((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ 0xaaaaaaf) $ 0x0) ~ (0xfff $ 0xf)) +[lshift16] +.3 <- ((((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) | 0x0) $ 0x0) ~ (0xfff $ 0xf)) +[noopor] +.3 <- (((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) $ 0x0) ~ (0xfff $ 0xf)) +[minglefold] +.3 <- (((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) $ 0x0) ~ 0xaaaaff) +[lshift16] +.3 <- (((((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) | 0x0) +[noopor] +.3 <- ((((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) +[nullshift] +.3 <- (((((((((((.3 & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) +[combinelrshift] +.3 <- ((((((((((.3 & 0x7fff) << 0x1) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) +[andintolshift] +.3 <- ((((((((((.3 & 0x7fff) & 0x3fff) << 0x1) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) +[combinellshift] +.3 <- (((((((((.3 & 0x7fff) & 0x3fff) << 0x2) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) +[combinelrshift] +.3 <- ((((((((.3 & 0x7fff) & 0x3fff) << 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) +[andintolshift] +.3 <- ((((((((.3 & 0x7fff) & 0x3fff) & 0xfff) << 0x1) << 0x3) >> 0x3) & 0x1ff) << 0x7) +[combinellshift] +.3 <- (((((((.3 & 0x7fff) & 0x3fff) & 0xfff) << 0x4) >> 0x3) & 0x1ff) << 0x7) +[combinelrshift] +.3 <- ((((((.3 & 0x7fff) & 0x3fff) & 0xfff) << 0x1) & 0x1ff) << 0x7) +[andintolshift] +.3 <- ((((((.3 & 0x7fff) & 0x3fff) & 0xfff) & 0xff) << 0x1) << 0x7) +[combinellshift] +.3 <- (((((.3 & 0x7fff) & 0x3fff) & 0xfff) & 0xff) << 0x8) +[combineand] +.3 <- ((((.3 & 0x3fff) & 0xfff) & 0xff) << 0x8) +[combineand] +.3 <- (((.3 & 0xfff) & 0xff) << 0x8) +[combineand] +.3 <- ((.3 & 0xff) << 0x8) +@end smallexample +@end ifhtml +@ifnothtml +@quotation +.3 <- ((((((((.3 $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf))@* +[minglefold]@* +.3 <- ((((((((.3 $ 0x0) ~ 0x2aaaaaab) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf))@* +[lshift16]@* +.3 <- ((((((((((.3 >> 0x0) & 0x7fff) << 0x1) | 0x0) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf))@* +[noopor]@* +.3 <- (((((((((.3 >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ (0x7fff $ 0x1)) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf))@* +[minglefold]@* +.3 <- (((((((((.3 >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ 0x2aaaaaab) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf))@* +[lshift16]@* +.3 <- (((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) | 0x0) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf))@* +[noopor]@* +.3 <- ((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ (0x3fff $ 0x3)) $ 0x0) ~ (0xfff $ 0xf))@* +[minglefold]@* +.3 <- ((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) $ 0x0) ~ 0xaaaaaaf) $ 0x0) ~ (0xfff $ 0xf))@* +[lshift16]@* +.3 <- ((((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) | 0x0) $ 0x0) ~ (0xfff $ 0xf))@* +[noopor]@* +.3 <- (((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) $ 0x0) ~ (0xfff $ 0xf))@* +[minglefold]@* +.3 <- (((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) $ 0x0) ~ 0xaaaaff)@* +[lshift16]@* +.3 <- (((((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7) | 0x0)@* +[noopor]@* +.3 <- ((((((((((((.3 >> 0x0) & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7)@* +[nullshift]@* +.3 <- (((((((((((.3 & 0x7fff) << 0x1) >> 0x0) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7)@* +[combinelrshift]@* +.3 <- ((((((((((.3 & 0x7fff) << 0x1) & 0x7fff) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7)@* +[andintolshift]@* +.3 <- ((((((((((.3 & 0x7fff) & 0x3fff) << 0x1) << 0x1) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7)@* +[combinellshift]@* +.3 <- (((((((((.3 & 0x7fff) & 0x3fff) << 0x2) >> 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7)@* +[combinelrshift]@* +.3 <- ((((((((.3 & 0x7fff) & 0x3fff) << 0x1) & 0x1fff) << 0x3) >> 0x3) & 0x1ff) << 0x7)@* +[andintolshift]@* +.3 <- ((((((((.3 & 0x7fff) & 0x3fff) & 0xfff) << 0x1) << 0x3) >> 0x3) & 0x1ff) << 0x7)@* +[combinellshift]@* +.3 <- (((((((.3 & 0x7fff) & 0x3fff) & 0xfff) << 0x4) >> 0x3) & 0x1ff) << 0x7)@* +[combinelrshift]@* +.3 <- ((((((.3 & 0x7fff) & 0x3fff) & 0xfff) << 0x1) & 0x1ff) << 0x7)@* +[andintolshift]@* +.3 <- ((((((.3 & 0x7fff) & 0x3fff) & 0xfff) & 0xff) << 0x1) << 0x7)@* +[combinellshift]@* +.3 <- (((((.3 & 0x7fff) & 0x3fff) & 0xfff) & 0xff) << 0x8)@* +[combineand]@* +.3 <- ((((.3 & 0x3fff) & 0xfff) & 0xff) << 0x8)@* +[combineand]@* +.3 <- (((.3 & 0xfff) & 0xff) << 0x8)@* +[combineand]@* +.3 <- ((.3 & 0xff) << 0x8)@* +@end quotation +@end ifnothtml + +@node Copying +@appendix Copying +@cindex copyright +@cindex copying conditions + +The majority of the files in the @cic{} distribution are licensed +under the GNU General Public License (version 2 or later), but with +some exceptions. The files @file{ick-wrap.c} and @file{pickwrap.c} +are licensed under a license that allows them to be used for any +purpose and redistributed at will, and are explicitly not GPL'd. This +means that C source code generated by the compiler has the same +copyright conditions as the original @ical{} source. (Note that the +libraries @file{libick.a} and @file{libickmt.a} are GPL, though, so +you cannot redistribute an executable produced by @command{ick} or by +linking a C file to either of those libraries unless the original +@ical{} source was GPL.) For similar reasons, the expansion libraries +@file{syslibc.c} and @file{compunex.c} (currently the only ones in the +distribution) is explicitly public domain. Also, this manual, and the +files that are the source code for creating it, are licensed under the +GNU Free Documentation License rather than the GPL, and the licenses +themselves (@file{fdl-1-2.txi} and @file{COPYING.txt}) are licensed +under a license that allows verbatim redistribution but not creation +of derivative works. All other files, though (including the +@command{man} pages, which are not part of @emph{this} manual), are +licensed under the GPL. For the full text of the GPL, see the file +@file{COPYING.txt} in the distribution. + +@menu +* GNU Free Documentation License:: License for copying this manual. +@end menu + +@node GNU Free Documentation License +@appendixsec GNU Free Documentation License +@cindex GFDL +@cindex FDL +@cindex GNU Free Documentation License +@cindex Free Documentation License + +@include fdl-1-2.txi + +@node Main Index +@unnumbered Index + +This is the index of everything in this manual. (Note that in some +versions of the manual this is called @samp{Main Index} to prevent it +transforming into a page called @file{index.html} in the HTML version of +the manual. The complications that that caused were really odd.) + +@printindex cp + +@bye +