"If any one of them can explain it," said Alice, "I'll give him sixpence. I don't believe there's an atom of meaning in it."
The jury all wrote down, on their slates, "She doesn't believe there's an atom of meaning in it," but none of them attempted to explain the paper.
"If there's no meaning in it," said the King, "that saves a world of trouble, you know, as we needn't try to find any. And yet, I don't know," he went on, spreading out the verses on one knee, and looking at them with one eye: "I seem to see some meaning in them, after all...."


8. Programming Hints

For the user looking to become more familiar with the INTERCAL language, we present in this section an analysis of a complex program, as well as some suggested projects for the ambitious programmer.

Considering the effort involved in writing an INTERCAL program, it was decided in putting together this manual to use an already existing program for instructive analysis. Since there was only one such program available, we have proceeded to use it. It is known as the "INTERCAL System Library".

8.1 Description

The program listing is in section 8.3. It is in the same format as would be produced by the Princeton INTERCAL compiler in FORMAT mode with WIDTH=62 (see section 12). For a description of the functions performed by the Library, see section 7.2.

8.2 Analysis

We shall not attempt to discuss here the algorithms used, but rather we shall point out some of the general techniques applicable to a wide range of problems.

Statements 10, 14, 15, and 26 make up a virtual "computed GO TO". When statement 10 is executed, control passes eventually to statement 16 or 11, depending on whether .5 contains #1 or #2, respectively. The value of .5 is determined in statement 9, which demonstrates another handy technique. To turn an expression, exp, with value #0 or #1, into #1 or #2 (for use in a GO TO), use "?'exp'$#1"~#3. To reverse the condition (i.e., convert #0 to #2 and leave #1 alone) use "?'exp'$#2"~#3.

Certain conditions are easily checked. For example, to test for zero, select the value from itself and select the bottom bit (see statement 54). To test for all bits being 1's, select the value from itself and select the top bit. The test for greater than, performed in statements 219 and 220 on 32-bit values, employs binary logical operations, which are performed as follows:

	'?.1$.2'~'#0$#65535'

for 16-bit values or, for 32-bit values:

        "'?":1~'#65535$30'"$":2~'#65535$#0'"'~'#0
        $#65535'"$"'?":1~'#0$#65535'"$":2~'#0
        $#65535'"'~'#0$#65535'"

(The proofs are left as an exercise to the reader.)

Testing for greater-than with 16-bit values is somewhat simpler and is done with the pair of statements:

        DO .C <- '?.Ac.B'~'#0$#65535'
        DO .C <- '&"'.A~.C'~'"?'?.C~.C'$#32768"
                ~"#0$#65535"'"$".C~.C"'~#1

This sets .C (a dummy variable) to #1 if .A > .B, and #0 otherwise. The expression may be expanded as described above to instead set .C to #1 or #2.

Note also in statement 220 the occurrence of ~"#65535$#65535". Although these operations select the entire value, they are not extraneous, as they ensure that the forthcoming ?s will be operating on 32-bit values. (However, see section 3.4.1.1.)

In several virtual computed GO TOs the DO FORGET #1 (statement 15 in the earlier example) has been omitted, since the next transfer of control would be a DO RESUME #1. By making this a DO RESUME #2 instead, the FORGET may be forgotten.

In statement 64, note that .2 is STASHed twice by a single statement. This is perfectly legal.

Lastly, note in statements 243 and 214 respectively, expressions for shifting 16- and 32-bit variables logically one place to the left. Statement 231 demonstrates right-shifting for 32-bit variables.

8.3 Program Listing

    1   (1000)  PLEASE IGNORE .4
    2           PLEASE ABSTAIN FROM (1005)
    3   (1009)  DO STASH .1 + .2 + .5 + .6
    4           DO .4 <- #1
    5           DO (1004) NEXT
    6   (1004)  PLEASE FORGET #1
    7           DO .3 <- '?.1$.2'~'#0$#65535'
    8           DO .6 <- '&.1$.2'~'#0$#65535'
    9           PLEASE DO .5 <- "?!6~#32768'$#1"~#3
   10           DO (1002) NEXT
   11           DO .4 <- #2
   12   (1005)  DO (1006) NEXT
