Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: docs/language/dartLangSpec.tex

Issue 1190453003: Mixin DEP changes (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Explictly disallow mixing in unsubclassable classes Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 \documentclass{article} 1 \documentclass{article}
2 \usepackage{epsfig} 2 \usepackage{epsfig}
3 \usepackage{color} 3 \usepackage{color}
4 \usepackage{dart} 4 \usepackage{dart}
5 \usepackage{bnf} 5 \usepackage{bnf}
6 \usepackage{hyperref} 6 \usepackage{hyperref}
7 \usepackage{lmodern} 7 \usepackage{lmodern}
8 \newcommand{\code}[1]{{\sf #1}} 8 \newcommand{\code}[1]{{\sf #1}}
9 \title{Dart Programming Language Specification \\ 9 \title{Dart Programming Language Specification (Mixin DEP)\\
10 {\large Version 1.10}} 10 {\large Version 1.10}}
11 11
12 % For information about Location Markers (and in particular the 12 % For information about Location Markers (and in particular the
13 % commands \LMHash and \LMLabel), see the long comment at the 13 % commands \LMHash and \LMLabel), see the long comment at the
14 % end of this file. 14 % end of this file.
15 15
16 \begin{document} 16 \begin{document}
17 \maketitle 17 \maketitle
18 \tableofcontents 18 \tableofcontents
19 19
(...skipping 1985 matching lines...) Expand 10 before | Expand all | Expand 10 after
2005 % Need warnings if overrider conflicts with overriddee either because signatures are incompatible or because done is a method and one is a getter or setter. 2005 % Need warnings if overrider conflicts with overriddee either because signatures are incompatible or because done is a method and one is a getter or setter.
2006 2006
2007 \section{Mixins} 2007 \section{Mixins}
2008 \LMLabel{mixins} 2008 \LMLabel{mixins}
2009 2009
2010 2010
2011 \LMHash{} 2011 \LMHash{}
2012 A mixin describes the difference between a class and its superclass. A mixin is always derived from an existing class declaration. 2012 A mixin describes the difference between a class and its superclass. A mixin is always derived from an existing class declaration.
2013 2013
2014 \LMHash{} 2014 \LMHash{}
2015 It is a compile-time error if a declared or derived mixin refers to \SUPER{}. It is a compile-time error if a declared or derived mixin explicitly declares a co nstructor. It is a compile-time error if a mixin is derived from a class whose s uperclass is not \code{Object}. 2015 It is a compile-time error if a declared or derived mixin explicitly declares a constructor.
2016 2016
2017 \rationale{ 2017 \rationale{
2018 These restrictions are temporary. We expect to remove them in later versions of Dart. 2018 This restriction is temporary. We expect to remove it in later versions of Dart .
2019
2020 The restriction on the use of \SUPER{} avoids the problem of rebinding \SUPER{} when the mixin is bound to difference superclasses.
2021 2019
2022 The restriction on constructors simplifies the construction of mixin application s because the process of creating instances is simpler. 2020 The restriction on constructors simplifies the construction of mixin application s because the process of creating instances is simpler.
2023
2024 The restriction on the superclass means that the type of a class from which a m ixin is derived is always implemented by any class that mixes it in. This allows us to defer the question of whether and how to express the type of the mixin in dependently of its superclass and super interface types.
2025
2026 Reasonable answers exist for all these issues, but their implementation is non-t rivial.
2027 } 2021 }
2028 2022
2029 \subsection{Mixin Application} 2023 \subsection{Mixin Application}
2030 \LMLabel{mixinApplication} 2024 \LMLabel{mixinApplication}
2031 2025
2032 \LMHash{} 2026 \LMHash{}
2033 A mixin may be applied to a superclass, yielding a new class. Mixin application occurs when a mixin is mixed into a class declaration via its \WITH{} clause. T he mixin application may be used to extend a class per section (\ref{classes}); alternately, a class may be defined as a mixin application as described in this section. It is a compile-time error if the \WITH{} clause of a mixin applicati on $C$ includes a deferred type expression. 2027 A mixin may be applied to a superclass, yielding a new class. Mixin application occurs when a mixin is mixed into a class declaration via its \WITH{} clause. T he mixin application may be used to extend a class per section (\ref{classes}); alternately, a class may be defined as a mixin application as described in this section. It is a compile-time error if the \WITH{} clause of a mixin applicati on $C$ includes a deferred type expression.
2034 2028
2035 2029
2036 \begin{grammar} 2030 \begin{grammar}
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2070 2064
2071 \commentary{ 2065 \commentary{
2072 If, for example, $M$ declares an instance member $im$ whose type is at odds with the type of a member of the same name in $S$, this will result in a static warn ing just as if we had defined $K$ by means of an ordinary class declaration exte nding $S$, with a body that included $im$. 2066 If, for example, $M$ declares an instance member $im$ whose type is at odds with the type of a member of the same name in $S$, this will result in a static warn ing just as if we had defined $K$ by means of an ordinary class declaration exte nding $S$, with a body that included $im$.
2073 2067
2074 } 2068 }
2075 2069
2076 \LMHash{} 2070 \LMHash{}
2077 The effect of a class definition of the form \code{\CLASS{} $C$ = $M$; } or the form 2071 The effect of a class definition of the form \code{\CLASS{} $C$ = $M$; } or the form
2078 \code{\CLASS{} $C<T_1, \ldots, T_n>$ = $M$; } in library $L$ is to introduce t he name $C$ into the scope of $L$, bound to the class (\ref{classes}) defined by the mixin application $M$. The name of the class is also set to $C$. Iff the c lass is prefixed by the built-in identifier \ABSTRACT{}, the class being defined is an abstract class. 2072 \code{\CLASS{} $C<T_1, \ldots, T_n>$ = $M$; } in library $L$ is to introduce t he name $C$ into the scope of $L$, bound to the class (\ref{classes}) defined by the mixin application $M$. The name of the class is also set to $C$. Iff the c lass is prefixed by the built-in identifier \ABSTRACT{}, the class being defined is an abstract class.
2079 2073
2074 Let $M_A$ be a mixin derived from a class $M$ with direct superclass $S_{static }$.
2075
2076 Let $A$ be an application of $M_A$. It is a static warning if the superclass of $A$ is not a subtype of $S_{static}$.
2077
2078 Let $C$ be a class declaration that includes $M_A$ in a with clause. It is a sta tic warning if $C$ does not implement, directly or indirectly, all the direct su perinterfaces of $M$.
2079
2080 2080
2081 \subsection{Mixin Composition} 2081 \subsection{Mixin Composition}
2082 \LMLabel{mixinComposition} 2082 \LMLabel{mixinComposition}
2083 2083
2084 \rationale{ 2084 \rationale{
2085 Dart does not directly support mixin composition, but the concept is useful when defining how the superclass of a class with a mixin clause is created. 2085 Dart does not directly support mixin composition, but the concept is useful when defining how the superclass of a class with a mixin clause is created.
2086 } 2086 }
2087 2087
2088 \LMHash{} 2088 \LMHash{}
2089 The {\em composition of two mixins}, $M_1<T_1 \ldots T_{k_{M_1}}>$ and $M_2<U_1 \ldots U_{k_{M_2}}>$, written $M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1 \ldots U_ {k_{M_2}}>$ defines an anonymous mixin such that for any class $S<V_1 \ldots V_{ k_S}>$, the application of 2089 The {\em composition of two mixins}, $M_1<T_1 \ldots T_{k_{M_1}}>$ and $M_2<U_1 \ldots U_{k_{M_2}}>$, written $M_1<T_1 \ldots T_{k_{M_1}}> * M_2<U_1 \ldots U_ {k_{M_2}}>$ defines an anonymous mixin such that for any class $S<V_1 \ldots V_{ k_S}>$, the application of
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
2519 The reserved word \NULL{} denotes the {\em null object}. 2519 The reserved word \NULL{} denotes the {\em null object}.
2520 %\Q{Any methods, such as \code{isNull}?} 2520 %\Q{Any methods, such as \code{isNull}?}
2521 2521
2522 \begin{grammar} 2522 \begin{grammar}
2523 {\bf nullLiteral:} 2523 {\bf nullLiteral:}
2524 \NULL{} 2524 \NULL{}
2525 . 2525 .
2526 \end{grammar} 2526 \end{grammar}
2527 2527
2528 \LMHash{} 2528 \LMHash{}
2529 The null object is the sole instance of the built-in class \code{Null}. Attempti ng to instantiate \code{Null} causes a run-time error. It is a compile-time erro r for a class to attempt to extend or implement \code{Null}. 2529 The null object is the sole instance of the built-in class \code{Null}. Attempti ng to instantiate \code{Null} causes a run-time error. It is a compile-time erro r for a class to attempt to extend, mix in or implement \code{Null}.
2530 Invoking a method on \NULL{} yields a \code{NoSuchMethodError} unless the metho d is explicitly implemented by class \code{Null}. 2530 Invoking a method on \NULL{} yields a \code{NoSuchMethodError} unless the metho d is explicitly implemented by class \code{Null}.
2531 2531
2532 \LMHash{} 2532 \LMHash{}
2533 The static type of \NULL{} is $\bot$. 2533 The static type of \NULL{} is $\bot$.
2534 2534
2535 \rationale{The decision to use $\bot$ instead of \code{Null} allows \NULL{} to b e be assigned everywhere without complaint by the static checker. 2535 \rationale{The decision to use $\bot$ instead of \code{Null} allows \NULL{} to b e be assigned everywhere without complaint by the static checker.
2536 } 2536 }
2537 2537
2538 2538
2539 \subsection{Numbers} 2539 \subsection{Numbers}
(...skipping 29 matching lines...) Expand all
2569 If a numeric literal begins with the prefix `0x' or `0X', it denotes the hexadec imal integer represented by the part of the literal following `0x' (respectively `0X'). Otherwise, if the numeric literal does not include a decimal point it d enotes a decimal integer. Otherwise, the numeric literal denotes a 64 bit doub le precision floating point number as specified by the IEEE 754 standard. 2569 If a numeric literal begins with the prefix `0x' or `0X', it denotes the hexadec imal integer represented by the part of the literal following `0x' (respectively `0X'). Otherwise, if the numeric literal does not include a decimal point it d enotes a decimal integer. Otherwise, the numeric literal denotes a 64 bit doub le precision floating point number as specified by the IEEE 754 standard.
2570 2570
2571 \LMHash{} 2571 \LMHash{}
2572 In principle, the range of integers supported by a Dart implementations is unlim ited. In practice, it is limited by available memory. Implementations may also b e limited by other considerations. 2572 In principle, the range of integers supported by a Dart implementations is unlim ited. In practice, it is limited by available memory. Implementations may also b e limited by other considerations.
2573 2573
2574 \commentary{ 2574 \commentary{
2575 For example, implementations may choose to limit the range to facilitate efficie nt compilation to Javascript. These limitations should be relaxed as soon as tec hnologically feasible. 2575 For example, implementations may choose to limit the range to facilitate efficie nt compilation to Javascript. These limitations should be relaxed as soon as tec hnologically feasible.
2576 } 2576 }
2577 2577
2578 \LMHash{} 2578 \LMHash{}
2579 It is a compile-time error for a class to attempt to extend or implement \code{i nt}. It is a compile-time error for a class to attempt to extend or implement \c ode{double}. It is a compile-time error for any type other than the types \code{ int} and \code{double} to attempt to extend or implement \code{num}. 2579 It is a compile-time error for a class to attempt to extend, mix in or implement \code{int}. It is a compile-time error for a class to attempt to extend, mix in or implement \code{double}. It is a compile-time error for any type other than the types \code{int} and \code{double} to attempt to extend, mix in or implement \code{num}.
2580 2580
2581 \LMHash{} 2581 \LMHash{}
2582 An {\em integer literal} is either a hexadecimal integer literal or a decimal i nteger literal. Invoking the getter \code{runtimeType} on an integer literal ret urns the \code{Type} object that is the value of the expression \code{int}. The static type of an integer literal is \code{int}. 2582 An {\em integer literal} is either a hexadecimal integer literal or a decimal i nteger literal. Invoking the getter \code{runtimeType} on an integer literal ret urns the \code{Type} object that is the value of the expression \code{int}. The static type of an integer literal is \code{int}.
2583 2583
2584 \LMHash{} 2584 \LMHash{}
2585 A {\em literal double} is a numeric literal that is not an integer literal. Invo king the getter \code{runtimeType} on a literal double returns the \code{Type} o bject that is the value of the expression \code{double}. 2585 A {\em literal double} is a numeric literal that is not an integer literal. Invo king the getter \code{runtimeType} on a literal double returns the \code{Type} o bject that is the value of the expression \code{double}.
2586 The static type of a literal double is \code{double}. 2586 The static type of a literal double is \code{double}.
2587 2587
2588 \subsection{Booleans} 2588 \subsection{Booleans}
2589 \LMLabel{booleans} 2589 \LMLabel{booleans}
2590 2590
2591 \LMHash{} 2591 \LMHash{}
2592 The reserved words \TRUE{} and \FALSE{} denote objects that represent the boolea n values true and false respectively. They are the {\em boolean literals}. 2592 The reserved words \TRUE{} and \FALSE{} denote objects that represent the boolea n values true and false respectively. They are the {\em boolean literals}.
2593 2593
2594 \begin{grammar} 2594 \begin{grammar}
2595 {\bf booleanLiteral:}\TRUE{}; 2595 {\bf booleanLiteral:}\TRUE{};
2596 \FALSE{} 2596 \FALSE{}
2597 . 2597 .
2598 \end{grammar} 2598 \end{grammar}
2599 2599
2600 \LMHash{} 2600 \LMHash{}
2601 Both \TRUE{} and \FALSE{} implement the built-in class \code{bool}. It is a co mpile-time error for a class to attempt to extend or implement\code{ bool}. 2601 Both \TRUE{} and \FALSE{} implement the built-in class \code{bool}. It is a co mpile-time error for a class to attempt to extend, mix in or implement\code{ boo l}.
2602 2602
2603 \commentary{ 2603 \commentary{
2604 It follows that the two boolean literals are the only two instances of \code{boo l}. 2604 It follows that the two boolean literals are the only two instances of \code{boo l}.
2605 } 2605 }
2606 2606
2607 \LMHash{} 2607 \LMHash{}
2608 Invoking the getter \code{runtimeType} on a boolean literal returns the \code{Ty pe} object that is the value of the expression \code{bool}. The static type of a boolean literal is \code{bool}. 2608 Invoking the getter \code{runtimeType} on a boolean literal returns the \code{Ty pe} object that is the value of the expression \code{bool}. The static type of a boolean literal is \code{bool}.
2609 2609
2610 \subsubsection{Boolean Conversion} 2610 \subsubsection{Boolean Conversion}
2611 \LMLabel{booleanConversion} 2611 \LMLabel{booleanConversion}
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
2799 stringInterpolation 2799 stringInterpolation
2800 . 2800 .
2801 2801
2802 {\bf NEWLINE:}$\backslash$ n; 2802 {\bf NEWLINE:}$\backslash$ n;
2803 $\backslash$ r 2803 $\backslash$ r
2804 . 2804 .
2805 2805
2806 \end{grammar} 2806 \end{grammar}
2807 2807
2808 \LMHash{} 2808 \LMHash{}
2809 All string literals implement the built-in class \code{String}. It is a compile- time error for a class to attempt to extend or implement \code{String}. Invoking the getter \code{runtimeType} on a string literal returns the \code{Type} objec t that is the value of the expression \code{String}. The static type of a string literal is \code{String}. 2809 All string literals implement the built-in class \code{String}. It is a compile- time error for a class to attempt to extend, mix in or implement \code{String}. Invoking the getter \code{runtimeType} on a string literal returns the \code{Typ e} object that is the value of the expression \code{String}. The static type of a string literal is \code{String}.
2810 2810
2811 \subsubsection{String Interpolation} 2811 \subsubsection{String Interpolation}
2812 \LMLabel{stringInterpolation} 2812 \LMLabel{stringInterpolation}
2813 2813
2814 \LMHash{} 2814 \LMHash{}
2815 It is possible to embed expressions within non-raw string literals, such that th e these expressions are evaluated, and the resulting values are converted into s trings and concatenated with the enclosing string. This process is known as {\em string interpolation}. 2815 It is possible to embed expressions within non-raw string literals, such that th e these expressions are evaluated, and the resulting values are converted into s trings and concatenated with the enclosing string. This process is known as {\em string interpolation}.
2816 2816
2817 \begin{grammar} 2817 \begin{grammar}
2818 {\bf stringInterpolation:}`\$' IDENTIFIER\_NO\_DOLLAR; 2818 {\bf stringInterpolation:}`\$' IDENTIFIER\_NO\_DOLLAR;
2819 `\$' `\{' expression `\}' % could be top level expression, no? 2819 `\$' `\{' expression `\}' % could be top level expression, no?
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after
3726 \LMLabel{lookup} 3726 \LMLabel{lookup}
3727 3727
3728 \subsubsection{Method Lookup} 3728 \subsubsection{Method Lookup}
3729 \LMLabel{methodLookup} 3729 \LMLabel{methodLookup}
3730 3730
3731 \LMHash{} 3731 \LMHash{}
3732 The result of a lookup of a method $m$ in object $o$ with respect to library $L$ is the result of a lookup of method $m$ in class $C$ with respect to library $ L$, where $C$ is the class of $o$. 3732 The result of a lookup of a method $m$ in object $o$ with respect to library $L$ is the result of a lookup of method $m$ in class $C$ with respect to library $ L$, where $C$ is the class of $o$.
3733 3733
3734 \LMHash{} 3734 \LMHash{}
3735 The result of a lookup of method $m$ in class $C$ with respect to library $L$ i s: 3735 The result of a lookup of method $m$ in class $C$ with respect to library $L$ i s:
3736 If $C$ declares a concrete instance method named $m$ that is accessible to $L$, then that method is the result of the lookup. Otherwise, if $C$ has a superclas s $S$, then the result of the lookup is the result of looking up $m$ in $S$ wit h respect to $L$. Otherwise, we say that the method lookup has failed. 3736 If $C$ declares a concrete instance method named $m$ that is accessible to $L$, then that method is the result of the lookup, and we say that the method was {\ em looked up in $C$}. Otherwise, if $C$ has a superclass $S$, then the result of the lookup is the result of looking up $m$ in $S$ with respect to $L$. Otherwi se, we say that the method lookup has failed.
3737 3737
3738 \rationale { 3738 \rationale {
3739 The motivation for skipping abstract members during lookup is largely to allow s moother mixin composition. 3739 The motivation for skipping abstract members during lookup is largely to allow s moother mixin composition.
3740 } 3740 }
3741 3741
3742 3742
3743 \subsubsection{ Getter and Setter Lookup} 3743 \subsubsection{ Getter and Setter Lookup}
3744 \LMLabel{getterAndSetterLookup} 3744 \LMLabel{getterAndSetterLookup}
3745 3745
3746 \LMHash{} 3746 \LMHash{}
3747 The result of a lookup of a getter (respectively setter) $m$ in object $o$ with respect to library $L$ is the result of looking up getter (respectively sette r) $m$ in class $C$ with respect to $L$, where $C$ is the class of $o$. 3747 The result of a lookup of a getter (respectively setter) $m$ in object $o$ with respect to library $L$ is the result of looking up getter (respectively sette r) $m$ in class $C$ with respect to $L$, where $C$ is the class of $o$.
3748 3748
3749 \LMHash{} 3749 \LMHash{}
3750 The result of a lookup of a getter (respectively setter) $m$ in class $C$ with respect to library $L$ is: 3750 The result of a lookup of a getter (respectively setter) $m$ in class $C$ with respect to library $L$ is:
3751 If $C$ declares a concrete instance getter (respectively setter) named $m$ that is accessible to $L$, then that getter (respectively setter) is the result of the lookup. Otherwise, if $C$ has a superclass $S$, then the result of the looku p is the result of looking up getter (respectively setter) $m$ in $S$ with respe ct to $L$. Otherwise, we say that the lookup has failed. 3751 If $C$ declares a concrete instance getter (respectively setter) named $m$ that is accessible to $L$, then that getter (respectively setter) is the result of the lookup, and we say that the getter (respectively setter) was {\em looked up in $C$}. Otherwise, if $C$ has a superclass $S$, then the result of the lookup i s the result of looking up getter (respectively setter) $m$ in $S$ with respect to $L$. Otherwise, we say that the lookup has failed.
3752 3752
3753 \rationale { 3753 \rationale {
3754 The motivation for skipping abstract members during lookup is largely to allow s moother mixin composition. 3754 The motivation for skipping abstract members during lookup is largely to allow s moother mixin composition.
3755 } 3755 }
3756 3756
3757 3757
3758 \subsection{ Top level Getter Invocation} 3758 \subsection{ Top level Getter Invocation}
3759 \LMLabel{topLevelGetterInvocation} 3759 \LMLabel{topLevelGetterInvocation}
3760 3760
3761 \LMHash{} 3761 \LMHash{}
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
3912 3912
3913 \LMHash{} 3913 \LMHash{}
3914 A super method invocation $i$ has the form 3914 A super method invocation $i$ has the form
3915 3915
3916 $\SUPER{}.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$. 3916 $\SUPER{}.m(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k}: a_{n+k})$.
3917 3917
3918 \LMHash{} 3918 \LMHash{}
3919 Evaluation of $i$ proceeds as follows: 3919 Evaluation of $i$ proceeds as follows:
3920 3920
3921 \LMHash{} 3921 \LMHash{}
3922 First, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k} : a_{n+k})$ is evaluated yielding actual argument objects $o_1, \ldots , o_{n+k }$. Let $S$ be the superclass of the immediately enclosing class, and let $f$ be the result of looking up method (\ref{methodLookup}) $m$ in $S$ with respect to the current library $L$. 3922 First, the argument list $(a_1, \ldots , a_n, x_{n+1}: a_{n+1}, \ldots , x_{n+k} : a_{n+k})$ is evaluated yielding actual argument objects $o_1, \ldots , o_{n+k }$. Let $g$ be the method currently executing, and let $C$ be the class in which $g$ was looked up (\ref{methodLookup}). Let $S_{dynamic}$ be the superclass of $C$, and let $f$ be the result of looking up method (\ref{methodLookup}) $m$ in $S_{dynamic}$ with respect to the current library $L$.
3923 Let $p_1 \ldots p_h$ be the required parameters of $f$, let $p_1 \ldots p_m$ be the positional parameters of $f$ and let $p_{h+1}, \ldots, p_{h+l}$ be the opti onal parameters declared by $f$. 3923 Let $p_1 \ldots p_h$ be the required parameters of $f$, let $p_1 \ldots p_m$ be the positional parameters of $f$ and let $p_{h+1}, \ldots, p_{h+l}$ be the opti onal parameters declared by $f$.
3924 3924
3925 \LMHash{} 3925 \LMHash{}
3926 If $n < h$, or $n > m$, the method lookup has failed. Furthermore, each $x_i, n +1 \le i \le n+k$, must have a corresponding named parameter in the set $\{p_{m +1}, \ldots, p_{h+l}\}$ or the method lookup also fails. Otherwise method looku p has succeeded. 3926 If $n < h$, or $n > m$, the method lookup has failed. Furthermore, each $x_i, n +1 \le i \le n+k$, must have a corresponding named parameter in the set $\{p_{m +1}, \ldots, p_{h+l}\}$ or the method lookup also fails. Otherwise method looku p has succeeded.
3927 3927
3928 \LMHash{} 3928 \LMHash{}
3929 If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{ } bound to the current value of \THIS{}. The value of $i$ is the value returned after $f$ is executed. 3929 If the method lookup succeeded, the body of $f$ is executed with respect to the bindings that resulted from the evaluation of the argument list, and with \THIS{ } bound to the current value of \THIS{}. The value of $i$ is the value returned after $f$ is executed.
3930 3930
3931 \LMHash{} 3931 \LMHash{}
3932 If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $S$ with respect to $L$. If the getter loo kup succeeded, let $v_g$ be the value of the getter invocation $\SUPER{}.m$. The n the value of $i$ is the result of invoking 3932 If the method lookup has failed, then let $g$ be the result of looking up getter (\ref{getterAndSetterLookup}) $m$ in $S_{dynamic}$ with respect to $L$. If the getter lookup succeeded, let $v_g$ be the value of the getter invocation $\SUPER {}.m$. Then the value of $i$ is the result of invoking
3933 the static method \code{Function.apply()} with arguments $v.g, [o_1, \ldots , o_ n], \{x_{n+1}: o_{n+1}, \ldots , x_{n+k}: o_{n+k}\}$. 3933 the static method \code{Function.apply()} with arguments $v_g, [o_1, \ldots , o_ n], \{x_{n+1}: o_{n+1}, \ldots , x_{n+k}: o_{n+k}\}$.
3934 3934
3935 \LMHash{} 3935 \LMHash{}
3936 If getter lookup has also failed, then a new instance $im$ of the predefined c lass \code{Invocation} is created, such that : 3936 If getter lookup has also failed, then a new instance $im$ of the predefined c lass \code{Invocation} is created, such that :
3937 \begin{itemize} 3937 \begin{itemize}
3938 \item \code{im.isMethod} evaluates to \code{\TRUE{}}. 3938 \item \code{im.isMethod} evaluates to \code{\TRUE{}}.
3939 \item \code{im.memberName} evaluates to the symbol \code{m}. 3939 \item \code{im.memberName} evaluates to the symbol \code{m}.
3940 \item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o_1, \ldots, o_n$]}. 3940 \item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o_1, \ldots, o_n$]}.
3941 \item \code{im.namedArguments} evaluates to an immutable map with the same keys and values as \code{\{$x_{n+1}: o_{n+1}, \ldots, x_{n+k} : o_{n+k}$\}}. 3941 \item \code{im.namedArguments} evaluates to an immutable map with the same keys and values as \code{\{$x_{n+1}: o_{n+1}, \ldots, x_{n+k} : o_{n+k}$\}}.
3942 \end{itemize} 3942 \end{itemize}
3943 Then the method \code{noSuchMethod()} is looked up in $S$ and invoked on \THIS{} with argument $im$, and the result of this invocation is the result of evaluati ng $i$. However, if the implementation found cannot be invoked with a single pos itional argument, the implementation of \code{noSuchMethod()} in class \code{Ob ject} is invoked on \THIS{} with argument $im'$, where $im'$ is an instance of \ code{Invocation} such that : 3943 Then the method \code{noSuchMethod()} is looked up in $S_{dynamic}$ and invoked on \THIS{} with argument $im$, and the result of this invocation is the result o f evaluating $i$. However, if the implementation found cannot be invoked with a single positional argument, the implementation of \code{noSuchMethod()} in clas s \code{Object} is invoked on \THIS{} with argument $im'$, where $im'$ is an ins tance of \code{Invocation} such that :
3944 \begin{itemize} 3944 \begin{itemize}
3945 \item \code{im'.isMethod} evaluates to \code{\TRUE{}}. 3945 \item \code{im'.isMethod} evaluates to \code{\TRUE{}}.
3946 \item \code{im'.memberName} evaluates to \code{\#noSuchMethod}. 3946 \item \code{im'.memberName} evaluates to \code{\#noSuchMethod}.
3947 \item \code{im'.positionalArguments} evaluates to an immutable list whose sole e lement is $im$. 3947 \item \code{im'.positionalArguments} evaluates to an immutable list whose sole e lement is $im$.
3948 \item \code{im'.namedArguments} evaluates to the value of \code{\CONST{} \{\}}. 3948 \item \code{im'.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
3949 \end{itemize} 3949 \end{itemize}
3950 3950
3951 and the result of this latter invocation is the result of evaluating $i$. 3951 and the result of this latter invocation is the result of evaluating $i$.
3952 3952
3953 3953
3954 \LMHash{} 3954 \LMHash{}
3955 It is a compile-time error if a super method invocation occurs in a top-level fu nction or variable initializer, in an instance variable initializer or initializ er list, in class \code{Object}, in a factory constructor or in a static method or variable initializer. 3955 It is a compile-time error if a super method invocation occurs in a top-level fu nction or variable initializer, in an instance variable initializer or initializ er list, in class \code{Object}, in a factory constructor or in a static method or variable initializer.
3956 3956
3957 \LMHash{} 3957 \LMHash{}
3958 It is a static type warning if $S$ does not have an accessible (\ref{privacy}) i nstance member named $m$ unless $S$ or a superinterface of $S$ is annotated with an annotation denoting a constant identical to the constant \code{@proxy} defin ed in \code{dart:core}. If $S.m$ exists, it is a static type warning if the typ e $F$ of $S.m$ may not be assigned to a function type. If $S.m$ does not exist, or if $F$ is not a function type, the static type of $i$ is \DYNAMIC{}; otherwis e the static type of $i$ is the declared return type of $F$. 3958 Let $S_{static}$ be the superclass of the immediately enclosing class. It is a s tatic type warning if $S_{static}$ does not have an accessible (\ref{privacy}) i nstance member named $m$ unless $S_{static}$ or a superinterface of $S_{static}$ is annotated with an annotation denoting a constant identical to the constant \ code{@proxy} defined in \code{dart:core}. If $S_{static}.m$ exists, it is a sta tic type warning if the type $F$ of $S_{static}.m$ may not be assigned to a func tion type. If $S_{static}.m$ does not exist, or if $F$ is not a function type, t he static type of $i$ is \DYNAMIC{}; otherwise the static type of $i$ is the dec lared return type of $F$.
3959 % The following is not needed because it is specified in 'Binding Actuals to For mals" 3959 % The following is not needed because it is specified in 'Binding Actuals to For mals"
3960 %Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning i f $F$ is not a supertype of $(T_1, \ldots, t_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_ {n+k}$ $x_{n+k}\}) \to \bot$. 3960 %Let $T_i$ be the static type of $a_i, i \in 1 .. n+k$. It is a static warning i f $F$ is not a supertype of $(T_1, \ldots, t_n, \{T_{n+1}$ $x_{n+1}, \ldots, T_ {n+k}$ $x_{n+k}\}) \to \bot$.
3961 3961
3962 3962
3963 3963
3964 3964
3965 \subsubsection{Sending Messages} 3965 \subsubsection{Sending Messages}
3966 \LMLabel{sendingMessages} 3966 \LMLabel{sendingMessages}
3967 3967
3968 \LMHash{} 3968 \LMHash{}
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
4063 \end{itemize} 4063 \end{itemize}
4064 4064
4065 4065
4066 \subsubsection{Super Getter Access and Method Closurization} 4066 \subsubsection{Super Getter Access and Method Closurization}
4067 \LMLabel{superGetterAccessAndMethodClosurization} 4067 \LMLabel{superGetterAccessAndMethodClosurization}
4068 4068
4069 \LMHash{} 4069 \LMHash{}
4070 Evaluation of a property extraction $i$ of the form $\SUPER.m$ proceeds as follo ws: 4070 Evaluation of a property extraction $i$ of the form $\SUPER.m$ proceeds as follo ws:
4071 4071
4072 \LMHash{} 4072 \LMHash{}
4073 Let $S$ be the superclass of the immediately enclosing class. Let $f$ be the re sult of looking up method $m$ in $S$ with respect to the current library $L$. I f method lookup succeeds then $i$ evaluates to the closurization of method $f$ w ith respect to superclass $S$ (\ref{superClosurization}). 4073 Let $g$ be the method currently executing, and let $C$ be the class in which $g$ was looked up. Let $S_{dynamic}$ be the superclass of $C$. Let $f$ be the resu lt of looking up method $m$ in $S_{dynamic}$ with respect to the current library $L$. If method lookup succeeds then $i$ evaluates to the closurization of meth od $f$ with respect to superclass $S_{dynamic}$ (\ref{superClosurization}).
4074 4074
4075 \LMHash{} 4075 \LMHash{}
4076 Otherwise, $i$ is a getter invocation. Let $f$ be the result of looking up ge tter $m$ in $S$ with respect to $L$. The body of $f$ is executed with \THIS{} bound to the current value of \THIS{}. The value of $i$ is the result returne d by the call to the getter function. 4076 Otherwise, $i$ is a getter invocation. Let $f$ be the result of looking up ge tter $m$ in $S_{dynamic}$ with respect to $L$. The body of $f$ is executed wi th \THIS{} bound to the current value of \THIS{}. The value of $i$ is the resu lt returned by the call to the getter function.
4077 4077
4078 \LMHash{} 4078 \LMHash{}
4079 If the getter lookup has failed, then a new instance $im$ of the predefined cla ss \code{Invocation} is created, such that : 4079 If the getter lookup has failed, then a new instance $im$ of the predefined cla ss \code{Invocation} is created, such that :
4080 \begin{itemize} 4080 \begin{itemize}
4081 \item \code{im.isGetter} evaluates to \code{\TRUE{}}. 4081 \item \code{im.isGetter} evaluates to \code{\TRUE{}}.
4082 \item \code{im.memberName} evaluates to the symbol \code{m}. 4082 \item \code{im.memberName} evaluates to the symbol \code{m}.
4083 \item \code{im.positionalArguments} evaluates to the value of \code{\CONST{} []} . 4083 \item \code{im.positionalArguments} evaluates to the value of \code{\CONST{} []} .
4084 \item \code{im.namedArguments} evaluates to the value of \code{\CONST{} \{\}}. 4084 \item \code{im.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
4085 \end{itemize} 4085 \end{itemize}
4086 Then the method \code{noSuchMethod()} is looked up in $S$ and invoked with argu ment $im$, and the result of this invocation is the result of evaluating $i$. Ho wever, if the implementation found cannot be invoked with a single positional ar gument, the implementation of \code{noSuchMethod()} in class \code{Object} is i nvoked on \THIS{} with argument $im'$, where $im'$ is an instance of \code{Invoc ation} such that : 4086 Then the method \code{noSuchMethod()} is looked up in $S_{dynamic}$ and invoked with argument $im$, and the result of this invocation is the result of evaluati ng $i$. However, if the implementation found cannot be invoked with a single pos itional argument, the implementation of \code{noSuchMethod()} in class \code{Ob ject} is invoked on \THIS{} with argument $im'$, where $im'$ is an instance of \ code{Invocation} such that :
4087 \begin{itemize} 4087 \begin{itemize}
4088 \item \code{im'.isMethod} evaluates to \code{\TRUE{}}. 4088 \item \code{im'.isMethod} evaluates to \code{\TRUE{}}.
4089 \item \code{im'.memberName} evaluates to \code{\#noSuchMethod}. 4089 \item \code{im'.memberName} evaluates to \code{\#noSuchMethod}.
4090 \item \code{im'.positionalArguments} evaluates to an immutable list whose sole e lement is $im$. 4090 \item \code{im'.positionalArguments} evaluates to an immutable list whose sole e lement is $im$.
4091 \item \code{im'.namedArguments} evaluates to the value of \code{\CONST{} \{\}}. 4091 \item \code{im'.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
4092 \end{itemize} 4092 \end{itemize}
4093 and the result of this latter invocation is the result of evaluating $i$. 4093 and the result of this latter invocation is the result of evaluating $i$.
4094 4094
4095 \LMHash{} 4095 \LMHash{}
4096 It is a static type warning if $S$ does not have an accessible instance method o r getter named $m$. 4096 Let $S_{static}$ be the superclass of the immediately enclosing class. It is a s tatic type warning if $S_{static}$ does not have an accessible instance method o r getter named $m$.
4097 4097
4098 The static type of $i$ is: 4098 The static type of $i$ is:
4099 \begin{itemize} 4099 \begin{itemize}
4100 \item The declared return type of $S.m$, if $S$ has an accessible instance gette r named $m$. 4100 \item The declared return type of $S_{static}.m$, if $S_{static}$ has an accessi ble instance getter named $m$.
4101 \item The static type of function $S.m$ if $S$ has an accessible instance method named $m$. 4101 \item The static type of function $S_{static}.m$ if $S_{static}$ has an accessib le instance method named $m$.
4102 \item The type \DYNAMIC{} otherwise. 4102 \item The type \DYNAMIC{} otherwise.
4103 \end{itemize} 4103 \end{itemize}
4104 4104
4105 4105
4106 \subsubsection{General Closurization} 4106 \subsubsection{General Closurization}
4107 \LMLabel{generalClosurization} 4107 \LMLabel{generalClosurization}
4108 4108
4109 \LMHash{} 4109 \LMHash{}
4110 Evaluation of a property extraction $i$ of the form $e\#m$ proceeds as follows: 4110 Evaluation of a property extraction $i$ of the form $e\#m$ proceeds as follows:
4111 4111
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
4200 The static type of $i$ is the type of the constructor function $T()$, if $T$ den otes a class in the surrounding scope with an anonymous constructor $T()$. Other wise the static type of $i$ is \DYNAMIC{}. 4200 The static type of $i$ is the type of the constructor function $T()$, if $T$ den otes a class in the surrounding scope with an anonymous constructor $T()$. Other wise the static type of $i$ is \DYNAMIC{}.
4201 4201
4202 \subsubsection{General Super Property Extraction} 4202 \subsubsection{General Super Property Extraction}
4203 \LMLabel{generalSuperPropertyExtraction} 4203 \LMLabel{generalSuperPropertyExtraction}
4204 4204
4205 4205
4206 \LMHash{} 4206 \LMHash{}
4207 Evaluation of a property extraction $i$ of the form \SUPER$\#m$ proceeds as foll ows: 4207 Evaluation of a property extraction $i$ of the form \SUPER$\#m$ proceeds as foll ows:
4208 4208
4209 \LMHash{} 4209 \LMHash{}
4210 Let $S$ be the superclass of the immediately enclosing class. 4210 Let $g$ be the method currently executing, and let $C$ be the class in which $g$ was looked up. Let $S_{dynamic}$ be the superclass of $C$.
4211 4211
4212 \LMHash{} 4212 \LMHash{}
4213 If $m$ is a setter name, let $f$ be the result of looking up setter $m$ in $S$ w ith respect to the current library $L$. If setter lookup succeeds then $i$ evalu ates to the closurization of setter $f$ with respect to superclass $S$ (\ref{s uperClosurization}). If setter lookup failed, a \cd{NoSuchMethodError} is throw n. 4213 If $m$ is a setter name, let $f$ be the result of looking up setter $m$ in $S_{d ynamic}$ with respect to the current library $L$. If setter lookup succeeds then $i$ evaluates to the closurization of setter $f$ with respect to superclass $S _{dynamic}$ (\ref{superClosurization}). If setter lookup failed, a \cd{NoSuchM ethodError} is thrown.
4214 4214
4215 If $m$ is not a setter name, let $f$ be the result of looking up method $m$ in $ S$ with respect to the current library $L$. If method lookup succeeds then $i$ e valuates to the closurization of method $m$ with respect to superclass $S$ (\ref {superClosurization}). 4215 If $m$ is not a setter name, let $f$ be the result of looking up method $m$ in $ S_{dynamic}$ with respect to the current library $L$. If method lookup succeeds then $i$ evaluates to the closurization of method $m$ with respect to superclass $S_{dynamic}$ (\ref{superClosurization}).
4216 4216
4217 \LMHash{} 4217 \LMHash{}
4218 Otherwise, let $f$ be the result of looking up getter $m$ in $S$ with respect t o the current library $L$. If getter lookup succeeds then $i$ evaluates to the closurization of getter $f$ with respect to superclass $S$ (\ref{superClosurizat ion}). If getter lookup failed, a \cd{NoSuchMethodError} is thrown. 4218 Otherwise, let $f$ be the result of looking up getter $m$ in $S_{dynamic}$ with respect to the current library $L$. If getter lookup succeeds then $i$ evaluat es to the closurization of getter $f$ with respect to superclass $S_{dynamic}$ ( \ref{superClosurization}). If getter lookup failed, a \cd{NoSuchMethodError} i s thrown.
4219 4219
4220 \LMHash{} 4220 \LMHash{}
4221 It is a static type warning if $S$ does not have an accessible instance member n amed $m$. 4221 Let $S_{static}$ be the superclass of the immediately enclosing class.It is a st atic type warning if $S_{static}$ does not have an accessible instance member na med $m$.
4222 4222
4223 \LMHash{} 4223 \LMHash{}
4224 The static type of $i$ is the static type of the function $S.m$, if $S$ has an accessible instance member named $m$. Otherwise the static type of $i$ is \DYNAM IC{}. 4224 The static type of $i$ is the static type of the function $S_{static}.m$, if $S _{static}$ has an accessible instance member named $m$. Otherwise the static typ e of $i$ is \DYNAMIC{}.
4225 4225
4226 4226
4227 4227
4228 \subsubsection{Ordinary Member Closurization} 4228 \subsubsection{Ordinary Member Closurization}
4229 \LMLabel{ordinaryMemberClosurization} 4229 \LMLabel{ordinaryMemberClosurization}
4230 4230
4231 4231
4232 \LMHash{} 4232 \LMHash{}
4233 Let $o$ be an object, and let $u$ be a fresh final variable bound to $o$. 4233 Let $o$ be an object, and let $u$ be a fresh final variable bound to $o$.
4234 The {\em closurization of method $f$ on object $o$} is defined to be equivalent to: 4234 The {\em closurization of method $f$ on object $o$} is defined to be equivalent to:
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
4476 4476
4477 4477
4478 4478
4479 \LMHash{} 4479 \LMHash{}
4480 It is a static type warning if the static type of $e_2$ may not be assigned to t he static type of the formal parameter of the setter $v=$. The static type of the expression $e_1.v$ \code{=} $e_2$ is the static type of $e_2$. 4480 It is a static type warning if the static type of $e_2$ may not be assigned to t he static type of the formal parameter of the setter $v=$. The static type of the expression $e_1.v$ \code{=} $e_2$ is the static type of $e_2$.
4481 4481
4482 \LMHash{} 4482 \LMHash{}
4483 Evaluation of an assignment of the form $\SUPER.v$ \code{=} $e$ proceeds as foll ows: 4483 Evaluation of an assignment of the form $\SUPER.v$ \code{=} $e$ proceeds as foll ows:
4484 4484
4485 \LMHash{} 4485 \LMHash{}
4486 Let $S$ be the superclass of the immediately enclosing class. 4486 Let $g$ be the method currently executing, and let $C$ be the class in which $g$ was looked up. Let $S_{dynamic}$ be the superclass of $C$.
4487 The expression $e$ is evaluated to an object $o$. Then, the setter $v=$ is look ed up (\ref{getterAndSetterLookup}) in $S$ with respect to the current library. The body of $v=$ is executed with its formal parameter bound to $o$ and \THIS{ } bound to \THIS{}. 4487 The expression $e$ is evaluated to an object $o$. Then, the setter $v=$ is look ed up (\ref{getterAndSetterLookup}) in $S_{dynamic}$ with respect to the current library. The body of $v=$ is executed with its formal parameter bound to $o$ and \THIS{} bound to \THIS{}.
4488 4488
4489 \LMHash{} 4489 \LMHash{}
4490 If the setter lookup has failed, then a new instance $im$ of the predefined cla ss \code{Invocation} is created, such that : 4490 If the setter lookup has failed, then a new instance $im$ of the predefined cla ss \code{Invocation} is created, such that :
4491 \begin{itemize} 4491 \begin{itemize}
4492 \item \code{im.isSetter} evaluates to \code{\TRUE{}}. 4492 \item \code{im.isSetter} evaluates to \code{\TRUE{}}.
4493 \item \code{im.memberName} evaluates to the symbol \code{v=}. 4493 \item \code{im.memberName} evaluates to the symbol \code{v=}.
4494 \item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o$]}. 4494 \item \code{im.positionalArguments} evaluates to an immutable list with the same values as \code{[$o$]}.
4495 \item \code{im.namedArguments} evaluates to the value of \code{\CONST{} \{\}}. 4495 \item \code{im.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
4496 \end{itemize} 4496 \end{itemize}
4497 4497
4498 \LMHash{} 4498 \LMHash{}
4499 Then the method \code{noSuchMethod()} is looked up in $S$ and invoked with argu ment $im$. 4499 Then the method \code{noSuchMethod()} is looked up in $S_{dynamic}$ and invoked with argument $im$.
4500 However, if the implementation found cannot be invoked with a single positional argument, the implementation of \code{noSuchMethod()} in class \code{Object} is invoked on \THIS{} with argument $im'$, where $im'$ is an instance of \code{Inv ocation} such that : 4500 However, if the implementation found cannot be invoked with a single positional argument, the implementation of \code{noSuchMethod()} in class \code{Object} is invoked on \THIS{} with argument $im'$, where $im'$ is an instance of \code{Inv ocation} such that :
4501 \begin{itemize} 4501 \begin{itemize}
4502 \item \code{im'.isMethod} evaluates to \code{\TRUE{}}. 4502 \item \code{im'.isMethod} evaluates to \code{\TRUE{}}.
4503 \item \code{im'.memberName} evaluates to \code{\#noSuchMethod}. 4503 \item \code{im'.memberName} evaluates to \code{\#noSuchMethod}.
4504 \item \code{im'.positionalArguments} evaluates to an immutable list whose sole e lement is $im$. 4504 \item \code{im'.positionalArguments} evaluates to an immutable list whose sole e lement is $im$.
4505 \item \code{im'.namedArguments} evaluates to the value of \code{\CONST{} \{\}}. 4505 \item \code{im'.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
4506 \end{itemize} 4506 \end{itemize}
4507 4507
4508 \LMHash{} 4508 \LMHash{}
4509 The value of the assignment expression is $o$ irrespective of whether setter loo kup has failed or succeeded. 4509 The value of the assignment expression is $o$ irrespective of whether setter loo kup has failed or succeeded.
4510 4510
4511 \LMHash{} 4511 \LMHash{}
4512 In checked mode, it is a dynamic type error if $o$ is not \NULL{} and the interf ace of the class of $o$ is not a subtype of the actual type of $S.v$. 4512 In checked mode, it is a dynamic type error if $o$ is not \NULL{} and the interf ace of the class of $o$ is not a subtype of the actual type of $S.v$.
4513 4513
4514 \LMHash{} 4514 \LMHash{}
4515 It is a static type warning if $S$ does not have an accessible instance setter n amed $v=$ unless $S$ or a superinterface of $S$ is annotated with an annotation denoting a constant identical to the constant \code{@proxy} defined in \code{dar t:core}. 4515 Let $S_{static}$ be the superclass of the immediately enclosing class. It is a s tatic type warning if $S_{static}$ does not have an accessible instance setter n amed $v=$ unless $S_{static}$ or a superinterface of $S_{static}$ is annotated w ith an annotation denoting a constant identical to the constant \code{@proxy} de fined in \code{dart:core}.
4516 4516
4517 \LMHash{} 4517 \LMHash{}
4518 It is a static type warning if the static type of $e$ may not be assigned to the static type of the formal parameter of the setter $v=$. The static type of th e expression $\SUPER.v$ \code{=} $e$ is the static type of $e$. 4518 It is a static type warning if the static type of $e$ may not be assigned to the static type of the formal parameter of the setter $v=$. The static type of th e expression $\SUPER.v$ \code{=} $e$ is the static type of $e$.
4519 4519
4520 4520
4521 4521
4522 4522
4523 4523
4524 4524
4525 \LMHash{} 4525 \LMHash{}
(...skipping 3315 matching lines...) Expand 10 before | Expand all | Expand 10 after
7841 7841
7842 The invariant that each normative paragraph is associated with a line 7842 The invariant that each normative paragraph is associated with a line
7843 containing the text \LMHash{} should be maintained. Extra occurrences 7843 containing the text \LMHash{} should be maintained. Extra occurrences
7844 of \LMHash{} can be added if needed, e.g., in order to make 7844 of \LMHash{} can be added if needed, e.g., in order to make
7845 individual \item{}s in itemized lists addressable. Each \LM.. command 7845 individual \item{}s in itemized lists addressable. Each \LM.. command
7846 must occur on a separate line. \LMHash{} must occur immediately 7846 must occur on a separate line. \LMHash{} must occur immediately
7847 before the associated paragraph, and \LMLabel must occur immediately 7847 before the associated paragraph, and \LMLabel must occur immediately
7848 after the associated \section{}, \subsection{} etc. 7848 after the associated \section{}, \subsection{} etc.
7849 7849
7850 ---------------------------------------------------------------------- 7850 ----------------------------------------------------------------------
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698