mirror of
https://github.com/dhil/phd-dissertation
synced 2026-03-13 02:58:26 +00:00
Rewrite body text of higher order translation for deep handlers.
This commit is contained in:
416
thesis.tex
416
thesis.tex
@@ -2453,7 +2453,7 @@ Since we now use a list representation for the stacks of
|
|||||||
continuations, we have had to modify the translations of all the
|
continuations, we have had to modify the translations of all the
|
||||||
constructs that manipulate continuations. For $\Return$ and $\Let$, we
|
constructs that manipulate continuations. For $\Return$ and $\Let$, we
|
||||||
extract the top continuation $k$ and manipulate it analogously to the
|
extract the top continuation $k$ and manipulate it analogously to the
|
||||||
original translation in Figure\ \ref{fig:cps-cbv}. For $\Do$, we
|
original translation in Figure~\ref{fig:cps-cbv}. For $\Do$, we
|
||||||
extract the top pure continuation $k$ and effect continuation $h$ and
|
extract the top pure continuation $k$ and effect continuation $h$ and
|
||||||
invoke $h$ in the same way as the curried translation, except that we
|
invoke $h$ in the same way as the curried translation, except that we
|
||||||
explicitly maintain the stack $ks$ of additional continuations. The
|
explicitly maintain the stack $ks$ of additional continuations. The
|
||||||
@@ -2765,57 +2765,74 @@ Figure~\ref{fig:cps-higher-order-uncurried}. In essence, it is the
|
|||||||
same as the refined first-order uncurried CPS translation, although
|
same as the refined first-order uncurried CPS translation, although
|
||||||
the notation is slightly more involved due to the separation of static
|
the notation is slightly more involved due to the separation of static
|
||||||
and dynamic parts.
|
and dynamic parts.
|
||||||
%
|
|
||||||
|
|
||||||
The translation on values is almost homomorphic on the syntax
|
As before, the translation comprises three translation functions, one
|
||||||
constructors. The notable exceptions are the translations of
|
for each syntactic category: values, computations, and handler
|
||||||
$\lambda$-abstractions and $\Lambda$-abstractions. The former gives
|
definitions. Amongst the three functions, the translation function for
|
||||||
rise to dynamic computation at runtime, and thus, the translation
|
computations stands out, because it is the only one that operates on
|
||||||
emits a dynamic $\dlam$-abstraction with two formal parameters: the
|
static continuations. Its type signature,
|
||||||
function parameter, $x$, and the continuation parameter, $ks$. The
|
$\cps{-} : \CompCat \to \SValCat^\ast \to \UCompCat$, signifies that
|
||||||
body of the $\dlam$-abstraction is somewhat anomalous as the
|
it is a binary function, taking a $\HCalc$-computation term as its
|
||||||
continuation $ks$ is subject to immediate dynamic deconstruction just
|
first argument and a static continuation (a list of static values) as
|
||||||
to be reconstructed again and used as a static argument to the
|
its second argument, and ultimately produces a $\UCalc$-computation
|
||||||
translation of the original body computation $M$. This deconstruction
|
term. Thus the computation translation function is able to manipulate
|
||||||
and reconstruction may at first glance appear to be rather pointless,
|
the continuation. In fact, the translation is said to be higher-order
|
||||||
however, a closer look reveals that it performs a critical role as it
|
because the continuation parameter is a higher-order: it is a list of
|
||||||
ensures that the translation on computation terms has immediate access
|
functions.
|
||||||
to the next pure and effect continuation functions. In fact, the
|
|
||||||
translation is set up such that every generated dynamic
|
|
||||||
$\dlam$-abstraction deconstructs its continuation argument
|
|
||||||
appropriately to expose just enough (static) continuation structure in
|
|
||||||
order to guarantee that static pattern matching never fails.
|
|
||||||
%
|
|
||||||
(The translation is somewhat unsatisfactory regarding this
|
|
||||||
deconstruction of dynamic continuations as the various generated
|
|
||||||
dynamic lambda abstractions do not deconstruct their continuation
|
|
||||||
arguments uniformly.)
|
|
||||||
%
|
|
||||||
Since the target language is oblivious to types any
|
|
||||||
$\Lambda$-abstraction gets translated in a similar way to
|
|
||||||
$\lambda$-abstraction, where the first parameter becomes a placeholder
|
|
||||||
for a ``dummy'' unit argument.
|
|
||||||
|
|
||||||
The translation of computation terms is more interesting. Note the
|
To ensure that static continuation manipulation is well-defined the
|
||||||
type of the translation function,
|
translation maintains the invariant that the statically known
|
||||||
$\cps{-} : \CompCat \to \SValCat^\ast \to \UCompCat$. It is a binary
|
continuation stack ($\sk$) always contains at least two continuation
|
||||||
function, taking a $\HCalc$-computation term as its first argument and
|
functions, i.e. a complete continuation pair consisting of a pure
|
||||||
a static continuation as its second argument, and ultimately produces
|
continuation function and an effect continuation function.
|
||||||
a $\UCalc$-computation term. The static continuation may be
|
%
|
||||||
manipulated during the translation as is done in the translations of
|
This invariant guarantees that all translations are uniform in whether
|
||||||
$\Return$, $\Let$, $\Do$, and $\Handle$. The translation of $\Return$
|
they appear statically within the scope of a handler or not, and this
|
||||||
consumes the next pure continuation function $\sk$ and applies it
|
also simplifies the correctness proof
|
||||||
dynamically to the translation of $V$ and the reified remainder,
|
(Theorem~\ref{thm:ho-simulation}).
|
||||||
$\sks$, of the static continuation. Keep in mind that the translation
|
%
|
||||||
of $\Return$ only consumes one of the two guaranteed available
|
Maintaining this invariant has a cosmetic effect on the presentation
|
||||||
continuation functions from the provided continuation argument; as a
|
of the translation. This effect manifests in any place where a
|
||||||
consequence the next continuation function in $\sks$ is an effect
|
dynamically known continuation stack is passed in (as a continuation
|
||||||
continuation. This consequence is accounted for in the translations of
|
parameter $\dhk$), as it must be deconstructed using a dynamic
|
||||||
$\Let$ and $\Return$-clauses, which are precisely the two possible
|
language $\Let$ to expose the continuation structure and subsequently
|
||||||
(dynamic) origins of $\sk$. For instance, the translation of $\Let$
|
reconstructed as a static value with reflected variable names.
|
||||||
|
|
||||||
|
The translation of $\lambda$-abstractions provides an example of this
|
||||||
|
deconstruction and reconstruction in action. The dynamic continuation
|
||||||
|
$\dhk$ is deconstructed to expose to the next pure continuation
|
||||||
|
function $\dk$ and effect continuation $h$, and the remainder of the
|
||||||
|
continuation $\dhk'$; these names are immediately reflected and put
|
||||||
|
back together to form a static continuation that is provided to the
|
||||||
|
translation of the body computation $M$.
|
||||||
|
|
||||||
|
The only translation rule that consumes a complete reflected
|
||||||
|
continuation pair is the translation of $\Do$. The effect continuation
|
||||||
|
function, $\sh$, is dynamically applied to an operation package and
|
||||||
|
the reified remainder of the continuation $\sks$. As usual, the
|
||||||
|
operation package contains the payload and the resumption, which is
|
||||||
|
represented as a reversed continuation slice.
|
||||||
|
%
|
||||||
|
The only other translation rules that manipulate the continuation are
|
||||||
|
$\Return$ and $\Let$, which only consume the pure continuation
|
||||||
|
function $\sk$. For example, the translation of $\Return$ is a dynamic
|
||||||
|
application of $\sk$ to the translation of the value $V$ and the
|
||||||
|
remainder of the continuation $\sks$.
|
||||||
|
%
|
||||||
|
The shape of $\sks$ is odd, meaning that the top element is an effect
|
||||||
|
continuation function. Thus the pure continuation $\sk$ has to account
|
||||||
|
for this odd shape. Fortunately, the possible instantiations of the
|
||||||
|
pure continuation are few. We can derive the all possible
|
||||||
|
instantiations systematically by using the operational semantics of
|
||||||
|
$\HCalc$. According to the operational semantics the continuation of a
|
||||||
|
$\Return$-computation is either the continuation of a
|
||||||
|
$\Let$-expression or a $\Return$-clause.
|
||||||
|
%
|
||||||
|
The translations of $\Let$-expressions and $\Return$-clauses each
|
||||||
|
account for odd continuations. For example, the translation of $\Let$
|
||||||
consumes the current pure continuation function and generates a
|
consumes the current pure continuation function and generates a
|
||||||
replacement: a pure continuation function which expects an odd dynamic
|
replacement: a pure continuation function which expects an odd dynamic
|
||||||
continuation $ks$, which it deconstructs to expose the effect
|
continuation $\dhk$, which it deconstructs to expose the effect
|
||||||
continuation $h$ along with the current pure continuation function in
|
continuation $h$ along with the current pure continuation function in
|
||||||
the translation of $N$. The modified continuation is passed to the
|
the translation of $N$. The modified continuation is passed to the
|
||||||
translation of $M$.
|
translation of $M$.
|
||||||
@@ -2880,32 +2897,169 @@ continuation in order to bind the current effect continuation function
|
|||||||
to the name $h$, which would have been used during the translation of
|
to the name $h$, which would have been used during the translation of
|
||||||
$N$.
|
$N$.
|
||||||
|
|
||||||
The translation of $\Do$ consumes both the current pure continuation
|
The translation of $\Handle$ applies the translation of $M$ to the
|
||||||
function and current effect continuation function. It applies the
|
current continuation extended with the translation of the
|
||||||
effect continuation function dynamically to an operation package and
|
$\Return$-clause, acting as a pure continuation function, and the
|
||||||
the reified remainder of the continuation. As usual, the operation
|
translation of operation-clauses, acting as an effect continuation
|
||||||
package contains the payload and the resumption, which is a reversed
|
function.
|
||||||
slice of the provided continuation. The translation of $\Handle$
|
|
||||||
applies the translation of $M$ to the current continuation extended
|
|
||||||
with the translation of the $\Return$-clause, acting as a pure
|
|
||||||
continuation function, and the translation of operation-clauses,
|
|
||||||
acting as an effect continuation function.
|
|
||||||
|
|
||||||
The translation of a return clause $\hret$ of some handler $H$
|
|
||||||
generates a dynamic lambda abstraction, which expects an odd
|
|
||||||
continuation. In its body it extracts three elements from the
|
|
||||||
continuation parameter $ks$. The first element is discarded as it is
|
|
||||||
the effect continuation corresponding to the translation of
|
|
||||||
$\hops$. The other two elements are used to statically expose the next
|
|
||||||
pure and effect continuation functions in the translation of $N$.
|
|
||||||
%
|
%
|
||||||
The translation of $\hops$ also generates a dynamic lambda
|
The translation of a $\Return$-clause discards the effect continuation
|
||||||
abstraction, which unpacks the operation package to perform a
|
$h$ and in addition exposes the next pure continuation $\dk$ and
|
||||||
case-split on the operation label $z$. The continuation $ks$ is
|
effect continuation $h'$ which are reflected to form a static
|
||||||
deconstructed in the branch for $\ell$ in order to expose the
|
continuation for the translation of $N$.
|
||||||
|
%
|
||||||
|
The translation of operation clauses unpacks the provided operation
|
||||||
|
package to perform a case-split on the operation label $z$. The branch
|
||||||
|
for $\ell$ deconstructs the continuation $\dhk$ in order to expose the
|
||||||
continuation structure. The forwarding branch also deconstructs the
|
continuation structure. The forwarding branch also deconstructs the
|
||||||
continuation, however, for a different purpose, namely, to augment the
|
continuation, but for a different purpose; it augments the resumption
|
||||||
resumption $rs$ the next pure and effect continuation functions.
|
$\dhkr$ with the next pure and effect continuation functions.
|
||||||
|
|
||||||
|
% The translation of
|
||||||
|
% $\Handle$ applies the translation of $M$ to the current continuation
|
||||||
|
% extended with the translation of the $\Return$-clause, acting as a
|
||||||
|
% pure continuation function, and the translation of operation-clauses,
|
||||||
|
% acting as an effect continuation function.
|
||||||
|
|
||||||
|
% The translation on values is almost homomorphic on the syntax
|
||||||
|
% constructors. The notable exceptions are the translations of
|
||||||
|
% $\lambda$-abstractions and $\Lambda$-abstractions. The former gives
|
||||||
|
% rise to dynamic computation at runtime, and thus, the translation
|
||||||
|
% emits a dynamic $\dlam$-abstraction with two formal parameters: the
|
||||||
|
% function parameter, $x$, and the continuation parameter, $ks$. The
|
||||||
|
% body of the $\dlam$-abstraction is somewhat anomalous as the
|
||||||
|
% continuation $ks$ is subject to immediate dynamic deconstruction just
|
||||||
|
% to be reconstructed again and used as a static argument to the
|
||||||
|
% translation of the original body computation $M$. This deconstruction
|
||||||
|
% and reconstruction may at first glance appear to be rather pointless,
|
||||||
|
% however, a closer look reveals that it performs a critical role as it
|
||||||
|
% ensures that the translation on computation terms has immediate access
|
||||||
|
% to the next pure and effect continuation functions. In fact, the
|
||||||
|
% translation is set up such that every generated dynamic
|
||||||
|
% $\dlam$-abstraction deconstructs its continuation argument
|
||||||
|
% appropriately to expose just enough (static) continuation structure in
|
||||||
|
% order to guarantee that static pattern matching never fails.
|
||||||
|
% %
|
||||||
|
% (The translation is somewhat unsatisfactory regarding this
|
||||||
|
% deconstruction of dynamic continuations as the various generated
|
||||||
|
% dynamic lambda abstractions do not deconstruct their continuation
|
||||||
|
% arguments uniformly.)
|
||||||
|
% %
|
||||||
|
% Since the target language is oblivious to types any
|
||||||
|
% $\Lambda$-abstraction gets translated in a similar way to
|
||||||
|
% $\lambda$-abstraction, where the first parameter becomes a placeholder
|
||||||
|
% for a ``dummy'' unit argument.
|
||||||
|
|
||||||
|
% The translation of computation terms is more interesting. Note the
|
||||||
|
% type of the translation function,
|
||||||
|
% $\cps{-} : \CompCat \to \SValCat^\ast \to \UCompCat$. It is a binary
|
||||||
|
% function, taking a $\HCalc$-computation term as its first argument and
|
||||||
|
% a static continuation as its second argument, and ultimately produces
|
||||||
|
% a $\UCalc$-computation term. The static continuation may be
|
||||||
|
% manipulated during the translation as is done in the translations of
|
||||||
|
% $\Return$, $\Let$, $\Do$, and $\Handle$. The translation of $\Return$
|
||||||
|
% consumes the next pure continuation function $\sk$ and applies it
|
||||||
|
% dynamically to the translation of $V$ and the reified remainder,
|
||||||
|
% $\sks$, of the static continuation. Keep in mind that the translation
|
||||||
|
% of $\Return$ only consumes one of the two guaranteed available
|
||||||
|
% continuation functions from the provided continuation argument; as a
|
||||||
|
% consequence the next continuation function in $\sks$ is an effect
|
||||||
|
% continuation. This consequence is accounted for in the translations of
|
||||||
|
% $\Let$ and $\Return$-clauses, which are precisely the two possible
|
||||||
|
% (dynamic) origins of $\sk$. For instance, the translation of $\Let$
|
||||||
|
% consumes the current pure continuation function and generates a
|
||||||
|
% replacement: a pure continuation function which expects an odd dynamic
|
||||||
|
% continuation $ks$, which it deconstructs to expose the effect
|
||||||
|
% continuation $h$ along with the current pure continuation function in
|
||||||
|
% the translation of $N$. The modified continuation is passed to the
|
||||||
|
% translation of $M$.
|
||||||
|
% %
|
||||||
|
% To provide a flavour of how this continuation manipulation functions
|
||||||
|
% in practice, consider the following example term.
|
||||||
|
% %
|
||||||
|
% \begin{derivation}
|
||||||
|
% &\pcps{\Let\;x \revto \Return\;V\;\In\;N}\\
|
||||||
|
% =& \reason{definition of $\pcps{-}$}\\
|
||||||
|
% &\ba[t]{@{}l}(\slam \sk \scons \sks.\cps{\Return\;V} \sapp
|
||||||
|
% (\reflect(\dlam x\,ks.
|
||||||
|
% \ba[t]{@{}l}
|
||||||
|
% \Let\;(h \dcons ks') = ks \;\In\\
|
||||||
|
% \cps{N} \sapp (\sk \scons \reflect h \scons \reflect ks')) \scons \sks)
|
||||||
|
% \ea\\
|
||||||
|
% \sapp (\reflect (\dlam x\,ks.x) \scons \reflect (\dlam z\,ks.\Absurd~z) \scons \snil))
|
||||||
|
% \ea\\
|
||||||
|
% =& \reason{definition of $\cps{-}$}\\
|
||||||
|
% &\ba[t]{@{}l}(\slam \sk \scons \sks.(\slam \sk \scons \sks. \reify \sk \dapp \cps{V} \dapp \reify \sks) \sapp
|
||||||
|
% (\reflect(\dlam x\,ks.
|
||||||
|
% \ba[t]{@{}l}
|
||||||
|
% \Let\;(h \dcons ks') = ks \;\In\\
|
||||||
|
% \cps{N} \sapp (\sk \scons \reflect h \scons \reflect ks')) \scons \sks)
|
||||||
|
% \ea\\
|
||||||
|
% \sapp (\reflect (\dlam x\,ks.x) \scons \reflect (\dlam z\,ks.\Absurd~z) \scons \snil))
|
||||||
|
% \ea\\
|
||||||
|
% =& \reason{static $\beta$-reduction}\\
|
||||||
|
% &(\slam \sk \scons \sks. \reify \sk \dapp \cps{V} \dapp \reify \sks)
|
||||||
|
% \sapp
|
||||||
|
% (\reflect(\dlam x\,\dhk.
|
||||||
|
% \ba[t]{@{}l}
|
||||||
|
% \Let\;(h \dcons \dhk') = \dhk \;\In\\
|
||||||
|
% \cps{N} \sapp
|
||||||
|
% \ba[t]{@{}l}
|
||||||
|
% (\reflect (\dlam x\,\dhk.x) \scons \reflect h \scons \reflect \dhk'))\\
|
||||||
|
% ~~\scons \reflect (\dlam z\,\dhk.\Absurd~z) \scons \snil))
|
||||||
|
% \ea
|
||||||
|
% \ea\\
|
||||||
|
% =& \reason{static $\beta$-reduction}\\
|
||||||
|
% &\ba[t]{@{}l@{~}l}
|
||||||
|
% &(\dlam x\,\dhk.
|
||||||
|
% \Let\;(h \dcons \dhk') = \dhk \;\In\;
|
||||||
|
% \cps{N} \sapp
|
||||||
|
% (\reflect (\dlam x\,\dhk.x) \scons \reflect h \scons \reflect \dhk'))\\
|
||||||
|
% \dapp& \cps{V} \dapp ((\dlam z\,\dhk.\Absurd~z) \dcons \dnil)\\
|
||||||
|
% \ea\\
|
||||||
|
% \reducesto& \reason{\usemlab{App_2}}\\
|
||||||
|
% &\Let\;(h \dcons \dhk') = (\dlam z\,\dhk.\Absurd~z) \dcons \dnil \;\In\;
|
||||||
|
% \cps{N[V/x]} \sapp
|
||||||
|
% (\reflect (\dlam x\,\dhk.x) \scons \reflect h \scons \reflect \dhk'))\\
|
||||||
|
% \reducesto^+& \reason{dynamic pattern matching and substitution}\\
|
||||||
|
% &\cps{N[V/x]} \sapp
|
||||||
|
% (\reflect (\dlam x\,\dhk.x) \scons \reflect (\dlam z\,\dhk.\Absurd~z) \scons \reflect \dnil)
|
||||||
|
% \end{derivation}
|
||||||
|
% %
|
||||||
|
% The translation of $\Return$ provides the generated dynamic pure
|
||||||
|
% continuation function with the odd continuation
|
||||||
|
% $((\dlam z\,ks.\Absurd~z) \dcons \dnil)$. After the \usemlab{App_2}
|
||||||
|
% reduction, the pure continuation function deconstructs the odd
|
||||||
|
% continuation in order to bind the current effect continuation function
|
||||||
|
% to the name $h$, which would have been used during the translation of
|
||||||
|
% $N$.
|
||||||
|
|
||||||
|
% The translation of $\Do$ consumes both the current pure continuation
|
||||||
|
% function and current effect continuation function. It applies the
|
||||||
|
% effect continuation function dynamically to an operation package and
|
||||||
|
% the reified remainder of the continuation. As usual, the operation
|
||||||
|
% package contains the payload and the resumption, which is a reversed
|
||||||
|
% slice of the provided continuation. The translation of $\Handle$
|
||||||
|
% applies the translation of $M$ to the current continuation extended
|
||||||
|
% with the translation of the $\Return$-clause, acting as a pure
|
||||||
|
% continuation function, and the translation of operation-clauses,
|
||||||
|
% acting as an effect continuation function.
|
||||||
|
|
||||||
|
% The translation of a return clause $\hret$ of some handler $H$
|
||||||
|
% generates a dynamic lambda abstraction, which expects an odd
|
||||||
|
% continuation. In its body it extracts three elements from the
|
||||||
|
% continuation parameter $ks$. The first element is discarded as it is
|
||||||
|
% the effect continuation corresponding to the translation of
|
||||||
|
% $\hops$. The other two elements are used to statically expose the next
|
||||||
|
% pure and effect continuation functions in the translation of $N$.
|
||||||
|
% %
|
||||||
|
% The translation of $\hops$ also generates a dynamic lambda
|
||||||
|
% abstraction, which unpacks the operation package to perform a
|
||||||
|
% case-split on the operation label $z$. The continuation $ks$ is
|
||||||
|
% deconstructed in the branch for $\ell$ in order to expose the
|
||||||
|
% continuation structure. The forwarding branch also deconstructs the
|
||||||
|
% continuation, however, for a different purpose, namely, to augment the
|
||||||
|
% resumption $rs$ the next pure and effect continuation functions.
|
||||||
%
|
%
|
||||||
\dhil{Remark that an alternative to cluttering the translations with
|
\dhil{Remark that an alternative to cluttering the translations with
|
||||||
unpacking and repacking of continuations would be to make static
|
unpacking and repacking of continuations would be to make static
|
||||||
@@ -2913,75 +3067,6 @@ resumption $rs$ the next pure and effect continuation functions.
|
|||||||
may reduce the dynamic administrative reductions, it makes the
|
may reduce the dynamic administrative reductions, it makes the
|
||||||
simulation proof more complicated.}
|
simulation proof more complicated.}
|
||||||
|
|
||||||
% : the $\dlam$-abstractions generated by translating $\lambda$-abstractions, $\Lambda$-abstractions, and operation clauses expose the next two continuation functions, whilst the dynamic lambda abstraction generated by translating $\Let$ only expose the next continuation, others expose only the next one, and the translation of
|
|
||||||
% $\lambda$-abstractions expose the next two continuation functions,
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% The translation on values and handler definitions generates dynamic
|
|
||||||
% lambda abstractions. Whilst the translation on computations generates
|
|
||||||
% static lambda abstractions.
|
|
||||||
|
|
||||||
% Static continuation application corresponds to
|
|
||||||
|
|
||||||
% The translation function for computation terms is staged: for any
|
|
||||||
% given computation term the translation yields a static function, which
|
|
||||||
% can be applied to a static continuation to ultimately yield a
|
|
||||||
% $\UCalc$-computation term. Staging is key to eliminating static
|
|
||||||
% administrative redexes as any static function may perform static
|
|
||||||
% computation by manipulating its provided static continuation
|
|
||||||
|
|
||||||
|
|
||||||
% a binary higher-order
|
|
||||||
% function; it is higher-order because its second parameter is a list of
|
|
||||||
% static continuation functions.
|
|
||||||
|
|
||||||
% A major difference that has a large cosmetic effect on the
|
|
||||||
% presentation of the translation is that we maintain the invariant that
|
|
||||||
% the statically known stack ($\sk$) always contains at least one frame,
|
|
||||||
% consisting of a triple
|
|
||||||
% $\sRecord{\reflect V_{fs}, \sRecord{\reflect V_{ret}, \reflect
|
|
||||||
% V_{ops}}}$ of reflected dynamic pure frame stacks, return
|
|
||||||
% handlers, and operation handlers. Maintaining this invariant ensures
|
|
||||||
% that all translations are uniform in whether they appear statically
|
|
||||||
% within the scope of a handler or not, and this simplifies our
|
|
||||||
% correctness proof. To maintain the invariant, any place where a
|
|
||||||
% dynamically known stack is passed in (as a continuation parameter
|
|
||||||
% $k$), it is immediately decomposed using a dynamic language $\Let$ and
|
|
||||||
% repackaged as a static value with reflected variable
|
|
||||||
% names. Unfortunately, this does add some clutter to the translation
|
|
||||||
% definition, as compared to the translations above. However, there is a
|
|
||||||
% payoff in the removal of administrative reductions at run time. The
|
|
||||||
% translations presented by \citet{HillerstromLAS17} and
|
|
||||||
% \citet{HillerstromL18} did not do this decomposition and repackaging
|
|
||||||
% step, which resulted in additional administrative reductions in the
|
|
||||||
% translation due to the translations of $\Let$ and $\Do$ being passed
|
|
||||||
% dynamic continuations when they were expecting statically known ones.
|
|
||||||
%
|
|
||||||
|
|
||||||
% The translation on values is mostly homomorphic on the syntax
|
|
||||||
% constructors, except for $\lambda$-abstractions and
|
|
||||||
% $\Lambda$-abstractions which are translated in the exact same way,
|
|
||||||
% because the target calculus has no notion of types. As per usual
|
|
||||||
% continuation passing style practice, the translation of a lambda
|
|
||||||
% abstraction yields a dynamic binary lambda abstraction, where the
|
|
||||||
% second parameter is intended to be the continuation
|
|
||||||
% parameter.
|
|
||||||
|
|
||||||
% %
|
|
||||||
% However, the translation slightly diverge from the usual
|
|
||||||
% practice in the translation of the body as the result of $\cps{M}$ is
|
|
||||||
% applied statically, rather than dynamically, to the (reflected)
|
|
||||||
% continuation parameter.
|
|
||||||
% %
|
|
||||||
|
|
||||||
% The reason is that the translation on computations is staged: for any
|
|
||||||
% given computation term the translation yields a static function, which
|
|
||||||
% can be applied to a static continuation to ultimately produce a
|
|
||||||
% $\UCalc$-computation term. This staging is key to eliminating static
|
|
||||||
% administrative redexes as any static function may perform static
|
|
||||||
% computation by manipulating its provided static continuation, as is
|
|
||||||
% for instance done in the translation of $\Let$.
|
|
||||||
%
|
%
|
||||||
\dhil{Spell out why this translation qualifies as `higher-order'.}
|
\dhil{Spell out why this translation qualifies as `higher-order'.}
|
||||||
|
|
||||||
@@ -3120,7 +3205,7 @@ reductions, i.e.
|
|||||||
%
|
%
|
||||||
\[
|
\[
|
||||||
\cps{M} \sapp (\sV_1 \scons \dots \sV_n \scons \reflect \reify \sW)
|
\cps{M} \sapp (\sV_1 \scons \dots \sV_n \scons \reflect \reify \sW)
|
||||||
\areducesto^* \cps{M} \sapp (\sV_1 \scons \dots \sV_n \scons \sW)
|
\areducesto^\ast \cps{M} \sapp (\sV_1 \scons \dots \sV_n \scons \sW)
|
||||||
\]
|
\]
|
||||||
\end{lemma}
|
\end{lemma}
|
||||||
%
|
%
|
||||||
@@ -3406,53 +3491,6 @@ interpretation of continuations.
|
|||||||
Although it is seductive to program with lists, it quickly gets
|
Although it is seductive to program with lists, it quickly gets
|
||||||
unwieldy.
|
unwieldy.
|
||||||
|
|
||||||
% The underlying issue is that the continuation structure is still too
|
|
||||||
% extensional. The need for a more intensional structure is evident in
|
|
||||||
% the insertion of $\kid$ in the translation of $\Handle$ as a
|
|
||||||
% placeholder for the empty pure continuation. Another telltale for a
|
|
||||||
% more general notion of continuation is that continuation
|
|
||||||
% deconstructions are non-uniform due to the single flat list
|
|
||||||
% continuation representation. While stuffing everything into lists is
|
|
||||||
% seductive, it quickly gets unwieldy.
|
|
||||||
|
|
||||||
% Instead of inserting dummy handlers, one may consider composing the
|
|
||||||
% current pure continuation with the next pure continuation, meaning
|
|
||||||
% that the current pure continuation would be handled accordingly by the
|
|
||||||
% next handler. To retrieve the next pure continuation, we must reach
|
|
||||||
% under the next handler, i.e. something along the lines of the
|
|
||||||
% following.
|
|
||||||
% %
|
|
||||||
% \[
|
|
||||||
% \bl
|
|
||||||
% \Let\;(\_ \dcons \_ \dcons \dk \dcons \vhops \dcons \vhret \dcons \dk' \dcons rs') = rs\;\In\\
|
|
||||||
% \Let\;r = \Res\,(\vhops \dcons \vhret \dcons (\dk' \circ \dk) \dcons rs')\;\In\;\dots
|
|
||||||
% \el
|
|
||||||
% \]
|
|
||||||
% %
|
|
||||||
% where $\circ$ is defined to be function composition in continuation
|
|
||||||
% passing style.
|
|
||||||
% %
|
|
||||||
% \[
|
|
||||||
% g \circ f \defas \lambda x\,\dhk.
|
|
||||||
% \ba[t]{@{}l}
|
|
||||||
% \Let\;(\dk \dcons \dhk') = \dhk\; \In\\
|
|
||||||
% f \dapp x \dapp ((\lambda x\,\dhk. g \dapp x \dapp (\dk \dcons \dhk)) \dcons \dhk')
|
|
||||||
% \ea
|
|
||||||
% \]
|
|
||||||
% %
|
|
||||||
% This idea is cute, but it reintroduces a variation of the dynamic
|
|
||||||
% redexes we dealt with in
|
|
||||||
% Section~\ref{sec:first-order-explicit-resump}.
|
|
||||||
% %
|
|
||||||
% Both solutions side step the underlying issue, namely, that the
|
|
||||||
% continuation structure is still too extensional. The need for a more
|
|
||||||
% intensional structure is evident in the insertion of $\kid$ in the
|
|
||||||
% translation of $\Handle$ as a placeholder for the empty pure
|
|
||||||
% continuation. Another telltale is that the disparity of continuation
|
|
||||||
% deconstructions also gets bigger. The continuation representation
|
|
||||||
% needs more structure. While it is seductive to program with lists, it
|
|
||||||
% quickly gets unwieldy.
|
|
||||||
|
|
||||||
\subsection{Generalised continuations}
|
\subsection{Generalised continuations}
|
||||||
\label{sec:generalised-continuations}
|
\label{sec:generalised-continuations}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user