*  13   (1999)  DOUBLE OR SINGLE PRECISION OVERFLOW
   14   (1002)  DO (1001) NEXT
   15   (1006)  PLEASE FORGET #1
   16           DO .5 <- '?"!6~.6'~#1"$#1'~#3
   17           DO (1003) NEXT
   18           DO .1 <- .3
   19           DO .2 <- !6$#0'~'#32767$#1'
   20           DO (1004) NEXT
   21   (1003)  DO (1001) NEXT
   22           DO REINSTATE (1005)
   23   (1007)  PLEASE RETRIEVE .1 + .2 + .5 + .6
   24           DO REMEMBER .4
   25           PLEASE RESUME #2
   26   (1001)  DO RESUME .5
   27   (1010)  DO STASH .1 + .2 + .4
   28           DO .4 <- .1
   29           DO .1 <- '?.2$#65535'~'#0$#65535'
   30           DO (1020) NEXT
   31           PLEASE DO .2 <- .4
   32           PLEASE DO (1009) NEXT
   33           DO RETRIEVE .1 + .2 + .4
   34           PLEASE RESUME #1
   35   (1020)  DO STASH .2 + .3
   36           DO .2 <- #1
   37           PLEASE DO (1021) NEXT
   38   (1021)  DO FORGET #1
   39           DO .3 <- "?!1~.2'$#1"~#3
   40           PLEASE DO .1 <- '?.1$.2'~'#0$#65535'
   41           DO (1022) NEXT
   42           DO .2 <- !2$#0'~'#32767$#1'
   43           DO (1021) NEXT
   44   (1023)  PLEASE RESUME .3
   45   (1022)  DO (1023) NEXT
   46           PLEASE RETRIEVE .2 + .3
   47           PLEASE RESUME #2
   48   (1030)  DO ABSTAIN FROM (1033)
   49           PLEASE ABSTAIN FROM (1032)
   50   (1039)  DO STASH :1 + .5
   51           DO (1530) NEXT
   52           DO .3 <- :1~#65535
   53           PLEASE DO .5 <- :1~'#65280$#65280'
   54           DO .5 <- '?"!5~.5'~#1"$#1'~#3
   55           DO (1031) NEXT
   56   (1032)  DO (1033) NEXT
   57           DO (1999) NEXT
   58   (1031)  DO (1001) NEXT
   59   (1033)  DO .4 <- .5
   60           DO REINSTATE (1032)
   61           PLEASE REINSTATE (1033)
   62           DO RETRIEVE :1 + .5
   63           PLEASE RESUME #2
   64   (1040)  PLEASE STASH .1 + .2 + .2 + :1 + :2 + :3
   65           DO .2 <- #0
   66           DO (1520) NEXT
   67           DO STASH :1
   68           PLEASE RETRIEVE .2
   69           DO .1 <- .2
   70           DO .2 <- #0
   71           PLEASE DO (1520) NEXT
   72           DO :2 <- :1
   73           DO RETRIEVE .1 + .2 + :1
   74           DO (1550) NEXT
   75           PLEASE DO .3 <- :3
   76           DO RETRIEVE :1 + :2 + :3
   77           DO RESUME #1
   78   (1050)  PLEASE STASH :2 + :3 + .5
   79           DO :2 <- .1
   80           PLEASE DO (1550) NEXT
   81           DO .5 <- :3~'#65280$#65280'
   82           DO .5 <- '?"!5~.5'~#1"$#1'~#3
   83           DO (1051) NEXT
   84           DO (1999) NEXT
   85   (1051)  DO (1001) NEXT
   86           DO .2 <- :3
   87           PLEASE RETRIEVE :2 + :3 + .5
   88           DO RESUME #2
   89   (1500)  PLEASE ABSTAIN FROM (1502)
   90           PLEASE ABSTAIN FROM (1506)
   91   (1509)  PLEASE STASH :1 + .1 + .2 + .3 + .4 + .5 + .6
   92           DO .1 <- :1~#65535
   93           PLEASE DO .2 <- :2~#65535
   94           DO (1009) NEXT
   95           DO .5 <- .3
   96           PLEASE DO .6 <- .4
   97           DO .1 <- :1~'#65280$#65280'
   98           DO .2 <- :2~'#65280$#65280'
   99           DO (1009) NEXT
  100           DO .1 <- .3
  101           PLEASE DO (1503) NEXT
  102           DO .6 <- .4
  103           DO .2 <- #1
  104           DO (1009) NEXT
  105           DO .1 <- .3
  106           DO (1501) NEXT
  107   (1504)  PLEASE RESUME .6
  108   (1503)  DO (1504) NEXT
  109   (1501)  DO .2 <- .5
  110           DO .5 <- '?"'&.6$.4'~#1"$#2'~#3
  111           DO (1505) NEXT
  112   (1506)  DO (1502) NEXT
  113           PLEASE DO (1999) NEXT
  114   (1505)  DO (1001) NEXT
  115   (1502)  DO :4 <- .5
  116           DO (1520) NEXT
  117           DO :3 <- :1
  118           PLEASE RETRIEVE :1 + .1 + .2 + .3 + .4 + .5 + .6
  119           DO REINSTATE (1502)
  120           DO REINSTATE (1506)
  121           PLEASE RESUME #3
  122   (1510)  DO STASH :1 + :2 + :4
  123           DO :1 <- "'?":2~'#65535$#0'"$#65535'~'#0$#6553
            5'"$"'?":2~'#0$#65535'"$#65535'~'#0$#65535
            '"
  124           DO :2 <- #1
  125           DO (1509) NEXT
  126           PLEASE RETRIEVE :1
  127           DO :2 <- :3
  128           PLEASE DO (1509) NEXT
  129           DO RETRIEVE :2 + :4
  130           PLEASE RESUME #1
  131   (1520)  PLEASE STASH .3 + .4
  132           DO .3 <- .1~#43690
  133           DO (1525) NEXT
  134           PLEASE DO .4 <- 'V.3$".2~#43690"'~'#0$#65535'
  135           DO .3 <- .1~#21845
  136           PLEASE DO (1525) NEXT
  137           DO :1 <- .4$"'V.3$".2~#21845"'~'#0$#65535'"
  138           PLEASE RETRIEVE .3 + .4
  139           DO RESUME #1
  140   (1525)  DO .3 <- '"'"'"!3$#0'~'#32767$#1'"$#0'~'#32767
            $#1'"$#0'~'#16383$#3'"$#0'~'#4095$#15'
  141           PLEASE RESUME #1
  142   (1530)  DO STASH :2 + :3 + .3 + .5
  143           DO :1 <- #0
  144           DO :2 <- .2
  145           DO .3 <- #1
  146           DO (1535) NEXT
  147   (1535)  PLEASE FORGET #1
  148           DO .5 <- "?!1~.3'$#1"~#3
  149           DO (1531) NEXT
  150           DO (1500) NEXT
  151           DO :1 <- :3
  152           PLEASE DO (1533) NEXT
  153   (1531)  PLEASE DO (1001) NEXT
  154   (1533)  DO FORGET #1
  155           DO .3 <- !3$#0'~'#32767$#1'
  156           DO :2 <- ":2~'#0$#65535'"$"'":2~'#32767$#0'"$#
            0'~'#32767$#1'"
  157           PLEASE DO .5 <- "?!3~.3'$#1"~#3
  158           DO (1532) NEXT
  159           DO (1535) NEXT
  160   (1532)  DO (1001) NEXT
  161           PLEASE RETRIEVE :2 + :3 + .3 + .5
  162           DO RESUME #2
  163   (1540)  PLEASE ABSTAIN FROM (1541)
  164           DO ABSTAIN FROM (1542)
  165   (1549)  PLEASE STASH :1 + :2 + :4 + :5 + .1 + .2 + .5
  166           DO .1 <- :1~#65535
  167           PLEASE DO .2 <- :2~'#65280$#65280'
  168           DO .5 <- :1~'#65280$#65280'
  169           DO (1530) NEXT
  170           DO :3 <- :1
  171           DO .2 <- :2~#65535
  172           PLEASE DO (1530) NEXT
  173           DO :5 <- :1
  174           DO .1 <- .5
  175           DO (1530) NEXT
  176           DO :4 <- :1
  177           PLEASE DO :1 <- ":3~'#65280$#65280'"$":5~'#652
            80$#65280'"
  178           DO .5 <- ':1~:1'~#1
  179           DO .2 <- :2~'#65280$#65280'
  180           DO (1530) NEXT
  181           PLEASE DO .5 <- '"':1~:1'~#1"$.5'~#3
  182           DO .1 <- :3~#65535
  183           DO .2 <- #0
  184           DO (1520) NEXT
  185           PLEASE DO :2 <- :1
  186           PLEASE DO .1 <- :4~#65535
  187           DO (1520) NEXT
  188           DO (1509) NEXT
  189           DO .5 <- !5$":4~#3"'~#15
  190           DO :1 <- :3
  191           DO :2 <- :5
  192           DO (1509) NEXT
  193           PLEASE DO .5 <- !5$":4~#3"'~#63
  194           DO .5 <- '?"!5~.5'~#1"$#1'~#3
  195           PLEASE RETRIEVE :4
  196   (1541)  DO :4 <- .5
  197           DO (1543) NEXT
  198   (1542)  DO (1544) NEXT
  199           PLEASE DO (1999) NEXT
  200   (1543)  DO (1001) NEXT
  201   (1544)  DO REINSTATE (1541)
  202           PLEASE REINSTATE (1542)
  203           PLEASE RETRIEVE :1 + :2 + :5 + .1 + .2 + .5
  204           DO RESUME #2
  205   (1550)  DO STASH :1 + :4 + :5 + .5
  206           DO :3 <- #0
  207           DO .5 <- '?"':2~:2'~#1"$#1'~#3
  208           PLEASE DO (1551) NEXT
  209           DO :4 <- #1
  210           PLEASE DO (1553) NEXT
  211   (1553)  DO FORGET #1
  212           DO .5 <- '?":2~'#32768$#0'"$#2'~#3
  213           DO (1552) NEXT
  214           DO :2 <- ":2~'#0$#65535'"$"'":2~'#32767$#0'"$#
                   0'~'#32767$#1'"
  215           PLEASE DO :4 <- ":4~'#0$#65535'"$"'":4~'#32767
                     $#0'"$#0'~'#32767$#1'"
  216           DO (1553) NEXT
  217   (1552)  DO (1001) NEXT
  218   (1556)  PLEASE FORGET #1
  219           DO :5 <- "'?":1~'#65535$#0'"$":2~'#65535$#0'"'
                     ~'#0$#65535'"$"'?":1~'#0$#65535'"$":2~'#0$
                     #65535'"'~'#0$#65535'"
  220           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
  221           DO (1554) NEXT
  222           DO :5 <- :3
  223           DO (1510) NEXT
  224           PLEASE DO :1 <- :3
  225           DO :3 <- "'V":4~'#65535$#0'"$":5~'#65535$#0'"'
                     ~'#0$#65535'"$"'V":4~'#0$#65535'"$":5~'#0$
                     #65535'"'~'#0$#65535'"
  226           DO (1555) NEXT
  227   (1554)  PLEASE DO (1001) NEXT
  228   (1555)  DO FORGET #1
  229           DO .5 <- "?':4~#1'$#2"~#3
  230           DO (1551) NEXT
  231           DO :2 <- ":2~'#0$#65534'"$":2~'#65535$#0'"
  232           DO :4 <- ":4~'#0$#65534'"$":4~'#65535$#0'"
  233           PLEASE DO (1556) NEXT
  234   (1551)  DO (1001) NEXT
  235           PLEASE RETRIEVE :1 + :4 + :5 + .5
  236           PLEASE RESUME #2
  237   (1900)  DO STASH .2 + .3 + .5
  238           DO .1 <- #0
  239           DO .2 <- #1
  240           PLEASE DO (1901) NEXT
  241   (1901)  DO FORGET #1
  242           DO %50 .1 <- 'V.1$.2'~'#0$#65535'
  243           DO .2 <- !2$#0'~'#32767$#1'
  244           PLEASE DO .5 <- "?!2~.2'$#1"~#3
  245           DO (1902) NEXT
  246           DO (1901) NEXT
  247   (1902)  DO (1001) NEXT
  248           DO RETRIEVE .2 + .3 + .5
  249           PLEASE RESUME #2
  250   (1910)  PLEASE STASH .1 + .3 + .5 + :1 + :2 + :3
  251           DO .3 <- #65524
  252           DO :1 <- #6
  253           DO (1911) NEXT
