home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / text / tex / 9663 < prev    next >
Encoding:
Text File  |  1992-07-30  |  7.9 KB  |  160 lines

  1. Newsgroups: comp.text.tex
  2. Path: sparky!uunet!europa.asd.contel.com!darwin.sura.net!wupost!zaphod.mps.ohio-state.edu!moe.ksu.ksu.edu!ux1.cso.uiuc.edu!news.cso.uiuc.edu!cameron
  3. From: cameron@symcom.math.uiuc.edu (Cameron Smith)
  4. Subject: Re: A bug in \mark? [CORRECTED RE-POST; ORIGINAL WAS GARBLED]
  5. References: <9207291551.AA09050@triples.math.mcgill.ca>
  6. Message-ID: <Bs7nus.E1u@news.cso.uiuc.edu>
  7. Sender: usenet@news.cso.uiuc.edu (Net Noise owner)
  8. Organization: none
  9. Date: Thu, 30 Jul 1992 16:44:49 GMT
  10. Lines: 148
  11.  
  12. EGAD!  The first posting of this article got horribly mangled somehow.
  13. As far as I can tell, groups of six lines were randomly deleted,
  14. and the lines before and after each group spliced together.
  15. I have no idea what happened, but since I said some harsh things I
  16. wanted them at least to be communicated accurately, so I have canceled
  17. the original and am re-posting.  I apologize for the waste of bandwidth.
  18. I post dozens of articles a year; it figures that this one would be
  19. the one to get garbled!
  20.  
  21. ---- Text of original posting, as it was intended to appear: ----
  22.  
  23. [ Tirade alert!  The question does get answered, though. ]
  24.  
  25. Wow!  A question about expansion versus evaluation that I can answer!
  26. After a mere 7 years of using TeX daily, I'm finally catching on!
  27.  
  28. Michael Barr (barr@triples.Math.McGill.CA) asks why the following
  29. produces an error:
  30. %%%%%%%%%%%% file starts here %%%%%%%%%%%%%%
  31. \let\uc=\uppercase
  32. \newif\ifucase
  33. \def\ss{\ifucase SS\else\char"19\fi}
  34. \def\aa{\ifucase\AA\else\accent23a\fi}
  35. \def\ae{\ifucase\AE\else\char"1A\fi}
  36. \def\oe{\ifucase\OE\else\char"1B\fi}
  37. \def\o{\ifucase\O\else\char"1C\fi}
  38. \def\uppercase#1{{\ucasetrue \uc{#1}}}
  39.  
  40. \mark{\uppercase{chapter}}
  41. \bye
  42. %%%%%%%%%%%% file ends here %%%%%%%%%%%%%%
  43. Specifically, TeX complains of an "incomplete \iffalse".  Barr asks
  44. whether this may reflect a bug in "\mark".
  45.  
  46. No, no, silly, it's *supposed* to do that, of course!  It's obvious
  47. that TeX is doing just what you want it to do.  Right?  Well, OK, it's
  48. not at all obvious to me, either -- I can explain it now that I've seen
  49. it, but I never would have predicted it (a statement that is all too
  50. true of too too much of TeX).  In any case, it is working as documented.
  51.  
  52. Here's why: macros are expanded but not evaluated inside a "\mark"
  53. (and in some other places -- such as a \write).  So the "\uppercase"
  54. macro inside the "\mark" gets expanded into "{\ucasetrue \uc{chapter}}",
  55. and then "\ucasetrue" itself is expanded.  The hack that "\newif" uses
  56. to create conditionals defines "\ucasetrue" to be "\let\ifucase=\iftrue".
  57. If the ordinary sequence of evaluation were happening (as it is, for
  58. example, in horizontal mode when TeX is building a paragraph) then
  59. "\ucasetrue" would be expanded, then the tokens resulting from the
  60. expansion would themselves be expanded (etc. etc.) until a nonexpandable
  61. token (which \let is) was detected, and that would then be evaluated.
  62. The evaluation of the "\let" would "gobble up" the "\ifucase=\iftrue"
  63. tokens *without* *expanding* *them*; the assignment would be made
  64. (locally to the enclosing group), and all would be well.  BUT inside
  65. the "\mark" construction evaluation is suppressed, so when the expansion
  66. of "\ucasetrue" produces the tokens "\let\ifucase=\iftrue", the "\let"
  67. is seen to be unexpandable AND SO THE SCANNER JUST SKIPS OVER IT,
  68. preserving it for later processing, AND ENCOUNTERS THE "\ifucase"
  69. (which would have been "gobbled" had the "\let" been evaluated).
  70. Now the current meaning of "\ifucase" is "\iffalse" (because when
  71. "\newif" creates a conditional, it makes the conditional initially
  72. false).  But "\iffalse" is handled by the expansion processor, *not*
  73. the evaluation processor, and expansion *does* take place inside
  74. a "\mark" (that's how we got into this mess in the first place),
  75. so TeX goes merrily off looking for a matching "\fi" for the "\iffalse".
  76. It doesn't find one, of course, but it does find (two tokens after
  77. the "\iffalse") another conditional, the "\iftrue" on the other side
  78. of the equals sign, so there are actually TWO unclosed conditionals
  79. inside the "\mark"!  Bummer!
  80.  
  81. You see what an insane "programming language" TeX is?  Far too much
  82. of The TeXbook is a compendium of cute hacks and absurd kludges, made
  83. necessary by TeX's ingenious but demented evaluation strategy.
  84.  
  85. Of course, the solution is to defer the evaluation of the "\uppercase"
  86. macro.  If we replace the next-last line of the file by
  87.  
  88.    \mark{\noexpand\uppercase{chapter}}
  89.  
  90. then the error goes away (try it).  But don't fool yourself into
  91. thinking that the problem has been solved!  You see, we've only
  92. deferred expansion of the single token "\uppercase"; the rest of
  93. the mark text is still expanded.  So if the construction were
  94. actually
  95.  
  96.    \mark{\noexpand\uppercase{\ae sop's \oe uvres}}
  97.  
  98. then there would be no error, but we'd see "aeSOP'S oeUVRES" in the
  99. running head (or wherever it is that the mark text is used).  We would
  100. have to type
  101.  
  102.    \mark{\noexpand\uppercase{\noexpand\ae sop's \noexpand\oe uvres}}
  103.  
  104. for our true intentions to be realized.
  105.  
  106. And that, ladies and gentlemen, is why I'll use software of Don Knuth's
  107. to typeset my letters, or even my doctoral thesis, but I'd never ever
  108. let him write air traffic control software or even balance my checkbook.
  109. He is very very clever (which is good), and so are his programs (which isn't).
  110.  
  111. Incidentally, I *still* may not have it right; if not, I'd be
  112. grateful for corrections.
  113.  
  114. Anybody rememeber Strachey's GPM?  The General Purpose Macrogenerator
  115. was a macro-expansion tool Strachey developed to assist in bootstrapping
  116. a CPL compiler on the Titan (Atlas 2) computer.  The GPM was a complete
  117. (in the sense of "as powerful as any Turing machine") programming system
  118. that worked exclusively by macro expansion.  In the article in which he
  119. described the GPM (in the Computer Journal, sometime in 1965 -- the date
  120. isn't on the photocopy I'm looking at) Strachey showed how to define
  121. (very slow) routines to do integer addition and multiplication,
  122. conditionals and loops, all with macros.  Strachey also wrote:
  123.  
  124.    ...one of the remarkable features of the GPM is its great power
  125.    in spite of using so little apparatus... albeit at the cost of
  126.    a very considerable obscurity of the written programs.
  127.    It has been our experience that the GPM, while a very powerful
  128.    tool in the hands of a ruthless programmer, is something of a
  129.    trap for the sophisticated one.  It contains in itself all the
  130.    undesirable features of every possible machine code---in the
  131.    sense of inviting endless tricks and time-wasting though fascinating
  132.    exercises in ingenuity... It can also be almost impenetrably
  133.    opaque, and even very experienced programmers indeed tend to spend
  134.    hours simulating its action when one of their macro definitions
  135.    goes wrong...
  136.  
  137. Strachey could easily have been looking into a crystal ball and
  138. pre-reviewing TeX (and Metafont, which is worse).  Poor Knuth: I think
  139. he meant to be one of Strachey's "ruthless" types and ended up being
  140. one of the "sophisticated" ones instead.  And poor users of TeX:
  141. we're all in the same boat with him.  Strachey's GPM article appeared
  142. twelve years before Knuth began work on TeX;  I never cease to wish
  143. that he had read it and heeded its warning, but I suspect that he did
  144. read it and was seduced by it.  Macro processing is like the Dark Side
  145. of the Force: profoundly powerful and shockingly dangerous.
  146.  
  147. By the way, Strachey's article had a bug in it: one of the macro
  148. examples is missing one level of quotes around one comma.  The effects
  149. are detectable only in very special circumstances (I don't recall the
  150. details, but it's something like "when a two-digit number is being
  151. incremented and the second digit is a 9, calling for a carry to
  152. be performed").  Maybe this error was only typographical, introduced
  153. in the typesetting of the journal, but the CPL program he published
  154. that implements the GPM also has bugs.  I find this somehow strangely
  155. comforting:  it's not just me; *nobody* can get these damn macro systems
  156. to work right!
  157.  
  158. --Cameron Smith
  159.   cameron@symcom.math.uiuc.edu
  160.