home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / lout2.lzh / LOUT2 / DOC / TR.IMPL / s3.3 < prev    next >
Text File  |  1994-01-25  |  5KB  |  144 lines

  1. @SubSection
  2.     @Tag { modules }
  3.     @Title { Modules }
  4. @Begin
  5. @PP
  6. It is well accepted that the visibility of symbols is not adequately
  7. controlled by Algol block structure.  The author is aware of several
  8. major problems of this kind in document formatting.
  9. @PP
  10. One problem is that some symbols should be visible only within
  11. restricted parts of a document.  For example, we naturally expect
  12. equation formatting to be accomplished like this:
  13. @ID @Code {
  14. "surrounding text"
  15. "@Eq { {x sup 2  +  1} over 4 }"
  16. "surrounding text"
  17. }
  18. with the symbols {@Code "sup"}, {@Code "over"}, etc., visible only within
  19. the equation, not in the surrounding text.
  20. @PP
  21. It seems natural to define these symbols within {@Code "@Eq"}, since
  22. they are local to equations.  It only remains then to decree that
  23. symbols local to @Code "@Eq" are to be visible within its actual right
  24. parameter, and this is done by replacing the right formal parameter with a
  25. @I body parameter:
  26. @ID @Code {
  27. "export sup over"
  28. "def @Eq"
  29. "    body @Body"
  30. "{"
  31. "    def sup ..."
  32. "    def over ..."
  33. ""
  34. "    Slope @Font @Body"
  35. "}"
  36. }
  37. The @Code export clause lists the identifiers which are permitted to be
  38. visible outside their usual range, the body of {@Code "@Eq"}; and the
  39. @Code body declaration imports them into (makes them visible within)
  40. the actual right parameter of each invocation of {@Code "@Eq"}.  This
  41. arrangement has proven very convenient for defining a variety of
  42. special-purpose packages.
  43. @PP
  44. Another problem arises when global symbols, such as the ones used for
  45. headings and paragraph separators, call on values that the non-expert
  46. user will need to modify, such as the initial font or paragraph
  47. indent.  These values are like parameters of the document as a whole, so
  48. it is natural to try this:
  49. @ID @Code {
  50. "export @Heading @PP ..."
  51. "def @BookLayout"
  52. "    named @InitialFont { Times Base 12p }"
  53. "    named @InitialBreak { adjust 14p }"
  54. "    named @ColumnWidth { 6i }"
  55. "    ..."
  56. "{"
  57. "    def @Heading ..."
  58. "    def @PP ..."
  59. "}"
  60. }
  61. Now @Code "@Heading" and @Code "@PP" may invoke @Code "@InitialFont"
  62. and the other parameters.  To make @Code "@Heading" and @Code "@PP"
  63. visible throughout the document, we need only add a body parameter to
  64. @Code "@BookLayout" and present the entire document as
  65. @ID @Code {
  66. "@BookLayout"
  67. "    @InitialFont { Helvetica Base 10p }"
  68. "    @InitialBreak { adjust 12p }"
  69. "{"
  70. "    The document."
  71. "}"
  72. }
  73. but for practical reasons given below we prefer not to enclose the
  74. entire document in braces.  Instead, we write
  75. @ID @Code {
  76. "@Use { @BookLayout"
  77. "    @InitialFont { Helvetica Base 10p }"
  78. "    @InitialBreak { adjust 12p }"
  79. "}"
  80. "The document."
  81. }
  82. which has the same effect:  @Code "@Use" makes the exported symbols of
  83. @Code "@BookLayout" visible for the remainder of the document, and is
  84. permitted only at the beginning.
  85. @PP
  86. The third feature that affects visibility, and which will prove useful
  87. for cross referencing (Section {@NumberOf cross}), is the @Code "@Open"
  88. symbol.  It makes the exported symbols of its left parameter visible
  89. within its right parameter, and is therefore similar to the Pascal @Code
  90. with statement.
  91. @PP
  92. It could be argued that Lout is over-supplied with these visibility modifying
  93. features: the body parameter, @Code "@Use" and @Code "@Open" do not seem
  94. sufficiently different from each another.  The @Code "@Open" symbol is
  95. the most general, being capable of replacing the other two.  For
  96. example,
  97. @ID @Code {
  98. "@Use { x }"
  99. "@Use { y }"
  100. "Body of document"
  101. }
  102. can be replaced by
  103. @ID @Code {
  104. "x @Open {"
  105. "y @Open {"
  106. "Body of document"
  107. "}}"
  108. }
  109. and, taking the @Code "@Eq" symbol above as example, we could eliminate
  110. its body parameter, add
  111. @ID @Code "def @Body right x { Slope @Font x }"
  112. to the exported definitions of {@Code "@Eq"}, and replace
  113. @ID @Code "@Eq { object }"
  114. by
  115. @ID @Code "@Eq @Open { @Body { object } }"
  116. If @Code "@Eq" is a galley (Section {@NumberOf galleys}), @Code "@Body"
  117. must take over that function.  But one would not want to write these
  118. clumsy expressions in practice, and the enclosure of large quantities
  119. of input in extra braces could cause Basser Lout to run out of memory
  120. (Section {@NumberOf lookahead}).
  121. @PP
  122. A quite separate kind of visibility problem arises when expert
  123. users wish to define an object or operator for repeated use within, say,
  124. equations:
  125. @ID @Code "def isum { sum from i=1 to n }"
  126. As it stands this can only be placed within the @Code "@Eq" package itself, 
  127. where @Code "sum" and the other symbols are visible, but it is not desirable
  128. to modify the source code of a standard package.  Lout provides an
  129. @Code "import" clause to solve this problem:
  130. @ID @Code {
  131. "import @Eq"
  132. "def isum { sum from i=1 to n }"
  133. }
  134. may appear after @Code "@Eq" is defined, and it will make the exported symbols
  135. of @Code "@Eq" visible within the body of {@Code "isum"}.  This feature
  136. complicates the treatment of environments (Section {@NumberOf defs.impl}),
  137. and even introduces an insecurity, when @Code isum is invoked outside an
  138. equation.  A simpler approach would be to allow only one symbol in an
  139. @Code import clause, and treat the following definition exactly like a
  140. local definition of that symbol; but then it would not be possible
  141. to define symbols using the resources of more than one of the standard
  142. packages.
  143. @End @SubSection
  144.