]> thyrsus.com Git - intercal.git/commitdiff
First re-merge commit: update README, add REPO-README and website files.
authorEric S. Raymond <esr@thyrsus.com>
Thu, 26 Aug 2010 01:34:19 +0000 (21:34 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Thu, 26 Aug 2010 01:34:19 +0000 (21:34 -0400)
.gitignore [new file with mode: 0644]
README
REPO-README [new file with mode: 0644]
website/index.html [new file with mode: 0644]
website/iperl.html [new file with mode: 0644]
website/nelson.html [new file with mode: 0644]
website/notfunny.png [new file with mode: 0644]
website/paper.html [new file with mode: 0644]
website/stross.html [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..7e930e9
--- /dev/null
@@ -0,0 +1,19 @@
+*.o
+*.a
+*~
+Makefile
+autom4te.cache/
+config.h
+config.log
+config.status
+stamp-h1
+.deps
+# Executables produced by standard build
+bin2c
+convickt
+ick
+oil
+# Other generated stuff
+ick.c
+lexer.c
+doc/*info*
diff --git a/README b/README
index fdc41968626662769fccbe01327797f69ab54101..4dcade92035713c434d9f232a222b07413bdc957 100644 (file)
--- a/README
+++ b/README
@@ -2,9 +2,9 @@
 
                                   DISCREDITS
 
-This package is an implementation of the language INTERCAL designed by Don
-Woods and James Lyon, who have since spent more than twenty years trying to
-live it down.
+This package is an implementation of the language INTERCAL designed by
+Don Woods and James Lyon, who have since spent decades trying to live
+it down.
 
 This implementation was created by Eric S. Raymond <esr@snark.thyrsus.com>
 during a fit of lunacy from which he has since mostly recovered.  It has been
@@ -144,22 +144,10 @@ use it... the default is -wimpmode (i.e. NOT wimp mode)."
 
                               SPREADING THE BLAME
 
-There is an INTERCAL Resource Page at http://www.catb.org/intercal
-
-The latest version of INTERCAL is also kept available at the Retrocomputing
-Museun, http://www.catb.org/retro.
-
-(The above two paragraphs are somewhat out of date, but I kept them there,
-including the typos, for historical purposes. Looking through the
-alt.lang.intercal archives is usually the best way to find out what the latest
-version of C-INTERCAL (and you'll find out how to get its rival too, for that
-matter) is nowadays; they tend to pop up in various unusual places, so giving
-a URL might be misleading.  Note also that contact details, and even who to
-contact, often end up out of date; the newsgroup is also a good way to find
-out who to contact.
-
-As of when I wrote this, the current homepage for C-INTERCAL and CLC-INTERCAL
-is http://intercal.freeshell.org.)
+There is an INTERCAL Resource Page at http://www.catb.org/intercal, and
+another at http://intercal.freeshell.org.  Both point at the same C-INTERCAL
+repository, which lives at git://gitorious.org/intercal/intercal.git; 
+the freeshell page also distributes CLC-INTERCAL, a variant implementation.
 
 There is, in addition, an occasionally active USENET newsgroup devoted to the
 language: alt.lang.intercal. (It is a somewhat unusual newsgroup, as although
diff --git a/REPO-README b/REPO-README
new file mode 100644 (file)
index 0000000..2a64922
--- /dev/null
@@ -0,0 +1,46 @@
+This is a multibranch repository that captures as much as we can find
+and reconstruct of the history of C-INTERCAL. The history is not complete
+because the project (begun in 1990) predates systematic use of version
+control (and, indeed, any but the most primitive version-control systems). 
+
+This repository stitches together some early RCS history up to 2003
+kept by Eric S. Raymond (esr), a large collection of release tarballs, and
+some snapshots and darcs history after 2003 kept by Alex Smith (ais523).
+
+The main branch begins with the first public release, 0.3, from 1990.
+Then it includes 0.5, 0.12, 0.13 and all of esr's mainline work up
+to 0.24 in 2003.  The main branch continues with ais523's 0.25 
+and later releases until 2010.  After the release 29 beta, the
+main branch is esr's and ais523's merged code.
+
+The resolution of preserved history between releases varies a great
+deal.  In the original mainline, esr gradually began putting the
+project under RCS control in mid-1996, just before 0.14.  All changes
+in the website directory were being tracked between about 0.18 and
+0.24, but some source files had not yet been RCSed.  Development from
+0.24 through 0.28 is recorded only by public release tarballs and
+sporadic backups.  Development after 0.28 to the 0.29 beta and after
+that until the creation of this unified repo was recorded in a darcs
+archive.
+
+In August 2010 esr stitched all this information together into a
+unified repository, which you are looking at now.  Metainformation
+such as commit dates and authorship has been preserved. Both esr and
+ais23 will be using this repository as a basis for further development.
+
+There is a 'dos' branch that holds William W. Patterson's DOS port of 0.15.
+
+There is a 'thick' branch that contains Malcolm Ryan's Threaded
+INTERCAL version forked from 0.17. The language extensions in Threaded
+INTERCAL were merged into the mainline after 0.24, so the thick code 
+itself is only of historical interest.
+
+We are missing early mainline releases 0.4, 0.6-0.11, and 0.14; so
+far, diligent searches of even the mustiest web and FTP archives have
+failed to turn these up.  If you can supply these, please inform the
+maintainers.
+
+                               Eric S. Raymond <esr@thyrsus.com>
+                               Alex Smith <ais523@bham.ac.uk>
+                               August 2010
+
diff --git a/website/index.html b/website/index.html
new file mode 100644 (file)
index 0000000..9bc3f94
--- /dev/null
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rev="made" href="mailto:esr@snark.thyrsus.com" />
+<link rel="stylesheet" href="/~esr/sitestyle.css" type="text/css" />
+<meta name="description" content="Escape now before the madness takes you!" />
+<meta name="keywords" content="" />
+<meta name="MSSmartTagsPreventParsing" content="TRUE" />
+<title>The INTERCAL Resources Page</title>
+</head>
+<body>
+
+<div id="Header">
+<table width="100%" cellpadding="0" summary="Canned page header">
+<tr>
+<td>
+The INTERCAL Resources Page
+</td>
+<td align="right">
+<script language="JavaScript" src="/~esr/datestamp.js"></script>
+</td>
+</tr>
+</table>
+</div>
+
+<div id="Menu">
+       <hr/>
+       <a href="/~esr" title="My home page">Home Page</a><br />
+       <a href="/~esr/sitemap.html" title="Map of the site">Site Map</a><br />
+       <a href="/~esr/software.html" title="Software I maintain">Software</a><br />
+       <a href="/~esr/projects.html" title="My projects">Projects</a><br />
+       <a href="/~esr/faqs/" title="My FAQ documents">HOWTOs</a><br />
+       <a href="/~esr/writings/" title="Essays and ruminations">Essays</a><br />
+       <a href="/~esr/personal.html" title="Portrait of the author">Personal</a><br />
+       <a href="http://www.ibiblio.org/esrblog/">Weblog</a><br/>       
+       <a href="/~esr/netfreedom/">Freedom!</a><br />
+       <a href="/~esr/guns/">Firearms!</a><br />
+       <hr/>
+</div>
+
+<div id="Content">
+
+<p>Beware! If you aren't a hard-core hacker, you'd best surf right
+back where you came from <em>now</em>. Nothing but twisted
+technical yuks and an inexorable descent into brain-sucking
+obsession awaits beyond this point. <strong>You have been
+warned.</strong></p>
+
+<h1 class="c1">Abandon All Sanity, Ye Who Enter Here</h1>
+
+<p>So, you think you've seen it all, eh?</p>
+
+<p>OK. You've coded in C. You've hacked in LISP. Fortran and BASIC
+hold no terrors for you. You write Emacs modes for fun. You eat
+assemblers for breakfast. You're fluent in half a dozen languages
+nobody but a handful of &uuml;bergeeks have ever heard of. You grok
+TECO. Possibly you even know <i>&lt;shudder&gt;</i> COBOL.</p>
+
+<p>Maybe you're ready for the ultimate challenge...INTERCAL.</p>
+
+<p>INTERCAL. The language designed to be Turing-complete but as
+fundamentally unlike any existing language as possible. Expressions
+that look like line noise. Control constructs that will make you
+gasp, make you laugh, and possibly make you hurl. Data structures?
+We don't need no steenking data structures!</p>
+
+<p>INTERCAL. Designed very early one May morning in 1972 by two
+hackers who are still trying to live it down. Initially implemented
+on an IBM 360 running batch SPITBOL. Described by a manual that
+circulated for years after the short life of the first
+implementation, reducing strong men to tears (of laughter). Revived
+in 1990 by the C-INTERCAL compiler, and now the center of an
+international community of technomasochists.</p>
+
+<p>INTERCAL. Now you, too, can be a part of the madness.</p>
+
+<p>(Read what <a href="nelson.html">Ted Nelson</a> had to say...)</p>
+
+<h1 class="c1">INTERCAL Resources</h1>
+
+<h2>Documentation</h2>
+
+<p>You can download either a <a
+href="intercal.ps.gz">Postscript</a> or <a
+href="http://www.catb.org/~esr/intercal/intercal.txt.gz">flat
+text</a> version of the Revised INTERCAL Manual here. Postscript is
+recommended, as the manual now includes figures and diagrams until
+recently unseen by any but the small handful with paper copies.</p>
+
+<h2>Source Code</h2>
+
+<p>The INTERCAL codebase is available for git cloning at:
+
+<p>git://gitorious.org/intercal/intercal.git</p>
+
+<p>Requires either bison or yacc and flex or lex. Builds and runs
+nicely under any ANSI/POSIX platform, including Linux and the free BSD
+versions. Past versions of this code have run under DOS/Windows,
+though whether it will still do so is unknown.</p>
+
+Plans are afoot to supply distribution tarballs.
+
+<h2>Other Tools</h2>
+
+<p>Jonathan Ferro has written an <a
+href="calc-intercal.el">Intercal calculator mode</a> for Emacs.</p>
+
+<p>You can find out more about Kevin Stock's implementation of <a
+href="iperl.html">INTERCAL functions for PERL</a>.</p>
+
+<p>Alexander Garrett has written a <a
+href="http://www.demiurge.org/alex/computer/index.html">Java class
+implementing the INTERCAL math library</a>.</p>
+
+<h2>An INTERCAL paper</h2>
+
+<p>Alexander Garrett wrote a <a href="paper.html">paper</a> on
+INTERCAL for his Spring 1997 Programming Languages: Theory and
+Design class. Alexander writes:</p>
+
+<blockquote class="c2">The obvious choice was INTERCAL (I'm still
+quite surprised that I'm the only one who picked it &mdash; most people
+did Java??). Anyway, it was not favourably received...when [the
+professor] handed it back, he said, "Ah. I see you're someone with
+a sense of humour. Unfortunately for you, I'm not."</blockquote>
+
+<p>We have corrected two typos (misspellings of "Malvernite" and
+"compiler") in this copy.</p>
+
+<h2>Resource Pages</h2>
+
+<p>The co-maintainer of INTERCAL, Alex Smith, has an <a
+href="http://intercal.freeshell.org">alternate INTERCAL HOME page</a>.
+
+<p>Brian Raiter, who edited the revised version of the INTERCAL
+manual available in HTML above, maintains a good <a
+href="http://www.muppetlabs.com/~breadbox/intercal">INTERCAL
+page</a>.</p>
+
+<p>Jacob Mandelson also has an <a
+href="http://www.ofb.net/~jlm/intercal.html">INTERCAL
+Page</a>.</p>
+
+<p>(The code from all of these home pages has been folded into the
+INTERCAL distribution.)</p>
+
+<h2>Other Resources</h2>
+
+<p>There is an <a
+href="news:alt.lang.intercal">alt.lang.intercal</a> Usenet
+newsgroup.</p>
+
+<p>Here's a transcript of a 1992 <a href="stross.html">article by
+Charles Stross</a>.  (Yes, the same Charles Stross as the
+incandescently talented SF author, but this was a decade before he hit
+the big time.)</p>
+
+<p>In 2008, ComputerWorld inexplicably decided to 
+<a href="http://www.computerworld.com.au/index.php/id;528456667;pp;1">interview
+Don Woods</a> on INTERCAL.  The results are both funny and informative.</p> 
+
+<h1>Other Interesting Languages</h1>
+<ul>
+<li><a href="http://catseye.mine.nu:8080/projects/befunge93/">Befunge</a> &mdash;
+Computer Programming in multiple Directions, Dimensions, and
+Topologies.</li>
+
+<li><a href="http://www.muppetlabs.com/~breadbox/bf/">BrainF***</a>
+&mdash; An 8-instruction Turing-complete computer language.</li>
+
+<li><a
+href="http://www.mines.edu/students/b/bolmstea/malbolge/index.html">
+Malebolge</a> &mdash; Programming from Hell.</li>
+
+<li><a
+href="http://www.eleves.ens.fr:8080/home/madore/programs/unlambda/">
+Unlambda</a> &mdash; functional programming taken to a horrifying
+extreme.</li>
+</ul>
+
+<h1 class="c1">Related Links</h1>
+
+<p>If INTERCAL interests you, you may want to check out the <a
+href="http://www.catb.org/jargon">Jargon File</a> and the <a
+href="http://www.catb.org/retro">Retrocomputing Museum</a>. Both
+these pages and this one are maintained by <a
+href="http://www.catb.org/~esr">Eric S. Raymond</a>, who also
+maintains a large collection of open-source software you may find
+stimulating.</p>
+
+</div>
+</body>
+</html>
+<!--
+Local Variables:
+compile-command: "(cd ~/WWW; upload intercal/index.html)"
+End:
+-->
+
diff --git a/website/iperl.html b/website/iperl.html
new file mode 100644 (file)
index 0000000..ebbdd7c
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator"
+content="HTML Tidy for Linux/x86 (vers 1st February 2002), see www.w3.org" />
+<title>iperl - INTERCAL in Perl</title>
+<meta name="description" content="INTERCAL in Perl. The horror.  The horror..." />
+<style type="text/css">
+/*<![CDATA[*/
+ div.c1 {text-align: center}
+/*]]>*/
+</style>
+</head>
+<body>
+<table width="100%" cellpadding="0" summary="Canned page header">
+<tr>
+<td width="30%">Back to <a href="/~esr">Eric's Home Page</a></td>
+<td width="30%" align="center">Up to <a href="/~esr/sitemap.html">Site Map</a></td>
+<td width="30%" align="right">$Date: 2002-07-30 23:24:24 $</td>
+</tr></table>
+<hr />
+<h1 class="c1">Using INTERCAL in Perl</h1>
+
+<p><a href="mailto:KStock@Unforgettable.Com">Kevin Stock</a> posted
+the following to comp.sources.misc (Feb 1991):</p>
+
+<blockquote>
+<p>I guess I must be cracking up. I've been trying to learn how to
+use the usersubs stuff in Perl, and also how to program in
+INTERCAL. Anyway, I ended up combining the two!</p>
+
+<p>The following shar file is an instant mix package (just add
+Perl) for Iperl, which is Perl plus the INTERCAL operators. There's
+even a manual page - what more could you want?</p>
+</blockquote>
+
+<p>Here is the contents of the README (from the archive):</p>
+
+<blockquote>
+<p>I think this belongs somewhere alongside such films as "Abbot
+and Costello meet Frankenstein's Monster". But, here it is anyway
+...</p>
+
+<p>PERL MEETS INTERCAL.</p>
+
+<p>In this archive, you will find the usersubs stuff to add
+INTERCAL functions to Perl. Unshar it somewhere (/dev/null would
+probably do), and run make. (You may need to alter SRC in the
+Makefile).</p>
+
+<p>The resulting binary, iperl, will work just like perl with the
+addition of the following INTERCAL functions:</p>
+
+<ul>
+<li>and16</li>
+
+<li>or16</li>
+
+<li>xor16</li>
+
+<li>and32</li>
+
+<li>or32</li>
+
+<li>xor32</li>
+
+<li>mingle</li>
+
+<li>select</li>
+</ul>
+
+<p>The test file, op.ical, will run tests to ensure that the
+functions work. This may be done using "make test".</p>
+
+<p>The program iperlsh just reads in perl expressions (one per
+line) and evaluates them.</p>
+</blockquote>
+
+<p><a href="iperl.tar.gz">Download iperl.tar.gz.</a></p>
+
+<p>Or, here is the <a
+href="http://src.doc.ic.ac.uk/public/pub/usenet/comp.sources.misc/volume16/intercal.pl/part01.gz">
+Or, original shar</a> from the usenet archives.</p>
+
+<p><a href="index.html">Return to the INTERCAL Resources
+Page.</a></p>
+
+<hr />
+<table width="100%" cellpadding="0" summary="Canned page footer">
+<tr>
+<td width="30%">Back to <a href="/~esr">Eric's Home Page</a></td>
+<td width="30%" align="center">Up to <a href="/~esr/sitemap.html">Site Map</a></td>
+<td width="30%" align="right">$Date: 2002-07-30 23:24:24 $</td>
+</tr></table>
+
+<br clear="left"/>
+<address>Eric S. Raymond <a
+href="mailto:esr@thyrsus.com">&lt;esr@snark.thyrsus.com&gt;</a></address>
+</body>
+</html>
+
diff --git a/website/nelson.html b/website/nelson.html
new file mode 100644 (file)
index 0000000..7059627
--- /dev/null
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rev="made" href="mailto:esr@snark.thyrsus.com" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<meta name="MSSmartTagsPreventParsing" content="TRUE" />
+<title>Ted Nelson comments....</title>
+<style type="text/css">
+/*<![CDATA[*/
+ div.c1 {text-align: center}
+/*]]>*/
+</style>
+</head>
+<body>
+<table width="100%" cellpadding="0" summary="Canned page header">
+<tr>
+<td width="30%">Back to <a href="/~esr">Eric's Home Page</a></td>
+<td width="30%" align="center">Up to <a
+href="/~esr/sitemap.html">Site Map</a></td>
+<td width="30%" align="right">$Date: 2002-07-30 23:35:36 $</td>
+</tr>
+</table>
+<hr />
+<h1 class="c1">Ted Nelson Comments...</h1>
+
+<pre>
+From ted@xanadu.net  Wed Dec  2 11:50:17 1998
+Return-Path: <ted@xanadu.net>
+Received: from localhost (esr@localhost [127.0.0.1])
+       by snark.thyrsus.com (8.8.7/8.8.7) with ESMTP id LAA27208
+       for <esr@localhost>; Wed, 2 Dec 1998 11:50:15 -0500
+Received: from imap.ccil.org
+       by localhost with IMAP (fetchmail-4.6.9)
+       for esr@localhost (multi-drop); Wed, 02 Dec 1998 16:50:15 +0000 (UTC)
+Received: from mail.sfc.keio.ac.jp (mail.sfc.keio.ac.jp [133.27.4.120])
+       by locke.ccil.org (8.8.5/8.8.5) with ESMTP id MAA28871
+       for <esr@thyrsus.com>; Wed, 2 Dec 1998 12:13:54 -0500 (EST)
+Received: from servix.sfc.keio.ac.jp (servix [133.27.104.66])
+       by mail.sfc.keio.ac.jp (8.9.1a/3.6Wbeta7-SFC) with SMTP id BAA15833;
+       Thu, 3 Dec 1998 01:43:37 +0900 (JST)
+Message-Id: <3.0.3.32.19981203012655.01d68d20@mail.sfc.keio.ac.jp>
+X-Sender: ted@mail.sfc.keio.ac.jp
+X-Mailer: QUALCOMM Windows Eudora Light Version 3.0.3 (32)
+Date: Thu, 03 Dec 1998 01:26:55 +0900
+To: "Eric S. Raymond" <esr@thyrsus.com>
+From: Ted Nelson <ted@xanadu.net>
+Subject: COME FROM statement considered asymmetrical  (CFasym.d6
+Cc: ted@sfc.keio.ac.jp, marlene@xanadu.net, erik@xanadu.net, xanni@xanadu.net,
+        eharter@din.or.jp, markm@ricochet.net,
+        drexler@imm.org (K. Eric Drexler), john@iecc.com, margy@iecc.com,
+        jordan@iecc.com, Nat Kuhn <nat@iecc.com>,
+        Carol Baroudi <carol@iecc.com>, sw@tiac.net,
+        Charles Harris <xchar@worldnet.att.net>, fen@comedia.com,
+        "John Pettitt" <jpp@beyond.com>, scriven@aol.com, colias@ascii.co.jp,
+        DickHeiser@aol.com, braun@sfo.com, penrose@sfc.keio.ac.jp,
+        jpost@earthlink.net (Jonathan Vos Post), farber@cis.upenn.edu
+Mime-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Status: RO
+Content-Length: 2980
+Lines: 64
+
+Hi Eric--
+
+I consider it marvelous that you have enhanced the world's
+ most obscure computer language, Intercal, by adding
+ Peter Ingerman's COME FROM statement.
+
+However, I should point out that COME FROM is not
+ a precise inverse of the GO TO statement.  True,
+ they are similar when each is one-to-one,
+ i.e. when each GOTO target/sink is pointed to by
+ only one GO TO, and each COME FROM receiver
+ is the unique recipient of its antecedent donor routine. 
+
+But the many-to-one case is asymmetrical: a number of
+ different GOTOs can have the same target, but a
+ COME FROM statement can only have a unique source.
+ And conversely: in the case of the GO TO, it is the antecedent
+ routine which can have only one target but can share it
+ with others; while in the case of the COME FROM,
+ it is the successor routines which can only share a single source.  
+
+This *could* be considered to be a deeper symmetry:
+ the possible many-to-one relation of the GO TO could be seen
+ as remapping into the possible one-to-many use of the COME FROM.
+
+But the asymmetry is stronger than that, being temporal
+ (and in some sense causative-- but this discussion must
+ skirt theology, and we know that A Programmer exists)--:
+ GO TO may only be temporally one-to-one or many-to-one,
+ while COME FROM may only be temporally one-to-one
+ or one-to-many.  If we took sexual behavior as an analogy,
+ the possible many-to-one relation of the GO TO is like being
+ gang-banged, with a relatively small variety of possible outcomes
+ (progeny), while the COME FROM is more like a bee going
+ from... oh, never mind.
+
+I hope this brings some measure of analytic rigor to a hitherto,
+ and justifiably, unknown problem area, where such rigor may
+ hitherto have been, and still may perhaps be, unwelcome.
+
+Best regards, Ted
+Gee, maybe I should submit this to Communications of the ACM...
+
+
+____________________________________________________
+Theodor Holm Nelson, Visiting Professor of Environmental Information
+ Keio University, Shonan Fujisawa Campus, Fujisawa, Japan
+ Home Fax from USA: 011-81-466-46-7368  (If in Japan, 0466-46-7368)
+http://www.sfc.keio.ac.jp/~ted/  (Professorial page)
+_____________________________________________________
+Permanent: Project Xanadu, 3020 Bridgeway #295, Sausalito CA 94965
+ Tel. 415/ 331-4422, fax 415/332-0136  
+http://www.xanadu.net (see also Professorial page, above)
+PERMANENT E-MAIL: ted@xanadu.net
+_____________________________________________________
+Quotation of the day, 98.12.02:
+Mike McNally, president of the Air Traffic Controllers Union, yesterday
+assured the press that air traffic controllers can take over from computers
+in case Y2K bugs hit the system.  
+     "I'm not trying to indicate that when our computers shut down that
+everything is hunky-dory.  There is a major transition period where the
+heart is beating and things are happening fast, and people are yelling and
+screaming to try to get a handle on it," he said.  (cnn.com, dateline
+98.12.01)
+
+</pre>
+
+
+<hr />
+<table width="100%" cellpadding="0" summary="Canned page footer">
+<tr>
+<td width="30%">Back to <a href="/~esr">Eric's Home Page</a></td>
+<td width="30%" align="center">Up to <a
+href="/~esr/sitemap.html">Site Map</a></td>
+<td width="30%" align="right">$Date: 2002-07-30 23:35:36 $</td>
+</tr>
+</table>
+
+<br clear="left" />
+<address>Eric S. Raymond <a
+href="mailto:esr@thyrsus.com">&lt;esr@thyrsus.com&gt;</a></address>
+</body>
+</html>
+
diff --git a/website/notfunny.png b/website/notfunny.png
new file mode 100644 (file)
index 0000000..f17db9a
Binary files /dev/null and b/website/notfunny.png differ
diff --git a/website/paper.html b/website/paper.html
new file mode 100644 (file)
index 0000000..aeaba9b
--- /dev/null
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Abstraction and Modularity in INTERCAL</title>
+<style type="text/css">
+/*<![CDATA[*/
+ body {
+  background-color: #FFFFFF;
+ }
+ span.c1 {font-size: 80%}
+/*]]>*/
+</style>
+</head>
+<body>
+<br />
+<br />
+<br />
+<blockquote>
+<p><tt><img src="notfunny.png" align="right" alt="Not Funny!" />
+Abstraction and Modularity in INTERCAL<br />
+D. Alexander Garrett<br />
+CS-538: Theory and Design of Programming Languages.<br
+clear="all" />
+</tt></p>
+
+<p><tt>"<em>And remember, when you look into the pit, the pit looks
+back into you.</em>"<br />
+&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-- Anonymous
+INTERCAL hacker</tt></p>
+
+<p><tt>On May 26, 1972, two students at Princeton University took
+the programming community if not by storm, at least by mild
+sprinkle when they released INTERCAL[<a href="#note1">1</a>]. They
+were summarily dismissed from Princeton and forced to flee to a
+small banana republic where they refine the finer points of the
+language on political prisoners. This is, of course, strictly
+against the Geneva Convention, but as you will see, INTERCAL
+strives to be an unconventional language.</tt></p>
+
+<p><tt>Eighteen years later, while suffering from a paralytic
+attack of ennui, the Mad Malvernite J. Lapin perpetrated a hack of
+untold consequences upon the world by rereleasing INTERCAL under
+UN*X, which he renamed C-INTERCAL. Unfortunately, J. Lapin appears
+to be a pseudonym, so nobody can determine upon whose shoulders the
+blame should rest for such malfeasance. However, some people
+suspect that the rerelease of INTERCAL heralds the time when the
+Old Ones shall wake from their sleep deep beneath the sea and shall
+rule over the earth for 2^32 years, befuddling men's minds and
+forcing them to use buggy overpriced software[<a
+href="#note2">2</a>].</tt></p>
+
+<p><tt>But I'm not here to talk about eschatology, I'm here to talk
+about modularity and abstraction. Well, believe me, you couldn't
+have designed a language more abstract than INTERCAL. To begin
+with, one of the most important aspects of abstraction is
+information hiding. Information hiding is a time honoured tradition
+of computer programmers, although sometimes it goes by its other
+name, "job security". The idea is to make your code as obscure as
+possible, hiding any possible information, so your employer
+couldn't fire you and hire some junior birdman mailboy to maintain
+your code. INTERCAL doesn't only hide information it actively
+distorts it. For example, the easiest way to store the value of
+65536 in a 32-bit INTERCAL variable is:</tt></p>
+
+<blockquote><tt>DO:1&lt;-#0$#256</tt></blockquote>
+
+<p><tt>If that's the easiest way, imagine the power at your
+fingertips if you're trying to be deliberately obscure! To further
+demonstrate, if you were to write a program in INTERCAL which reads
+in 32-bit unsigned integers, treats them as signed 2's complement
+numbers, and prints out their absolute values, it would take about
+22 lines of code and between 15 and 30 minutes to write, whereas
+the same program could be written in a single line of SNOBOL or APL
+requiring about a minute to write both[<a href="#note3">3</a>]. So
+not only does INTERCAL allow the programmer to generate twenty
+times as much code as most other languages, making the programmer
+appear much more productive than his colleagues forced to program
+in a terse language, an INTERCAL program also takes much longer to
+write, allowing for more Quake-breaks. And as an added bonus, when
+the programmer is done, the information is so cleverly hidden that
+not even Sparky the Wonder Dog could find it, and she can find
+gravy in a cesspool! This allows the programmer to take even more
+Quake-breaks, as management doesn't dare fire such an important
+asset to the company.</tt></p>
+
+<p><tt>In addition to information hiding, multinational support is
+also an important part of abstraction. As information exchange
+causes the globe to shrink,[<a href="#note4">4</a>] it's important
+that programming languages are able to support a wide variety of
+different cultures. To that end, INTERCAL took the obvious step.
+Since the number systems of different countries are different from
+other different countries where the relationship between the
+different countries can be symmetric or transitive, it cannot, for
+obvious reasons, be reflexive, INTERCAL has implemented a different
+number system. Instead of using numerals, all input is done by
+typing in the name of the number. For example, if you wanted to
+feed the value of 523 to an INTERCAL program, the input would look
+like "FIVE TWO THREE."[<a href="#note5">5</a>] Additionally,
+INTERCAL will also accept the value of OH for zero and NINER for 9.
+Recognising that INTERCAL would have multicultural scope, the
+implementors implemented number support for input digits in
+Sanskrit, Basque, Tagalog, Classical Nahuatl, Georgian, Kwakiutl,
+and Volapuk.</tt></p>
+
+<p><tt>Until the new INTERCAL compiler with better RYM[<a
+href="#note6">6</a>] access comes out, the old compiler has no way
+of knowing which language you are familiar with and thus it doesn't
+know what language to produce its output in[<a
+href="#note7">7</a>]. INTERCAL elegantly solves this problem by
+producing its output in Roman numerals, under the assumption that
+when Rome was at the height of its strength, half the world was
+under its dominion, so the comprehension of Roman numerals is part
+of our racial memory.</tt></p>
+
+<p><tt>In addition to being a versatile and truly international
+language, INTERCAL is also very simple. For example, in most
+languages the logical operators AND, OR, and XOR are binary, i.e.,
+they require two operands to operate on. In INTERCAL, AND, OR, and
+XOR are unary operators, thereby halving the potential for
+pernicious logical errors. AND is represented by the ampersand
+(&amp;), OR by the inverted, baseless isoceles triangle (V) and XOR
+by the what[<a href="#note8">8</a>] (?). The way the unary
+operators work is to perform the required operation on adjacent
+bits in the variable. Thus, #&amp;77 (binary = 1001101) is binary
+0000000000000100 = 4, #V77 is binary 1000000001101111 = 32879, and
+#?77 is binary 1000000001101011 = 32875.[<a
+href="#note9">9</a>]</tt></p>
+
+<p><tt>Ever since Dijkstra's seminal paper "Use of GOTO Considered
+Harmful" was published in Communications of the ACM, there has been
+a hue and cry against the use of GOTO. INTERCAL recognises the
+importance of structured programming and rebukes the GOTO, saying
+<em>retro me iad</em>[<a href="#note10">10</a>]. In fact, the
+implementors of INTERCAL feel so strongly about the poor
+programming habits that GOTO encourages, that they implemented
+GOTO's opposite number, COME FROM. Thus if you had a program which
+looked similar to below:</tt></p>
+
+<blockquote><tt>(1) PLEASE &lt;YOUR STATEMENT HERE&gt;<br />
+</tt> 
+
+<blockquote>.<br />
+ .<br />
+ .</blockquote>
+
+<tt>(2) DO COME FROM (1)</tt></blockquote>
+
+<p><tt>anytime the program executed the statement at label 1, it
+would immediately jump to the statement at label 2 without
+executing any of the intervening statements. This is very difficult
+to follow and requires considerable expertise to use correctly and
+makes the code almost impossible to follow. That's right, baby --
+information hiding.</tt></p>
+
+<p><tt>One of the big changes to C that Stroustroup made when he
+created C++ was the use of const data types, which kept the
+programmer from inadvertently changing the values of variables
+which shouldn't.[<a href="#note11">11</a>] The creators of INTERCAL
+recognised the need for this way before Stroustroup became Mr.
+Fancy Pants and so they put the IGNORE statement into the language.
+Any variables or arrays named in a list following the DO IGNORE
+directive will effectively become read-only. Their value can be
+used in operations and assigned to other variables, but any attempt
+to assign a value to a variable being IGNOREd will be met with a
+contempt so profound that the compiler will pass over it in utter
+silence. Of course, there may be a time when you want to cast away
+the constancy of variable, and in that case, you would use the
+REMEMBER directive. Any variable which is REMEMBERed will stay so
+until it is IGNORED. Future versions of the language may have a
+SNUB directive which when used upon a variable will cause it to
+IGNORE any attempts to write to it, even if it is REMEMBERed. The
+only way to make a SNUBbed variable writeable again is through the
+use of the APOLOGIZE statement which has roughly a fifty percent
+chance of working[<a href="#note12">12</a>]. The DON'T BE LIKE
+THAT. YOU REMIND ME OF MY MOTHER statement is currently a valid
+statement in INTERCAL though if used upon an IGNOREd variable will
+not cause a change of state in that variable, i.e., it will still
+be IGNOREd.[<a href="#note13">13</a>]</tt></p>
+
+<p><tt>INTERCAL is not even vaguely modular and nothing I can say
+would persuade you that it was.</tt></p>
+
+<p><tt>INTERCAL is a very dynamic, constantly evolving[<a
+href="#note14">14</a>] language which shows much promise for future
+generations of programmers. With languages like Visual Basic and
+Java out there which allow people who can hardly tie their shoes to
+write complicated GUI WWW browsers, people will begin to think that
+programmers aren't wizards and should be earning less than that
+nice young man at the local fast food joint who asks them if they'd
+like fries with that. Hmmm... as long as I have a couple of
+paragraphs left, I may as well mention that INTERCAL is fully
+portable, as the INTERCAL compiler first generates native C code
+and then compiles that. The INTERCAL compiler, itself, is written
+in C and is easily portable. There's even an INTERCAL major mode
+for emacs which will help you maintain the proper balance of
+PLEASE, DO, and PLEASE DO statements.[<a
+href="#note15">15</a>]</tt></p>
+
+<p><tt>References</tt><br />
+</p>
+
+<blockquote><tt>THE INTERCAL PROGRAMMING LANGUAGE REVISED REFERENCE
+MANUAL, Woods, Donald R. and Lyon, James M. Revised by Howell,
+Louis and Raymond, Eric S.<br />
+ My pineal gland.</tt></blockquote>
+
+<p><tt>Afterword</tt><br />
+</p>
+
+<blockquote><tt>The author of this paper is currently residing in a
+home for the criminally insane after attempting to rewrite the
+Linux kernel in Object Disoriented INTERCAL.</tt></blockquote>
+
+<br />
+<br />
+<br />
+<hr width="30%" />
+<span class="c1"><tt>[<a id="note1" name="note1">1</a>] which
+stands for "Compiler Language With No Pronouncable Acronym",
+obviously.<br />
+[<a id="note2" name="note2">2</a>] There's a small sect of
+Billyites who, pointing to Microsoft, claim that this has already
+happened.<br />
+[<a id="note3" name="note3">3</a>]These examples shamelessly
+cribbed from THE INTERCAL PROGRAMMING LANGUAGE REVISED REFERENCE
+MANUAL, page 2.<br />
+[<a id="note4" name="note4">4</a>]It has been demonstrated that
+information exchange causes the release of a virtual particle
+called a metron. As the metron leaves the local system it was
+originally a part of, the system shrinks by an arbitrary amount
+which is directly proportional to the tightness of Tom Jones'
+pants. As more and more information is exchanged, an increasing
+number of metrons are released, and as Tom Jones' pants keep
+getting tighter and tighter, the local system, in this case, the
+planet, is shrinking without bound. What does this mean to you? Not
+much, really. Actually, I'm kind of sorry I brought it up. Just
+forget I mentioned it.<br />
+[<a id="note5" name="note5">5</a>]It might also look different,
+depending on the font your terminal uses.<br />
+[<a id="note6" name="note6">6</a>]Read Your Mind<br />
+[<a id="note7" name="note7">7</a>]True, it could a) look at your
+input and produce output that matches the language or b) you could
+include compiler directives mandating an output language. Well, a)
+would require doubling the size of the system library which is
+definitely the Wrong Thing and b) would require adding more to the
+compiler which is definitely the Wrong Thing.<br />
+[<a id="note8" name="note8">8</a>]Which due to the popularity of
+the movie, The Usual Suspects, may have its name changed to the
+"what the fuh", pending the creation of an ANSI committee to look
+into the matter, cubic cubits upon cubic cubits of jargonised
+deliberations interspersed with sheets of paper saying, "this page
+intensionally left blank", and at least one best selling pulp
+novelisation of the process written either by Jackie Collins or
+Donald Knuth (or both).<br />
+[<a id="note9" name="note9">9</a>]You may be wondering about the
+splat (#) in front of each number. That's good. It shows that you
+have a curious mind. However, I'm not going to tell you what it
+means. That's called "information hiding".<br />
+[<a id="note10" name="note10">10</a>]"get thee behind me, GOTO,"
+obviously<br />
+[<a id="note11" name="note11">11</a>]Somebody's law of programming
+seen on fortune: "Constants aren't; Variables don't."<br />
+[<a id="note12" name="note12">12</a>]The surest way to get a
+SNUBbed variable to listen to you, again, is to offer it hot dogs
+without any buns. Hail Eris!<br />
+[<a id="note13" name="note13">13</a>]Incidentally, INTERCAL is
+fully compliant with the military's view of female officers and
+supports the DON'T ASK, DON'T TELL ME YOU DON'T WANT IT, BABY
+statement.<br />
+[<a id="note14" name="note14">14</a>]"constantly evolving" is a
+characteristic shared by most things that you put in a dark, cool
+place and pretend they don't exist, vide my refrigerator.<br />
+[<a id="note15" name="note15">15</a>]Confused? Good. Information
+hiding.<br />
+</tt></span></blockquote>
+
+<br />
+<br />
+<br />
+</body>
+</html>
+
diff --git a/website/stross.html b/website/stross.html
new file mode 100644 (file)
index 0000000..3c6285f
--- /dev/null
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta name="generator"
+content="HTML Tidy for Linux/x86 (vers 1st February 2002), see www.w3.org" />
+<link rev="made" href="mailto:esr@snark.thyrsus.com" />
+<meta name="description"
+content="Charlie Stross's article about INTERCAL" />
+<meta name="keywords" content="humor, satire, parody" />
+<title>INTERCAL -- the Language From Hell</title>
+<style type="text/css">
+/*<![CDATA[*/
+ p.c2 {font-style: italic}
+ h1.c1 {text-align: center}
+/*]]>*/
+</style>
+</head>
+<body>
+<table width="100%" cellpadding="0" summary="Canned page header">
+<tr>
+<td width="30%">Back to <a href="index">Intercal Resources</a></td>
+<td width="30%" align="center">Up to <a
+href="/~esr/sitemap.html">Site Map</a></td>
+<td width="30%" align="right">$Date: 2009-03-23 01:53:03 $</td>
+</tr>
+</table>
+
+<hr />
+<em>The following article appeared in Computer Shopper (the British
+magazine of that name, not the Ziff-Davis title) around September
+1992.</em> 
+
+<h1 class="c1">Intercal -- the Language From Hell</h1>
+
+<p class="c2">Where would we be without effective programming
+languages?</p>
+
+<p>Wait, don't turn the page; that was a rhetorical question. (The
+answer isn't: word-processing on slide rules.) Every once in a
+while it's worth thinking about the matter. Most of us (the lucky
+ones, that is) don't come within spitting distance of programming
+from one day to the next. Those who do, usually don't give any
+thought to them: it's time to write that function so do it, in C or
+Cobol or dBase whatever comes to hand. We don't waste time
+contemplating the deeper significance of the tools we use to do the
+job. But what would we do without well-designed, efficient
+programming languages?</p>
+
+<p>Go back to slide rules, maybe.</p>
+
+<p>A computer, in a very real sense, is its language. The processor
+speaks in a native tongue, its own machine code: unreadable by
+humans and next to impossible to program in, but nevertheless
+essential. It's the existence of this language which makes the
+computer such a general purpose tool; a hardware platform upon
+which we layer the abstractions, the virtual machines, of our
+operating systems. Which are, when you stop to think about it,
+simply a set of grammatically correct expressions in the computer's
+internal language. Take the humble 386 PC for example. Feed it one
+set of instructions and it pretends to be a cute little Windows
+machine; feed it another set, and something hairy happens -- it
+turns into a big, bad file server and starts demanding passwords
+and issuing threats.</p>
+
+<p>This flexibility is not an accident. Almost from the start, the
+feature which distinguished computers from their complex
+calculating predecessors was the fact that they were programmable
+-- indeed, universally programmable, capable of tackling any
+computationally tractable problem. Strip away the programmability
+of the machine and you lose the universality. Not to mention the
+usefulness.</p>
+
+<p>Programming languages, as any fule kno, originated in the
+nineteen-fifties as a partial solution to a major difficulty;
+machine code is difficult to write and maintain and next to
+impossible to move (or port) from one computer to another of a
+different type. Assemblers, which allowed the programmers to write
+machine code using relatively simple mnemonic commands (which were
+then "assembled" into machine code) were an early innovation, but
+still failed to address the portability issue. The solution that
+finally took off was the concept of an abstract "high level"
+language: and the first to achieve widespread use was Fortran.</p>
+
+<p>A high level language is an artificial language with a rigidly
+specified grammar, which can be translated into machine code via a
+program called a "compiler". Statements in the high level language
+may correspond to individual statements, or whole series of
+statements, in the machine language ofthe computer. Indeed, the
+only thing that makes compilation practical is the fact that all
+computer language systems are effectively equivalent; any algorithm
+which can be expressed in one language can be solved in any other,
+in principle. So why are there so many languages?</p>
+
+<h2>A load of old cobol'ers</h2>
+
+<p>There are several answers to the question of language
+proliferation. Besides the facetious (some of us don't like Cobol)
+and the obvious (designing languages looks like a Fun Thing to a
+certain type of warped personality), there's the pragmatic reason.
+Simply put, some languages are excellent for expressing certain
+types of problem, but are lousy at dealing with other situations.
+Take Prolog, for example. Prolog is a brilliant language for
+resolving formal logic propositions expressable in the first order
+predicate calculus, but you'd need your head examining if you tried
+to write an operating system in it. (The Japanese MITI tried to do
+something similar with their Fifth Generation Project, and when was
+the last time you heard of them? Right.) Alternatively, take C. C
+is a wonderful language. It combines the flexibility and speed of
+raw machine code with the readability of ... er. Yes, you can
+re-jig a C compiler to run on anything. You can fine-tune it to
+produce tight, fast machine code that will execute on your toaster.
+Yes, you can write wonderful device drivers in it. But, again,
+you'd need your head examining if you set out to write a humongous
+database application in it. That's what Cobol is for; or SQL. So to
+the point of this article ... INTERCAL.</p>
+
+<h2>An icky mess</h2>
+
+<p>INTERCAL is a programming language which is to other languages
+as elephants are to deep-sea fishing -- it has nothing whatsoever
+to do with them. Nothing ... except that it's a programming
+language. And it serves as a wonderful example of the fact that,
+despite their theoretical, abstract interchangeability, not all
+languages are born equal. Here's a potted history of the
+offender:</p>
+
+<p>INTERCAL is short for "Computer Language With No Readily
+Pronouncable Acronym". It was not so much designed as perpetrated
+at Princeton University, on the morning of May 26th, 1972, by
+Donald R. Woods and James M. Lyon. They have been trying to live it
+down ever since. The current implementation, C-INTERCAL, was
+written by Eric S. Raymond (also the author of The New Hacker's
+Dictionary), and -- god help us -- runs on anything that supports C
+(and the C programming tools lex and yacc).</p>
+
+<p>INTERCAL is, in its own terms, elegant, simple and concise. It
+is also flexible and forgiving; if the compiler (called,
+appropriately enough, ick) encounters something it doesn't
+understand it simply ignores it and carries on. In order to insert
+a comment, just type in something that ick thinks is wrong; but be
+careful not to embed any valid INTERCAL code in your comments, or
+ick will get all excited and compile it. There are only two
+variable types: 16-bit integers, and 32-bit integers, denoted by .1
+(for the 16-bit variable called "1") or :1 (for the 32-bit variable
+named "1"); note that .1 is not equivalent to :1 and definitely has
+nothing to do with 0.1 (unless it happens to be storing a value of
+0.1).</p>
+
+<p>INTERCAL supports two unique bitwise operators, interleave (or
+mingle) and select, denoted by the "^" and "~" symbols
+respectively. You interleave two variables by alternating the bits
+in the two operands; you select two variables by taking from the
+first operand whichever bits correspond to 1's in the second
+operand, then pack these bits to the right in the result. There are
+also numerous unary bitwise operators, and in order to resolve
+matters of precedence the pedantic may use sparks (') or
+rabbit-ears (") to group expressions (Don't blame me for the silly
+names: INTERCAL has a character set which is best described as
+creative.) It is not surprising that these operators are unique to
+INTERCAL; the parlous readability of C would not be enhanced by the
+addition of syntax like:</p>
+
+<p><tt>PLEASE DO IGNORE .1
+&lt;-".1^C'&amp;:51~"#V1^C!12~;&amp;75SUB"V'V.1~</tt></p>
+
+<p>Like any other language, INTERCAL has flow-of-control statements
+and input and output statements. To write something or other into a
+variable, you need the WRITE IN list statement, where list is a
+string of variables and/or array elements. The format of the input
+data should be as numbers, the digits of which are spelt out in
+english in the range ZERO (or OH) to FOUR TWO NINE FOUR NINE SIX
+SEVEN TWO NINE FIVE. To output some information, you need the READ
+OUT list statement, where list again consists of variables. Numbers
+are printed, by default, in the form of "extended" Roman numerals
+(the syntax of which I will draw a merciful veil over), although
+the scholarly may make use of the standard library, which contains
+routines for formatting output in Sanskrit.</p>
+
+<p>Like FORTRAN, INTERCAL uses line numbers which are optional and
+follow in no particular order. Unlike FORTRAN, INTERCAL has no
+evil, unspeakable GOTO command, and not even an IF statement.
+However, you would be wrong to ascribe this to INTERCAL being
+designed for structured programming; it is actually because
+C-INTERCAL is the only known language that implements the legendary
+COME FROM ... control statement (originally described by R. L.
+Clark in "A Linguistic contribution to GOTO-less programming",
+Comm. ACM 27 (1984), pp. 349-350). For many years the GOTO
+statement -- once the primary means of controlling the sequence of
+execution of a program -- has been reviled as contributing to
+unreadable, unpredictable code that is virtually impossible to
+follow because it jumps about the place like a kangaroo on
+amphetamines. The COME FROM statement enables INTERCAL to do away
+with nasty GOTO's, while still preserving for the programmer that
+sense of warm self-esteem and achievement that comes from
+successfully writing a really nasty piece of self-modifying code
+involving computed GOTO's in FORTRAN (Or, for the terminally hip
+and hacker-ish, involving a triple-indirect pointer to a union of
+UNIX kernel data structures in C. Capisce?) Basically, the COME
+FROM statement specifies a line, or lines, which -- when the
+program executes them -- will jump to the COME FROM: effectively
+the opposite of GOTO.</p>
+
+<p>Because INTERCAL contains no equivalent of the NEXT statement
+for controlling whether or not some statement is executed, it
+provides a creative, endearing and unique substitute; abstention.
+For example, you can abstain from executing a given line of code
+with the ABSTAIN FROM (label) form of the command. Alternatively,
+and more uselessly, you can abstain from executing all statements
+of a specified type; for example, you can say</p>
+
+<p><tt>PLEASE ABSTAIN FROM IGNORING + FORGETTING</tt></p>
+
+<p>or</p>
+
+<p><tt>DO ABSTAIN FROM ABSTAINING</tt></p>
+
+<p>The abstention command is revoked by the REINSTATE statement. It
+is a Bad Idea to ABSTAIN FROM REINSTATING. It is also worth noting
+that the ABSTAIN syntax is rather confusing; for example, DO
+ABSTAIN FROM GIVING UP is not accepted, although a valid synonym
+for this is DON'T GIVE UP. (GIVE UP is the statement that
+terminates execution of a program. You are encouraged to use this
+statement at every opportunity. It is your only hope of
+escape.)</p>
+
+<p>The designers of the INTERCAL language believed that source code
+should be easy to understand or, failing that, friendly; in
+extremis, good old-fashioned politeness will do. Consequently, the
+syntax of the language looks a bit odd at first. After the line
+label (if any) there should be a statement identifier; this can be
+one of DO, PLEASE, or PLEASE DO. Programs which are insufficiently
+polite to the compiler may be rejected with the error message
+PROGRAMMER IS INSUFFICIENTLY POLITE; likewise, programs which spend
+too much time grovelling to the compiler will be terminated with
+extreme prejudice. The DO, PLEASE or PLEASE DO is then followed by
+(optionally) one of NOT, N'T, or %n, then a statement: the NOT or
+N'T's meaning should be self-evident, while the %n is merely the
+percentage probability that the following statement will be
+executed.</p>
+
+<p>Of course, with only two binary and three unary operators, it is
+rather difficult for programmers to get to grips with the language.
+Therefore, in a fit of quite uncharacteristic generosity, the
+designers have supplied -- and even partially documented -- a
+library of rather outre subroutines that carry out such esoteric
+operations as addition, subtraction, logical comparison, and
+generation of random numbers. The subroutines will be charmingly
+familiar to those PDP-11 assembly-language hackers among you who
+are also fluent in FORTRAN and SPITBOL.</p>
+
+<h2>Why you should program in Intercal</h2>
+
+<p>INTERCAL, despite being afflicted with these unique features
+(which, arguably, should remain that way) has survived for twenty
+years and is indeed thriving. The relatively recent C-INTERCAL
+dialect (which introduced the COME FROM statement, among other
+things) has spread it far beyond its original domain; the infamy
+continues, transmitted like a malign influence across the Internet.
+It is a matter of record that no computer language has ever
+succeeded in gaining widespread acceptance on the basis of
+elegance, comprehensibility or necessity. Look at FORTRAN, Cobol or
+C; all of them spread despite the fact that better alternatives
+were available. In fact, there are reasons to believe that INTERCAL
+is the language of the future.</p>
+
+<p>Firstly, INTERCAL creates jobs. Yes, it's true. In general, if a
+particular programming tool is unfriendly, ugly, and absolutely
+essential, the response of management is to throw more programmers
+at it instead of replacing it. INTERCAL is so monumentally
+difficult to use for anything sensible that it is surely destined
+to be the cause of full employment, massive increases in the DP
+budget of every company where it is used, and general prosperity
+for programmers.</p>
+
+<p>Secondly, once you have learned INTERCAL you will be able to win
+friends and influence people. As the authors point out, if you were
+to state that the simplest way to store a value of 65536 in a
+32-bit variable is</p>
+
+<p><tt>DO :1 &lt;- #0$#256</tt></p>
+
+<p>any sensible programmer would say that this was absurd. Since
+this is indeed the simplest way of doing this, they'd be made to
+look like a fool in front of their boss (who, by Murphy's law,
+would have turned up at just that moment). This will have a
+devastating effect on their ego and simultaneously make you look
+brilliant (until they realise that you cribbed this example from
+the manual, like me. Deep shame.)</p>
+
+<p>Thirdly, INTERCAL helps sell hardware. There's been a lot of
+fuss recently about big corporations inventing gigantic, bloated
+windowing and operating systems that require monstrously powerful
+computers to run on; some cynics suggest that this is because
+personal computers are now so powerful that they can already do
+anything any reasonable individual would want them to, and it's
+necessary to invent warm furry buttons that soak up millions of
+processor cycles in order to sell new equipment. With INTERCAL, you
+no longer need Windows or OS/2 to slow your 486 PC to a crawl! A
+Sieve of Eratosthenes benchmark (that computes all the prime
+numbers less than 65536), when coded in INTERCAL, clocked over
+seventeen hours on a SPARCStation-1. The same program, in C, took
+less than 0.5 seconds -- thus proving, quite clearly, that INTERCAL
+software is so slow that you absolutely must buy a CRAY-3 or
+equivalent in order to have any hope of getting any work out of
+it.</p>
+
+<p>Consequently, it is quite clear that INTERCAL represents a major
+alternative to conventional programming languages. Anyone who
+learns this language is going to go far -- at least as far as the
+nearest psychiatric institution. Rumour has it that INTERCAL was
+not entirely unrelated to the collapse of the Soviet Union and the
+success of the Apollo missions. It is even reported to improve your
+sex life and restore hair loss! So we warmly advise you to take
+this utterly unbiased report at face value and go forth and get
+your friendly neighbourhood software company to switch to INTERCAL,
+wherever or whatever they may be using right now. You know it makes
+sense ...</p>
+
+<hr />
+<table width="100%" cellpadding="0" summary="Canned page footer">
+<tr>
+<td width="30%">Back to <a href="index.html">Intercal Resources</a></td>
+<td width="30%" align="center">Up to <a
+href="/~esr/sitemap.html">Site Map</a></td>
+<td width="30%" align="right">$Date: 2009-03-23 01:53:03 $</td>
+</tr>
+</table>
+
+<br clear="left" />
+<address>Eric S. Raymond <a
+href="mailto:esr@thyrsus.com">&lt;esr@snark.thyrsus.com&gt;</a></address>
+</body>
+</html>
+