concept-decls.tex 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. % -*- Mode: TeX -*-
  2. \newtermidx{Declarations}{declaration} provide a way of specifying information for use by
  3. program processors, such as the evaluator or the compiler.
  4. \newtermidx{Local declarations}{local declaration}
  5. can be embedded in executable code using \misc{declare}.
  6. \newtermidx{Global declarations}{global declaration},
  7. or \newtermidx{proclamations}{proclamation},
  8. are established by \funref{proclaim} or \macref{declaim}.
  9. %% 9.3.0 1
  10. \Thespecform{the} provides a shorthand notation for
  11. making a \term{local declaration} about the \term{type} of the
  12. \term{value} of a given \term{form}.
  13. %% 9.0.0 4
  14. % This is redundant with the next sentence. --sjl 3 Mar 92
  15. % The consequences are undefined if a program violates a type declaration.
  16. %% 9.2.0 1
  17. %% 9.2.0 6
  18. The consequences are undefined if a program violates a \term{declaration}
  19. or a \term{proclamation}.
  20. \beginSubsection{Minimal Declaration Processing Requirements}
  21. In general, an \term{implementation} is free to ignore
  22. \term{declaration specifiers} except for the
  23. \declref{declaration}\idxref{declaration},
  24. \declref{notinline}\idxref{notinline},
  25. \declref{safety}\idxref{safety},
  26. and \declref{special}\idxref{special} \term{declaration specifiers}.
  27. A \declref{declaration} \term{declaration} must suppress warnings
  28. about unrecognized \term{declarations} of the kind that it declares.
  29. If an \term{implementation} does not produce warnings about
  30. unrecognized declarations, it may safely ignore this \term{declaration}.
  31. A \declref{notinline} \term{declaration} must be recognized by any \term{implementation}
  32. that supports inline functions or \term{compiler macros} in order to disable those facilities.
  33. An \term{implementation} that does not use inline functions or \term{compiler macros}
  34. may safely ignore this \term{declaration}.
  35. A \declref{safety} \term{declaration} that increases the current safety level
  36. must always be recognized. An \term{implementation} that always processes
  37. code as if safety were high may safely ignore this \term{declaration}.
  38. A \declref{special} \term{declaration} must be processed by all \term{implementations}.
  39. \endSubsection%{Minimal Declaration Processing Requirements}
  40. \beginSubsection{Declaration Specifiers}
  41. A \newterm{declaration specifier} is an \term{expression} that can appear at
  42. top level of a \misc{declare} expression or a \macref{declaim} form, or as
  43. the argument to \funref{proclaim}.
  44. It is a \term{list} whose \term{car} is a \term{declaration identifier},
  45. and whose \term{cdr} is data interpreted according to rules specific to
  46. the \term{declaration identifier}.
  47. \endSubsection%{Declaration Specifiers}
  48. \beginSubsection{Declaration Identifiers}
  49. \Thenextfigure\ shows a list of all
  50. \term{declaration identifiers}\idxterm{declaration identifier}
  51. defined by this standard.
  52. \issue{DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION}
  53. \displaythree{Common Lisp Declaration Identifiers}{
  54. declaration&ignore&special\cr
  55. dynamic-extent&inline&type\cr
  56. ftype&notinline&\cr
  57. ignorable&optimize&\cr
  58. }
  59. %FUNCTION removed.
  60. \endissue{DECLARE-FUNCTION-AMBIGUITY:DELETE-FTYPE-ABBREVIATION}
  61. %% 9.2.0 20
  62. An implementation is free to support other (\term{implementation-defined})
  63. \term{declaration identifiers} as well.
  64. % Sections 3.2.2.3 and 3.2.5 both classify this as an ordinary warning.
  65. % --sjl 3 Mar 92
  66. % A warning \oftype{style-warning} might be issued
  67. A warning might be issued
  68. if a \term{declaration identifier}
  69. is not among those defined above,
  70. %Added for Barmar: -kmp 11-Jan-91
  71. is not defined by the \term{implementation},
  72. is not a \term{type} \term{name},
  73. and has not been declared in a \declref{declaration} \term{proclamation}.
  74. % I can't figure out where this paragraph came from, and I'm convinced
  75. % it's wrong. Issue DECLARATION-SCOPE was intended to assign consistent
  76. % scoping rules to all declarations based only on whether they are ``bound''
  77. % or ``free''. Allowing random scoping rules will also totally defeat
  78. % the proposed define-declaration extensions. --sjl 7 Mar 92
  79. %For \term{implementation-defined} \term{declaration identifiers},
  80. %the \term{scope} of \term{free declarations} and \term{bound declarations}
  81. %is \term{implementation-defined}.
  82. \beginsubsubsection{Shorthand notation for Type Declarations}
  83. %Barrett says class objects are ok here, too.
  84. A \term{type specifier} can be used as a \term{declaration identifier}.
  85. \f{(\param{type-specifier} \starparam{var})} is taken as shorthand for
  86. \f{(type \param{type-specifier} \starparam{var})}.
  87. \endsubsubsection%{Shorthand notation for Type Declarations}
  88. \endSubsection%{Declaration Identifiers}
  89. \beginSubsection{Declaration Scope}
  90. \DefineSection{DeclScope}
  91. % Declarations can be divided into two kinds: those that concern
  92. % the \term{bindings} of variables, and those that do not.
  93. % The \declref{special} declaration falls into both classes.
  94. % Declarations that concern \term{variable} \term{bindings} apply
  95. % only to the \term{bindings} made by the \term{form} at the head of
  96. % whose body they appear.
  97. %
  98. % All declarations introduced with \misc{declare} fall into two classes:
  99. % \term{bound declarations} and \term{free declarations}.
  100. % \term{Bound declarations} affect both a binding and any references;
  101. % \term{free declarations} affect only references.
  102. % Some declarations may be used in either way, depending on context.
  103. %
  104. %% The above rewritten with help from Sandra and Moon. -kmp 22-Aug-91
  105. \term{Declarations} can be divided into two kinds: those that apply to the
  106. \term{bindings} of \term{variables} or \term{functions}; and those that
  107. do not apply to \term{bindings}.
  108. A \term{declaration} that appears at the head of a binding \term{form}
  109. and applies to a \term{variable} or \term{function} \term{binding}
  110. made by that \term{form} is called a \newterm{bound declaration};
  111. such a \term{declaration} affects both the \term{binding} and
  112. any references within the \term{scope} of the \term{declaration}.
  113. \term{Declarations} that are not \term{bound declarations} are called
  114. \newtermidx{free declarations}{free declaration}.
  115. % \term{Free declarations} that apply to
  116. % \term{bindings} affect only references to those \term{bindings}.
  117. A \term{free declaration} in a \term{form} $F1$ that applies to a \term{binding}
  118. for a \term{name} $N$ \term{established} by some \term{form} $F2$
  119. of which $F1$ is a \term{subform}
  120. affects only references to $N$ within $F1$; it does not to apply to
  121. other references to $N$ outside of $F1$, nor does it affect the manner
  122. in which the \term{binding} of $N$ by $F2$ is \term{established}.
  123. \term{Declarations} that do not apply to \term{bindings} can only appear
  124. as \term{free declarations}.
  125. % Common Lisp prohibits binding the same name twice in the same binding form.
  126. % It has been proposed that multiple bindings be permitted for LET*, DO*, PROG*
  127. % forms and for &AUX variables in lambda expressions, but never approved.
  128. % In an implementation which permits multiple bindings, `bound' declarations
  129. % should probably be treated as if there were a separate `bound' declaration
  130. % for each of the bindings, but for us to say so would really go beyond the
  131. % scope of this document. As such, we'll just not say anything and leave it to
  132. % any implementation which defines that circumstance to also define the relationship
  133. % to bound declarations. -kmp 22-Aug-91
  134. %% Rewritten by Sandra in response to Margolin #7, Dalton #3, Moon #7 (First Public Review)
  135. % %% 9.1
  136. % Some \term{forms} contain pieces of code that, properly speaking,
  137. % are not part of the body of the \term{form}. Examples of this
  138. % are initialization forms that provide values for bound variables,
  139. % and the result forms of iteration \term{forms}.
  140. %
  141. % \issue{DECLARATION-SCOPE:NO-HOISTING}
  142. %
  143. % The \term{scope} of a \term{declaration} located at the head of
  144. % a \term{special form}, \term{macro form}, or \term{lambda expression} is as follows:
  145. % \beginlist
  146. % \itemitem{1.}
  147. % It always includes the body forms as well as any \term{step} or exit \term{forms}.
  148. % \itemitem{2.}
  149. % It also includes the \term{scope} of the name binding, if any, to which
  150. % it applies (\specref{let}, \misc{lambda}, \specref{flet}, \macref{do}, etc.
  151. % introduce name bindings; \specref{locally} does not).
  152. % \endlist
  153. %
  154. % %!!!! RPG: I'm tired but this doesn't make sense to me at all.
  155. % This prescription depends on the fact that the \term{scope} of name bindings
  156. % is already well-defined.
  157. % Whether or not a particular declaration affects an initialization form
  158. % (such as for \specref{let} or \specref{let*})
  159. % depends solely on whether it is
  160. % applied to a variable or function name being bound whose \term{scope}
  161. % includes such \term{forms}.
  162. % In this sense, the above specification limits the
  163. % \term{scope} of declarations for name bindings to be exactly the
  164. % \term{scope} of the
  165. % name binding itself.
  166. % There is no ``hoisting'' for declarations in \term{special forms} or
  167. % \term{lambda expressions};
  168. % the only initialization forms affected by a declaration
  169. % are those included indirectly, by the effect, if any, that a
  170. % declaration has on a name binding.
  171. % Thus there is no
  172. % ``hoisting'' of the special declarations in the following example:
  173. %
  174. % % \code
  175. % % (defun bar (x y) ;[1] 1st occurrence of x
  176. % % (let ((old-x x) ;[2] 2nd occurrence of x
  177. % % (x y)) ;[3] 3rd occurrence of x
  178. % % (declare (special x))
  179. % % (list old-x x)))
  180. % % \endcode
  181. % %
  182. % % Laubsch: ?
  183. % % Barmar: Say what [the above] example is supposed to return.
  184. % % RPG: Also, say explicitly which bindings and references are special.
  185. %
  186. % \code
  187. % (let ((x 1)) ;[1] 1st occurrence of x
  188. % (declare (special x)) ;[2] 2nd occurrence of x
  189. % (let ((x 2)) ;[3] 3rd occurrence of x
  190. % (let ((old-x x) ;[4] 4th occurrence of x
  191. % (x 3)) ;[5] 5th occurrence of x
  192. % (declare (special x)) ;[6] 6th occurrence of x
  193. % (list old-x x)))) ;[7] 7th occurrence of x
  194. % \EV (2 3)
  195. % \endcode
  196. %
  197. % The first occurrence of \f{x} \term{establishes} a \term{dynamic binding}
  198. % of \f{x} because of the \declref{special} \term{declaration} for \f{x}
  199. % in the second line. The third occurrence of \f{x} \term{establishes} a
  200. % \term{lexical binding} of \f{x} (because there is no \declref{special}
  201. % \term{declaration} in the corresponding \macref{let} \term{form}).
  202. % The fourth occurrence of \f{x} \term{x} is a reference to the
  203. % \term{lexical binding} of \f{x} established in the third line.
  204. % The fifth occurrence of \f{x} \term{establishes} a \term{dynamic binding}
  205. % of \term{x} for the body of the \macref{let} \term{form} that begins on
  206. % that line because of the \declref{special} \term{declaration} for \f{x}
  207. % in the sixth line. The reference to \f{x} in the fourth line is not
  208. % affected by the \declref{special} \term{declaration} in the sixth line
  209. % because that reference is not within the ``would-be \term{lexical scope}''
  210. % of the \term{variable} \f{x} in the fifth line. The reference to \f{x}
  211. % in the seventh line is a reference to the \term{dynamic binding} of \term{x}
  212. % \term{established} in the fifth line.
  213. %
  214. % Those declarations not correlated with any name \term{binding} do
  215. % not cover any of the initialization forms; their \term{scope} only
  216. % includes the body as well as any ``stepper'' or result forms. In a
  217. % sense, the above specification limits the \term{scope} of these
  218. % kinds of declarations to be the same as an arbitrary name
  219. % \term{binding} in a \specref{let}, \specref{flet},
  220. % \issue{WITH-ADDED-METHODS:DELETE}
  221. % %\macref{with-added-methods},
  222. % \endissue{WITH-ADDED-METHODS:DELETE}
  223. % \issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
  224. % %\specref{generic-flet},
  225. % %\specref{generic-labels},
  226. % \endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
  227. % and \specref{labels}
  228. % \term{form}.
  229. % %[See also the issue DECLARE-TYPE-FREE.]
  230. %
  231. % In the following:\idxref{notinline}
  232. %
  233. % \code
  234. % (lambda (&optional (x (foo 1))) ;[1]
  235. % (declare (notinline foo)) ;[2]
  236. % (foo x)) ;[3]
  237. % \endcode
  238. %
  239. % the \term{call} to \f{foo} in the first line might be
  240. % compiled inline even though the \term{call} to \f{foo} in
  241. % the third line must not be. This is because
  242. % the \declref{notinline} \term{declaration}
  243. % for \f{foo} in the second line applies only to the body on the
  244. % third line. In order to suppress inlining for both \term{calls},
  245. % one might write:\idxref{notinline}
  246. %
  247. % \code
  248. % (locally (declare (notinline foo)) ;[1]
  249. % (lambda (&optional (x (foo 1))) ;[2]
  250. % (foo x))) ;[3]
  251. % \endcode
  252. %
  253. % or, alternatively:\idxref{notinline}
  254. %
  255. % \code
  256. % (lambda (&optional ;[1]
  257. % (x (locally (declare (notinline foo)) ;[2]
  258. % (foo 1)))) ;[3]
  259. % (declare (notinline foo)) ;[4]
  260. % (foo x)) ;[5]
  261. % \endcode
  262. %
  263. % In the following:\idxterm{type declaration}
  264. %
  265. % \code
  266. % (defun foo (x) ;[1]
  267. % (if (typep x 'integer) ;[2]
  268. % (list (let ((y (+ x 42))) ;[3]
  269. % (declare (fixnum x y)) ;[4]
  270. % y) ;[5]
  271. % (+ x 42)) ;[6]
  272. % `(foo ,x))) ;[7]
  273. % \endcode
  274. %
  275. % \f{x} is not initially (\eg in the first line) known to be a \term{fixnum}
  276. % since the scope of the \declref{fixnum} \term{declaration} for \f{x} in the fourth line
  277. % covers only the body of the \macref{let} form in the fifth line, but not the
  278. % \term{initialization form} for \f{y} in the third line. The compiler can assume that
  279. % \f{x} is not greater than the value of \f{(- most-positive-fixnum 42)} because \f{y}
  280. % has been declared to be a \term{fixnum} in the fourth line.
  281. % Even so, neither the \term{call} to \funref{+} in the third line
  282. % nor the one in the sixth line
  283. % may be optimized into \term{calls} to \term{implementation-dependent}
  284. % \term{fixnum}-only arithmetic operators,
  285. % just in case the call to \f{foo} looks something like:
  286. %
  287. % \code
  288. % (foo (- most-negative-fixnum 1))
  289. % \endcode
  290. %
  291. % In following:\idxterm{type declaration}
  292. %
  293. % \code
  294. % (defun foo (x) ;[1]
  295. % (if (typep x 'integer) ;[2]
  296. % (list (let ((y (+ x 42))) ;[3]
  297. % (declare (fixnum x)) ;[4]
  298. % x ;[5]
  299. % y) ;[6]
  300. % (+ x 42)) ;[7]
  301. % `(foo ,x))) ;[8]
  302. % \endcode
  303. %
  304. % \f{x} can be determined to be a \term{fixnum} throughout
  305. % the third through seventh lines, but only by inference
  306. % from the fact that the reference to \f{x} in the fifth line
  307. % (the only reference to which the \declref{fixnum} \term{declaration}
  308. % in the fourth line applies)
  309. % is known to be a \term{fixnum}. Since the compiler is capable of detecting that
  310. % there are no \term{assignments} to \f{x}, it may reason that \f{x} is a \term{fixnum}
  311. % throughout even though there is no explicit \term{declaration}.
  312. % However, since there is no \declref{fixnum} \term{declaration} for \f{y} (as there
  313. % was in the previous example), the compiler may not assume that the result of the
  314. % addition in the third line is a \term{fixnum}. Therefore,
  315. % neither \term{call} to \funref{+} (one the third and seventh lines)
  316. % may be optimized into \term{calls} to \term{implementation-dependent}
  317. % \term{fixnum}-only arithmetic operators,
  318. % just in case the call to \term{foo} looks something like:
  319. %
  320. % \code
  321. % (foo most-positive-fixnum)
  322. % \endcode
  323. %
  324. % However, in the following:\idxterm{type declaration}
  325. %
  326. % \code
  327. % (defun foo (x) ;[1]
  328. % (if (typep x 'integer) ;[2]
  329. % (list (let ((y (the fixnum (+ x 42)))) ;[3]
  330. % (declare (fixnum x y)) ;[4]
  331. % x ;[5]
  332. % y) ;[6]
  333. % (+ x 42)) ;[7]
  334. % `(foo ,x))) ;[8]
  335. % \endcode
  336. %
  337. % the compiler can infer that \f{x} is a \term{fixnum} throughout
  338. % the third through seventh lines by reasoning similar
  339. % to that for the previous example. Further, it can infer that the result of the
  340. % call to \funref{+} in the third line is a \term{fixnum} because of the \declref{fixnum}
  341. % \term{declaration} in the fourth line. Consequently, that \term{call} to \funref{+}
  342. % may be optimized into a \term{call} to an \term{implementation-dependent}
  343. % \term{fixnum}-only arithmetic operator. Further, the \term{call} to \funref{+}
  344. % in the seventh line may be similarly optimized because the compiler can prove that
  345. % the \f{x} in that line has the same \term{value}.
  346. %
  347. % \endissue{DECLARATION-SCOPE:NO-HOISTING}
  348. \issue{DECLARATION-SCOPE:NO-HOISTING}
  349. \issue{WITH-ADDED-METHODS:DELETE}
  350. \issue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
  351. The \term{scope} of a \term{bound declaration} is the same as the
  352. %% Per X3J13. -kmp 5-Oct-93
  353. %\term{scope}
  354. \term{lexical scope}
  355. of the \term{binding} to which it applies;
  356. %% Added per X3J13. -kmp 5-Oct-93
  357. for \term{special variables},
  358. this means the \term{scope} that the \term{binding}
  359. would have had had it been a \term{lexical binding}.
  360. Unless explicitly stated otherwise, the \term{scope} of a
  361. \term{free declaration} includes only the body \term{subforms} of
  362. the \term{form} at whose head it appears, and no other \term{subforms}.
  363. The \term{scope} of \term{free declarations} specifically does not
  364. include \term{initialization forms} for \term{bindings} established
  365. by the \term{form} containing the \term{declarations}.
  366. Some \term{iteration forms} include step, end-test, or result
  367. \term{subforms} that are also included in the \term{scope}
  368. of \term{declarations} that appear in the \term{iteration form}.
  369. Specifically, the \term{iteration forms} and \term{subforms} involved
  370. are:
  371. \beginlist
  372. \item{\bull} \macref{do}, \macref{do*}:
  373. \param{step-forms}, \param{end-test-form}, and \param{result-forms}.
  374. \item{\bull} \macref{dolist}, \macref{dotimes}:
  375. \param{result-form}
  376. \item{\bull} \macref{do-all-symbols}, \macref{do-external-symbols}, \macref{do-symbols}:
  377. \param{result-form}
  378. \endlist
  379. \endissue{GENERIC-FLET-POORLY-DESIGNED:DELETE}
  380. \endissue{WITH-ADDED-METHODS:DELETE}
  381. \beginsubsubsection{Examples of Declaration Scope}
  382. Here is an example illustrating the \term{scope} of \term{bound declarations}.
  383. \code
  384. (let ((x 1)) ;[1] 1st occurrence of x
  385. (declare (special x)) ;[2] 2nd occurrence of x
  386. (let ((x 2)) ;[3] 3rd occurrence of x
  387. (let ((old-x x) ;[4] 4th occurrence of x
  388. (x 3)) ;[5] 5th occurrence of x
  389. (declare (special x)) ;[6] 6th occurrence of x
  390. (list old-x x)))) ;[7] 7th occurrence of x
  391. \EV (2 3)
  392. \endcode
  393. The first occurrence of \f{x} \term{establishes} a \term{dynamic binding}
  394. of \f{x} because of the \declref{special} \term{declaration} for \f{x}
  395. in the second line. The third occurrence of \f{x} \term{establishes} a
  396. \term{lexical binding} of \f{x} (because there is no \declref{special}
  397. \term{declaration} in the corresponding \macref{let} \term{form}).
  398. The fourth occurrence of \f{x} \term{x} is a reference to the
  399. \term{lexical binding} of \f{x} established in the third line.
  400. The fifth occurrence of \f{x} \term{establishes} a \term{dynamic binding}
  401. of \term{x} for the body of the \macref{let} \term{form} that begins on
  402. that line because of the \declref{special} \term{declaration} for \f{x}
  403. in the sixth line. The reference to \f{x} in the fourth line is not
  404. affected by the \declref{special} \term{declaration} in the sixth line
  405. because that reference is not within the ``would-be \term{lexical scope}''
  406. of the \term{variable} \f{x} in the fifth line. The reference to \f{x}
  407. in the seventh line is a reference to the \term{dynamic binding} of \term{x}
  408. \term{established} in the fifth line.
  409. Here is another example, to illustrate the \term{scope} of a
  410. \term{free declaration}. In the following:
  411. \code
  412. (lambda (&optional (x (foo 1))) ;[1]
  413. (declare (notinline foo)) ;[2]
  414. (foo x)) ;[3]
  415. \endcode
  416. the \term{call} to \f{foo} in the first line might be
  417. compiled inline even though the \term{call} to \f{foo} in
  418. the third line must not be. This is because
  419. the \declref{notinline} \term{declaration}
  420. for \f{foo} in the second line applies only to the body on the
  421. third line. In order to suppress inlining for both \term{calls},
  422. one might write:
  423. \code
  424. (locally (declare (notinline foo)) ;[1]
  425. (lambda (&optional (x (foo 1))) ;[2]
  426. (foo x))) ;[3]
  427. \endcode
  428. or, alternatively:
  429. \code
  430. (lambda (&optional ;[1]
  431. (x (locally (declare (notinline foo)) ;[2]
  432. (foo 1)))) ;[3]
  433. (declare (notinline foo)) ;[4]
  434. (foo x)) ;[5]
  435. \endcode
  436. Finally, here is an example that shows the \term{scope} of
  437. \term{declarations} in an \term{iteration form}.
  438. \code
  439. (let ((x 1)) ;[1]
  440. (declare (special x)) ;[2]
  441. (let ((x 2)) ;[3]
  442. (dotimes (i x x) ;[4]
  443. (declare (special x))))) ;[5]
  444. \EV 1
  445. \endcode
  446. In this example, the first reference to \f{x} on the fourth line is to
  447. the \term{lexical binding} of \f{x} established on the third line.
  448. However, the second occurrence of \f{x} on the fourth line lies within
  449. the \term{scope} of the \term{free declaration} on the fifth line
  450. (because this is the \param{result-form} of the \macref{dotimes})
  451. and therefore refers to the \term{dynamic binding} of \f{x}.
  452. \endissue{DECLARATION-SCOPE:NO-HOISTING}
  453. \endsubsubsection%{Examples of Declaration Scope}
  454. \endSubsection%{Declaration Scope}