* 254           PLEASE NOTE THAT YOU CAN'T GET THERE FROM HERE
  255   (1912)  DO (1001) NEXT
  256   (1911)  DO FORGET #1
  257           PLEASE DO (1900) NEXT
  258           DO :2 <- .1
  259           DO (1500) NEXT
  260           PLEASE DO :1 <- :3
  261           DO .1 <- .3
  262           DO (1020) NEXT
  263           PLEASE DO .3 <- .1
  264           DO .5 <- '?"!3~.3'~#1"$#2'~#3
  265           DO (1912) NEXT
  266           DO .1 <- #12
  267           PLEASE DO (1050) NEXT
  268           DO RETRIEVE .1
  269           DO (1530) NEXT
  270           DO :2 <- #32768
  271           DO (1500) NEXT
  272           PLEASE DO .2 <- :3~'#65280$#65280'
  273           PLEASE RETRIEVE .3 + .5 + :1 + :2 + :3
  274           DO RESUME #1

8.4 Programming Suggestions

For the novice INTERCAL programmer, we provide here a list of suggested INTERCAL programming projects:

Write an integer exponentiation subroutine. :1 <- .1 raised to the .2 power.

Write a double-precision sorting subroutine. Given 32-bit array ;1 of size :1, sort the contents into numerically increasing order, leaving the results in ;1.

Generate a table of prime numbers.

Put together a floating-point library, using 32-bit variables to represent floating-point numbers (let the upper half be the mantissa and the lower half be the characteristic). The library should be capable of performing floating-point addition, subtraction, multiplication, and division, as well as the natural logarithm function.

Program a Fast Fourier Transform (FFT). This project would probably entail the writing of the floating-point library as well as sine and cosine functions.

Calculate, to :1 places, the value of pi.

(Working programs for each of these projects are included in the C-INTERCAL distribution's pit directory of sample code.)


[Next]
[Previous]
[Contents]