comparison interps/clc-intercal/CLC-INTERCAL-Base-1.-94.-2/Changes @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
comparison
equal deleted inserted replaced
995:6883f5911eb7 996:859f9b4339e6
1 Changes from CLC-INTERCAL 1.-94.-3 to 1.-94.-2
2
3 * Moved all documentation, user interfaces and the calculator
4 stuff to separate packages, so their installation is now
5 optional. The documentation is always available from the
6 website, so people may not need to install that at all.
7 There is a plan to move the INTERNET stuff to its own separate
8 package as well, but this hasn't been done yet.
9
10 * Changed Makefile.PL to be a thin wrapper around a new module,
11 Language::INTERCAL::InstallModule - this is going to do all
12 the work for CLC-INTERCAL but also for all the optional modules.
13 One day, it'll also be possible to have a Build.PL without
14 extra effort.
15
16 * Added $VERSION (derived from $PERVERSION) to all modules; this
17 is required so that the compiler can be uploaded to CPAN and
18 made available to a wider unsuspecting audience. Added a check
19 in the test programs to make sure the $VERSION can be found
20 by ExtUtils::MakeMaker, and hence by the CPAN software.
21
22 * Made generic filehandle code (GenericIO.pm) more generic and
23 modular; this will allow extensions to define new file types.
24
25 * Make some changes in Interpreter.pm because the above changes to
26 GenericIO broke it.
27
28 * FIxed some invalid HTML in the documentation. As I was there, I
29 changed the Makefile so that it can generate the file error.html
30 from the list of splats, and parsers.html from the list of
31 bytecodes. The generated HTML will be produced in blib/htmldoc
32
33 * A new version of Language::INTERCAL::HostIP has been produced
34 for better integration with the rest of CLC-INTERCAL. This
35 version is no longer derived (just inspired) from Sys::HostIP,
36 after I tried to submit patches to it and could not contact
37 the author.
38
39 * Fixed a bug in the Hollerith encoding (thanks to ais523 for
40 the bug report); see the end of doc/html/charset.html
41
42 * Fixed a problem that caused the calculator to splat when dealing
43 with registers overloaded by a previous line.
44
45 * Fixed a problem with class WRITE IN. Also added test programs for
46 class I/O.
47
48 * Fixed a problem with the theft server when invoked with --linger=0
49
50 Changes from CLC-INTERCAL 1.-94.-4 to 1.-94.-3
51
52 * Fixed some incompatibility between the implementation of REINSTATE
53 and the documentation. Thanks ais523 for pointing that out.
54
55 * Updated documentation (see doc/html) to reflect the current
56 state of the compiler.
57
58 * Fixed error building CLC-INTERCAL when a previous version was
59 present. I always clean up after myself :-) so I never noticed
60 this. Thanks to Mark Brown (maintainer of the debian package
61 of clc-intercal as well as more useful packages) for the report.
62
63 A similar problem also occurred while testing (t/??intercalc-*),
64 which has also been fixed
65
66 * Added the two crawling horrors as accessible registers; however,
67 there isn't much one can do with them apart from enslaving and
68 overloading them. Still, they are there, ready for the time they
69 can be used properly.
70
71 * Fixed a problem where constant labels did not have the correct
72 value if the, ehm, constant had been changed. This can happen if
73 you use overloading. This isn't the same as computed labels.
74 Something similar could also happen with ABSTAIN FROM (label)
75 where the label was a modified constant. Fixed that too.
76
77 * Made some changes to the grammars (see 1972.iacc, iacc.iacc, ick.iacc
78 and sick.iacc) to speed up the compilation process (there was an urgent
79 need for it!). My favourite example of pathological parser behaviour,
80 examples/hello.i now takes about 2 minutes to compile, compared with
81 the over 30 minutes of 1.-94.-4). Moreover, there is now a faster way
82 to enable/disable the buttons in the calculator which makes it usable
83 in "sick" mode. For this reason, the calculator now defaults to "sick"
84 mode, the previous default was "ick" because "sick" was too slow.
85
86 * Added some more tests to the test suite; this allowed me to find
87 and fix a bug in "ick" compatibility mode which generated wrong
88 bytecode for REINSTATE, and to notice that ABSTAIN and REINSTATE
89 weren't supported in the calculator (they are now).
90
91 * Written a reference implementation for the INTERNET (INTERcal NETworking).
92 See files under directory doc/INTERNET in this distribution for the draft
93 specification, which is a modification of the article originally posted
94 on alt.lang.intercal. If you have any comments, do let me know.
95
96 * Made some changes to .sickrc and system.sickrc so that they
97 can contain defaults for programs other than sick; these are specified
98 as mappings for weird program suffixes, to allow older versions of
99 CLC-INTERCAL to read new sickrc files without producing an error -
100 however in the unlikely case a program has suffix ..<program>.<option>
101 the older versions will get confused by it (but you wouldn't be able
102 to compile these programs under any version of CLC-INTERCAL anyway).
103
104 Intercalc now uses two options from the sickrc: ..INTERCALC.LANGUAGE
105 defines the default language and default language options, to be used
106 when the command line does not contain a -l / --language; and
107 ..INTERCALC.MODE defines the operating mode (one, expr, full) to be
108 used when the command line does not contain -m / --mode.
109
110 The new INTERNET library also uses options from the sickrc:
111 ..INTERNET.PORT contains the port number to be used for communication
112 (default 64928 until we can obtain an official port assignment) and
113 ..INTERNET.DEVICE.<device_name> contains the broadcast address for
114 an interface (default: try to determine them - or disable part of the
115 functionality of the CASE statement if that fails). See the appropriate
116 section of the README file for another discussion of this.
117
118 * Fixed a bug in intercalc which made it impossible to perform an assignment
119 in "full" mode! Well, it worked in batch mode...
120
121 * Added menus in intercalc (as well as special syntax to access the menu
122 functions in batch mode) to change language, base and (un)select options.
123 Note that some changes (change base, change mode) will just load the
124 changes in memory, while other (change language, unselect option)
125 require a reload of the compiler; doing this in the middle of entering
126 a statement or expression is permitted but may cause unexpected results.
127 Even when the compiler needs to be reloaded, the contents of registers
128 remains unchanged (except for the special registers, if the options
129 loaded change them). It is also possible to read out the current state
130 (to a file) and write it back in (from a file) so you can quit the
131 calculator and start it again in the same state (with the limitations,
132 to be removed in a future version, that the operating mode must be
133 the same). In a future version, the calculator will also be able to
134 change the options stored in your .sickrc to correspond to the current
135 ones selected from the menu. For now, you can "Read as" to save the
136 current state to a file, then when you write that back in you get
137 all your options (mode, language, base, options) restored with it.
138
139 * Finished the initialisation code included in compiled objects so that
140 one can select wimp mode and other stuff from the command line; any
141 unrecognised option is saved in special register ^AV and any environment
142 is saved in special register ^EV. Although these registers are not
143 accessible to user programs, one can always add the syntax for them or
144 write an extension which will be able to use them.
145
146 * Added new system calls to syscall.iasm to allow file operations and TCP
147 sockets. Note that this is not related to the INTERNET extension.
148
149 * Found a very rare bug in the assignment to arithmetic unary divide, which
150 was so rare it only manifested by running "make test" about 100 times in
151 a row. At the same time fuxed a related bug which had never manifested.
152 Changed the test script to run more tests when the result involves random
153 numbers to help picking these things out in future.
154
155 Changes from CLC-INTERCAL 1.-94.-5 to 1.-94.-4
156
157 * Simplified Makefile.PL
158
159 * Changed the system call interface which is now written in
160 assembler (that would be INTERCAL assembler, not your
161 computer's native assembler). It even works in the
162 calculator, if you use -osyscall...
163
164 * Improved "sick.iacc" to allow more sensible templates (e.g.
165 "READ OUT REGISTER LIST" or "READ OUT EXPRESSION", whereas
166 before you could only use "READ OUT REGISTER").
167
168 * All internal data types (Spot, Twospot, Hybrid, Tail,
169 Whirlpool) are now subclasses of the same thing, DataItem.
170 This allows uniform implementation of calculating and using
171 a register, a simple place where registers and elements can
172 be overloaded, and an easy way to produce splats, for example
173 when arrays are used where classes would be expected etc.
174
175 * Added "WRITE IN EXPRESSION" which is roughly equivalent to
176 writing in a numeric value and then assigning the value to
177 the expression. Alphanumeric and binary WRITE INs are currently
178 only possible if EXPRESSION is a single register of suitable
179 type (tail, hybrid or shark fin). For maximum obfuscation do
180 something like PLEASE WRITE IN #1 and see what happens.
181
182 * Made substantial changes to the bytecode - this is necessary to
183 implement CONVERT and SWAP. The objects will now be incompatible
184 with 1.-94.-5's objects but hopefully I won't need to make any
185 more incompatible changes later.
186
187 While doing this, going through the various grammar and
188 checking all generated code - needless to say, found and fixed
189 some bugs.
190
191 Language::INTERCAL::Bytecode is now generated automatically from
192 a list of bytecode opcodes and internal registers: this means
193 that a C version (for a C runtime) can be generated from the
194 same list and guaranteed to be consistent; it also means that
195 now the module is much faster to load, as its initialisation
196 can now be done while generating it.
197
198 The new module also allows to classify opcodes by type and to
199 automate some tasks (such as interpreting bytecode and generating
200 code dependent on a bytecode sequence): this allows a simplification
201 of both interpreters and backends.
202
203 There is also the advantage that the POD documentation is also
204 generated from the same list, so the two don't get inconsistent
205 with each other as they used to.
206
207 * Added splat *123, program attempted more than 80 levels of
208 NEXTing, which was never produced by CLC-INTERCAL before.
209 Ditto for *621, RESUME #0, and *632, RESUME instead of GIVE UP.
210
211 * Changed Language::INTERCAL::Splats to be generated like the
212 bytecode. In fact, any other module can now be generated from
213 a data file and a template by just including @@DATA anywhere
214 in it: see comments at the start of Generate/Generate.
215
216 * Added unary divide because I just couldn't resist. You don't have
217 to use it if you don't approve of it. In fact, you are not very
218 likely to use it as it is almost, but not quite, completely
219 useless.
220
221 * Changed the way the compilers (and compiler compilers etc) work,
222 simplifying just about everything. Removed the CoreDump backend,
223 which was only used to produce compilers (etc) and is now
224 unnecessary.
225
226 * Extensively changed Language::INTERCAL::Object to bring it up
227 to date with all the other changes. As I was there, implemented
228 CONVERT and SWAP. Note that the functionality is now split
229 between Language::INTERCAL::Object and Language::INTERCAL::Interpreter
230
231 * Added the possibility to assign to any expression, providing a
232 shortcut to assigning to an overloaded register: for example:
233
234 DO .&1 <- #2
235
236 * Added ABSTAIN FROM / REINSTATE COMPILER BUG, equivalent to
237 requesting that the compiler does not generate a bug. When
238 the compiler bug is ABSTAINed FROM, it may still execute as
239 an unexplainable compiler bug. As a side effect, one can
240 now also COME FROM COMPILER BUG and so on, although this is
241 not likely to be very useful as the COME FROM executes after
242 the bug, or in other words does not execute at all.
243
244 Note that the above does not stop the unexplainable compiler
245 bug. In fact, by ABSTAINing FROM the explainable bug, one
246 may trigger the unexplainable one.
247
248 Also added the ABSTAIN FROM / REINSTATE QUANTUM COMPUTING,
249 together with all the normal friends such as COME FROM
250 QUANTUM COMPUTING etc. These statements refer to any quantum
251 statement in the program.
252
253 Note that there are no template (just gerunds) for COMPILER
254 BUG and QUANTUM COMPUTING.
255
256 Also note that an ABSTAIN FROM QUANTUM COMPUTING WHILE
257 REINSTATING IT will cause the program to have a split personality,
258 one quantum, one classical. Or something like that.
259
260 * Also made substantial changes to the parser. The idea is that in
261 many cases the program never needs to be recompiled at runtime,
262 even if the compiler does change during execution. We do this by
263 guessing how many alternative versions of the code we are likely
264 to need, and generating them all. The way it's implemented now it
265 reduces the recompile but could do a lot more, which is planned
266 for 1.-93 or (if I find the time) 1.-94.-3
267
268 As I was there, I've put some code towards writing the optimiser.
269
270 * Changed the way the compiler handles top-level symbols (i.e.
271 ?PROGRAM) to avoid the code generated becoming exponentially
272 large, just to be then compressed back to normal by
273 _setcode() (in Parser.pm). This problem is a consequence of the
274 previous change. Note that the compiler is stil slower than it
275 needs to be, but further improvements will need to wait for a
276 new release.
277
278 * Added a lot of functionality to the calculator (intercalc),
279 which now works in "oic" and "expr" mode (see the docs), and
280 will probably work in "full" mode but it is untested. Anyway,
281 you can astonish all your friends with a calculator where you
282 can type something like:
283
284 #1 <- #2
285
286 and thereafter whenever you use the number 1 you get 2 instead,
287 for example:
288
289 .1 <- #5
290 .2
291
292 will give you 5 (or rather "V") because you've assigned to .2...
293 OK, it is a bit slow just now but this is because the compiler is
294 slow, and improvements will follow in 1.-94.-3. Honest.
295
296 * Minor changes/fixes/etc in:
297 Language::INTERCAL::ArrayIO
298 Language::INTERCAL::Charset
299 Language::INTERCAL::Charset::Baudot
300 Language::INTERCAL::Exporter
301 Language::INTERCAL::GenericIO
302 Language::INTERCAL::Interface::None
303 Language::INTERCAL::Numbers
304 Language::INTERCAL::ReadNumbers
305 Language::INTERCAL::Reggrim
306 Language::INTERCAL::WriteNumbers
307
308 Changes from CLC-INTERCAL 1.-94.-6 to 1.-94.-5
309
310 * Done some changes to the parser as a preparation for further
311 development (planned between 1.-94.-4 and 1.-94-release).
312
313 * Removed licence.* and the corresponding paragraph in the
314 README etc. It was a joke but it is getting difficult to
315 maintain.
316
317 * Added a separate gerund for loops and events (before they had
318 a common gerund); added a possibility to ABSTAIN FROM LOOPING,
319 which also abstains from events, and the corresponding templates.
320
321 Ditto for CONVERT/SWAP to distinguish betweem loops/events and
322 generic statements.
323
324 * Fixed a bug in the bytecode generated for loops, which could not
325 possibily work in bases other than 2. Ditto for the corresponding
326 CONVERT and SWAP.
327
328 * Fixed a typo on the grammar which caused any expression to be
329 recognised as end of comment; computed labels appear as
330 (expression), so this is now the syntax checked. And a related
331 grammar bug caused invalid code when processing labels!
332
333 * Fixed the "COME FROM gerund" code, which caused problems with
334 examples/quantum/come-from-gerund.gi
335
336 * Made some changes in Language::INTERCAL::GenericIO to fix
337 some problems with the example programs provided.
338
339 * Fixed some problems with the bytecode generated for REMEMBER
340
341 Changes from CLC-INTERCAL 1.-94.-7 to 1.-94.-6
342
343 * Added an INTERCAL desk calculator (intercalc) - just a stub for
344 now but it'll grow into something one day.
345
346 * Bug fixes in the sick.iacc grammar: some quantum statements were
347 incorrectly specified; also READ OUT * did not parse correctly.
348
349 * Some rewriting of the parser allows more flexibility when writing
350 grammars; also, there is now a mechanism to extract the whitespace
351 discarded by the compiler: this may be, one day, used to embed
352 Whitespace (see http://compsoc.dur.ac.uk/whitespace/) into INTERCAL.
353
354 Also, the code looking for the end of a comment, which used to
355 look for the first DO, PLEASE or (number) after a parse error,
356 now uses symbols defined in the grammar instead. This means that,
357 for example, sick now recovers correctly from a parse error
358 just before a computed label; formerly, it would consider the
359 computed label as part of the comment because it did not match
360 the simple pattern.
361
362 Yes, the compiler is getting slower, but I have ideas on how to
363 improve that, which I plan to work on in 1.-93; meanwhile, this
364 release will test all the grammars and iacc files.
365
366 * Removed the "deep recursion" messages when compiling the licence
367 agreement (this would also happen in any other suitably complicated
368 grammar).
369
370 * Removed references to the old licence from all source files, and
371 updated copyright statement and perversion number.
372
373 * Fixed some weirdness in the generation of manpages from pod, caused
374 by the weirdness of the source directory structure.
375
376 * Added an option to link any two objects together; this is similar
377 to the preload used to compile things, but can be applied to
378 any object, even one already compiled. Moreover, using --preload
379 prevents guessing a list of preloads, so you need to specify
380 them all in the command line; --link is an independent mechanism
381 and does not stop the default preloads: see the example in the
382 next bullet.
383
384 Note however that not all objects designed to use with --preload
385 will work with --link; for example, attempting to --link 3.io
386 will not switch the base at runtime: instead it will cause your
387 program to fail to run. The reason is that 3.io has been designed
388 to be included at compile time, not at runtime.
389
390 * Added a "trace mode" which allows one to watch bytecode while it
391 is executed. To use it, compile to object as normal and then link
392 with trace.io:
393
394 sick -lObject PROGRAM.i (or whatever)
395 sick -lRun PROGRAM.io --link trace.io
396
397 of course, you can combine the two:
398
399 sick -lRun PROGRAM.i --link trace.io
400
401 The advantage of --link over --preload in this case is that --link
402 does not clear the preload list; the equivalent command using
403 --preload, and assuming you haven't changed the system.sickrc is:
404
405 sick -lRun -psick -ptrace -ppostpre PROGRAM.i
406
407 Note that trace.io has been designed to be included at runtime. While
408 it works in this example, it may cause other preloads to stop working
409 if they appear after trace.io in the command line.
410
411 * Changed the encoding of Hollerith into bytes to interleave the bits
412 instead of splitting them.
413
414 Changes from CLC-INTERCAL 1.-94.-8 to 1.-94.-7
415
416 * New licence.
417
418 * Minor problems in the documentation fixed (could cause some fussy
419 browsers to display the examples incorrectly).
420
421 Changes since CLC-INTERCAL 0.05
422
423 * NOTE: CONVERT and SWAP are currently unimplemented in the prerelease
424 1.-94 compiler. Use the new CREATE and DESTROY instead (see below).
425
426 * ALSO NOTE: This file is sorted by decreasing order of sanity. You may
427 stop reading at any point, but, if you continue, things are guaranteed
428 to get worse.
429
430 * New version scheme including negative revision numbers has been introduced.
431
432 * "Version" renamed "perversion" for honesty.
433
434 * Implemented the just-too-late compiler people have heard me talking about:
435 see file doc/just-too-late.pod
436
437 * Modified the operators to support Tri-INTERCAL (and all bases up to 7)
438 and of course add the extra operators (Unary BUT, etc); the notation will
439 be different from their C-INTERCAL's counterpart (because the whirlpool
440 has already been used for classes); unary BUT is written ?; unary Add
441 Without Carry is written | (in C-INTERCAL compatibility mode, BUT is @
442 and Add is ^).
443
444 * Updated the WRITE IN code to allow input in Latin, like C-INTERCAL 0.20;
445 also added an alternative spelling for Gaelic Neoni (0).
446
447 * Added new stashes. INTERCAL 1972 and C-INTERCAL have two stashes: one for
448 the program counter (used by NEXT) and one for all the other registers.
449 CLC-INTERCAL 0.05 had three (two independent ones for the program counter:
450 did anybody notice that you can do NEXT from within a lecture, do a FINISH
451 LECTURE, and you can still RESUME? In other words, you could do subroutine
452 returns in the wrong order and it wold work (for INTERCAL values of work);
453 after all, you can already stash registers and then retrieve them in the
454 wrong order, as long as the registers are distinct).
455
456 CLC-INTERCAL 1.-94 has sixteen independent stashes, but we aren't (yet)
457 admitting what they are used for. It helps to remove that unfortunate
458 resemblance between stashes and stacks. You can now stash a register
459 several times and then retrieve it in any order, not just the reverse
460 of the stashing. If this is confusing, don't worry, we can't figure out
461 why one would want to do that either.
462
463 * Updated READ code to allow array slices (e.g. if ;1 is a 2-dimensional
464 array, READ OUT ;1 SUB #2 will read out all elements of ;1 which have
465 first subscript #2). For reasons which shall remain unexplained, WRITE IN
466 can only use whole array or single elements, no slices (this, of course,
467 might change in a future release).
468
469 * Implemented the CREATE statement, as well as its companion DESTROY: the
470 syntax is different from what had been announced (but never implemented)
471 before, and use of these statements require knowledge of the INTERCAL
472 virtual machine, which will be documented in future (possibly). The parser
473 is now provided in its source form (a list of CREATE statements), and this
474 can be used as example by anybody who is interested to extend the compiler.
475 A mini-compiler is provided in src/iacc.iacc (source) and src/iacc.io
476 (object) to compile the full compiler.
477
478 * Implemented a new statement, the "NEXT FROM". This is similar to
479 "COME FROM", except that the current position is stashed. For example,
480 the two programs:
481
482 (1) DO .1 <- #1 | DO (2) NEXT
483 PLEASE READ OUT .1 | PLEASE READ OUT .1
484 DO GIVE UP | DO GIVE UP
485 DO NEXT FROM .1 | (2) DO .1 <- #2
486 DO .1 <- #2 | PLEASE RESUME #1
487 PLEASE RESUME #1
488
489 produce the same result ("II"). It is an error to have more than one
490 "NEXT FROM" looking at the same label, or a "NEXT FROM" and a "COME FROM".
491 This limitation might be removed in future releases. Also note that
492 we think this new statement is cool, so you won't have to ask the compiler
493 to include it (as you need to do with "NEXT"/"RESUME"/"FORGET"), it's
494 always available.
495
496 * Also allowed "Gerund" forms of "COME FROM" and "NEXT FROM", so they now
497 look like ABSTAINs and REINSTATEs in the grammar. There is an example
498 in examples/quantum/come-from-gerund.gi; Since programs using this
499 construct incur some performance penalty (every statement is now a potential
500 target for a "COME FROM"/"NEXT FROM", not just ones with labels), it needs
501 to be explicitly enabled by preloading "come-from-gerund" or using the
502 suffix ".gi" instead of ".i"
503
504 * Also updated the definition of "GERUND" to include "COMMENTING" (which can
505 be abbreviated "COMMENTS") - with all INTERCAL compilers, unrecognised
506 statements are treated as comments; if they are executed, they print
507 themselves as error messages and abort. Now it is possible to ignore
508 errors by saying:
509
510 PLEASE ABSTAIN FROM COMMENTING
511
512 You can, of course, REINSTATE COMMENTS, although this might transform
513 genuine comments ("PLEASE NOTE: THIS IS A COMMENT") into error messages.
514 But then, you had a similar problem when comments had labels.
515
516 * Modified the initialisation code to make the command-line and the
517 environment available to the program. These will be found in the special
518 array registers ^1 and ^2, respectively. The arrays are bidimensional,
519 with ^1 SUB #1 containing the first argument, ^1 SUB #2 the second, and
520 so on. Needless to say, these arguments are provided as if they had been
521 written in, so they are likely to be in Baudot or something as bad as that.
522 A class library to implement associative arrays is going to be provided
523 one day - this would be just what you need to use ^2 (the environment).
524
525 Please note that these registers are used by the initialisation code, and
526 are not normally accessible to the program (but see the next point)
527
528 * Made some of the program's internal state accessible to the program via a
529 set of special registers (%n). For example, "DO %1 <- #1" will cause the
530 program to do something unexpected (because %1 is the first part of the
531 instruction pointer, the rest being %2 and %3). Note that a statement
532 starting with "DO %1" can now be an assignment or something else, for
533 example "DO %10 <- #1" is an assignment, and "DO %10 READ OUT .1" is a
534 statement which reads out a register one time in ten. This is OK because
535 IACC (the parser generator) happily accepts nondeterministic grammars, and
536 sometimes even produces the expected results.
537
538 The use of these registers should be limited to the compiler itself. In
539 fact, they are currently only available to the compiler, but nobody stops
540 the programmer from making them available with the appropriate CREATEs.
541
542 If you really must, the list of these register is around line 82 of
543 Language/INTERCAL/Object.pm -- look for %special_registers. Note that
544 you cannot use any % or ^ register unless it's listed there, and you
545 cannot always resize ^ registers. Some of the registers behave weirdly.
546
547 * Rewritten the write/read code to allow more flexibility from within the
548 program - this is used by the compiler itself as well as by other things
549 which are currently kept secret. The word "Outercal" has been uttered again.
550
551 * Added some more quantum constructs:
552
553 DO register <- expression WHILE NOT ASSIGNING TO IT
554 DO COME FROM (label) WHILE NOT COMING FROM THERE
555 DO CREATE ... WHILE NOT CREATING IT
556 DO DESTROY(... WHILE NOT DESTROYING IT
557 DO ENROL register TO LEARN subjects WHILE NOT ENROLLING
558 DO ENSLAVE register TO register WHILE LEAVING IT FREE
559 DO FINISH LECTURE WHILE CONTINUING IT
560 DO FORGET expression WHILE NOT FORGETTING
561 DO FREE register TO register WHILE LEAVING IT IN SLAVERY
562 DO NEXT FROM (label) WHILE NOT NEXTING FROM THERE
563 DO GIVE UP WHILE CONTINUING TO RUN
564 DO register GRADUATES WHILE REMAINING A STUDENT
565 DO register LEARNS subject WHILE NOT LEARNING IT
566 DO (label) NEXT WHILE NOT NEXTING
567 DO RESUME expression WHILE NOT RESUMING
568 DO RETRIEVE registers WHILE NOT RETRIEVING THEM
569 DO STASH registers WHILE NOT STASHING THEM
570 DO STUDY subject AT (label) IN CLASS @(number) WHILE NOT STUDYING IT
571 DO WRITE IN registers WHILE NOT WRITING THEM
572
573 Note that quantum assignment will also generate quantum bits on side effects:
574 if the expression contains some overloading, the overloading will take effect
575 while not taking effect; if the assignment modifies constants (see next
576 point), they will retain their previous value while assuming a new one.
577 This applies to most of the new constructs except (just to be different)
578 quantum COME FROM, which always applies side effects but causes the program
579 to jump while remaining stationary (similarly quantum NEXT FROM and
580 behaves like quantum COME FROM)
581
582 Examples for all forms of quantum constructs are found in directory
583 examples/quantum: all these files can be compiled with the default
584 CLC-INTERCAL compiler; in addition, examples/threads.i is a program
585 which demonstrates the use of (non-quantum) threads, and must be
586 compiled using the Threaded INTERCAL compatibility mode ("thick").
587
588 * Allowed to modify constants by assigning to an overloaded register, for
589 example:
590
591 PLEASE DO .1 <- .1/#1
592
593 will (shock! horror!) leave the value of .1 unchanged, but at the same
594 time modifies the value of #1 to whatever value was in .1 before the
595 assignment. Note that this changes more than you might expect: for
596 example, the "1" in ".1" will now change too... so when you try to
597 assign to .1 (for example to restore #1 to its former value), you might
598 get a different register. The way around it is:
599
600 PLEASE DO .2 <- #1
601 PLEASE ENSLAVE .2 TO .1
602 DO .1 <- #1234
603 DO .1 <- .1/#1
604 DO SOMETHING WITH #1 CHANGED TO #1234
605 DO $.2 <- .2
606 DO FREE .2 FROM .1
607
608 You need to use $.2, because .1 is not accessible in any other way. Of
609 course, you are responsible for keeping the value of #2 constant during
610 the above code.
611
612 You probably guessed a simpler solution already:
613
614 PLEASE DO .1234 <- #1
615 PLEASE ENSLAVE .1234 TO .1
616 DO .1 <- #1234
617 DO .1 <- .1/#1
618 DO SOMETHING WITH #1 CHANGED TO #1234
619 DO $.1 <- .1
620 DO FREE .1234 FROM .1
621
622 This works because the references to .1 are really references to .1234,
623 which of course contains .1; and $.1 is really $.1234 which is the real .1
624
625 People who want to keep their sanity should avoid assigning to constants.
626 (come to think of it, people who want to keep their sanity should avoid
627 INTERCAL...)
628
629 People who are not so worried about their sanity can read all about
630 overloading in the documentation.
631
632 * A new operating system interface is available via the use of the special
633 register %OS and the compiler module "syscall.iacc" (which can be added to
634 sick by using the option "-psick -psyscall" or, better, "--suffix=si").
635 After you added "syscall.iacc" to your program, it will behave as if the
636 operating system had, lurking in its darkest corner, the statement:
637
638 DO NEXT FROM (666)
639
640 (In fact, it is a computed NEXT FROM and the label is specified by the
641 internal register %OS; however, since the register is not accessible to
642 the program, it is just as good as a noncomputed one, unless you use CREATE
643 to make the register accessible). The operation code is contained in
644 register +.1-$%OS which is just a shortand for "the spot register with the
645 same number as the last register assigned to before the system call". For
646 example, the following:
647
648 (666) DO .666 <- #2
649
650 would execute system operation #2, whatever it is. However, the following:
651
652 (666) DO :123 <- #2
653
654 would execute the system operation with code in .123 (the assignment was to
655 :123, which of course does not alter .123, but sets the register number to
656 be used to 123, so the expression "+.1-$%OS" becomes equivalent to
657 "+.1-:123" which is of course ".123".
658
659 Also note that if a thread has never assigned to a register, it is an error
660 to use the syscall interface. A program starting with:
661
662 (666) DO NOT GIVE UP
663
664 would therefore produce an error.
665
666 One more note, "writing" a register means assigning to it. For example,
667 the following program would obtain a system operation number from the
668 operator:
669
670 (666) PLEASE WRITE IN .1
671
672 An then there is:
673
674 (666) DO RETRIEVE :1 + ,2 + ;3
675
676 which can decide to use .1, .2 or .3 depending on the actual order of
677 evaluation (the RETRIEVE is considered to modify all the registers listed).
678 In all versions of CLC-INTERCAL, registers are retrieved in order, so,
679 until we change something, this uses .3 for the opcode.
680
681 Enslaving, freeing, enrolling and graduating are not considered
682 modifications in this context. Overloading is also not considered a
683 modification (including assignment to overloads) although it probably
684 ought to be. If you want consistency, don't use INTERCAL. For example:
685
686 PLEASE .1 <- .2/#3
687 (666) DO .2 <- #4
688
689 would execute the system call with ".1", not ".2", because the last
690 assignment is to an overloaded register (in fact, it is altering #3
691 to be the same as #4, so it is not assigning to a register at all!)
692
693 The list of system operations does not necessarily correspond with the
694 O.S. kernel's list of syscalls, or with anything else. It is currently
695 documented only by the self-explanatory source code in syscall.i - which
696 also doubles as example for "COME FROM GERUND" and "CREATE".
697
698 Parameters to the call are contained in registers with the same number
699 as the opcode: +:1-$%OS for numbers, +,1-$%OS for strings and +;1-$%OS
700 for lists of numbers. Of course, some opcodes have nonstandard calling
701 conventions.
702
703 It is possible to disable system calls using "DO ABSTAIN FROM NEXTING FROM",
704 and re-enable them with "DO REINSTATE NEXTING FROM".
705
706 * Since you are still here, you can read the comment before subroutine
707 _forall_statement() in Language::INTERCAL::Object and reproduced below:
708
709 # The following subroutine handles the rather dubious case in which the
710 # compiled program has changed, and the program counter needs adjusting
711 # in all threads to find where the current code has gone. The reason it
712 # is called _forall_statements is because this can only happen when we
713 # sweep through the program, for example to find come froms, labels, and
714 # what have you. In all other cases, the program counter automagically
715 # adapts to the code. Really. Look at _run_code() if you don't believe me
716