What&#39;s this {DELEGATE} syntax? What does that do? <br><br><div class="gmail_quote">On Fri, Oct 31, 2008 at 6:00 AM,  <span dir="ltr">&lt;<a href="mailto:oberon-request@lists.inf.ethz.ch">oberon-request@lists.inf.ethz.ch</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Send Oberon mailing list submissions to<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:oberon@lists.inf.ethz.ch">oberon@lists.inf.ethz.ch</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
or, via email, send a message with subject or body &#39;help&#39; to<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:oberon-request@lists.inf.ethz.ch">oberon-request@lists.inf.ethz.ch</a><br>
<br>
You can reach the person managing the list at<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:oberon-owner@lists.inf.ethz.ch">oberon-owner@lists.inf.ethz.ch</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than &quot;Re: Contents of Oberon digest...&quot;<br>
<br>
<br>
Today&#39;s Topics:<br>
<br>
 &nbsp; 1. Re: Oberon and closures (<a href="mailto:Aubrey.McIntosh@Alumni.UTexas.Net">Aubrey.McIntosh@Alumni.UTexas.Net</a>)<br>
 &nbsp; 2. Re: Oberon and closures (Alexander Iljin)<br>
 &nbsp; 3. Re: Oberon and closures (B. Smith-Mannschott)<br>
 &nbsp; 4. Re: Oberon and closures (B. Smith-Mannschott)<br>
 &nbsp; 5. Re: Oberon and closures (Thomas Frey)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Thu, 30 Oct 2008 10:02:50 -0500<br>
From: <a href="mailto:Aubrey.McIntosh@Alumni.UTexas.Net">Aubrey.McIntosh@Alumni.UTexas.Net</a><br>
Subject: Re: [Oberon] Oberon and closures<br>
To: &quot;ETH Oberon and related systems&quot; &lt;<a href="mailto:oberon@lists.inf.ethz.ch">oberon@lists.inf.ethz.ch</a>&gt;<br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:6d278c720810300802ia8c47e0s2e2576523d1ff990@mail.gmail.com">6d278c720810300802ia8c47e0s2e2576523d1ff990@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
I thing I read that procedure variables are being depreciated because<br>
the literature finds some problem with them. &nbsp;I forget what the<br>
problem is. &nbsp;Also, I haven&#39;t any clue what a &quot;closure&quot; is other than<br>
this discussion, so I would appreciate any pointer to info that may be<br>
more focused than my own Google search.<br>
<br>
Anyway, I tried to modify the example a bit more so that it used type<br>
bound procedures, not procedure variables. &nbsp;Here is the version for<br>
Component Pascal.<br>
<br>
<br>
MODULE PrivClosureExample;<br>
(* my oberon is also a little rusty *)<br>
<br>
TYPE<br>
&nbsp;Printer = POINTER TO Closure;<br>
<br>
&nbsp;Closure = RECORD<br>
 &nbsp; n-: INTEGER;<br>
&nbsp;END;<br>
<br>
VAR p, q: Printer;<br>
<br>
PROCEDURE (this:Printer) Print, NEW;<br>
END Print;<br>
<br>
PROCEDURE CreatePrinter*(i: INTEGER): Printer;<br>
&nbsp;VAR s: Printer;<br>
&nbsp;BEGIN<br>
 &nbsp; NEW(s); s.n :=i; RETURN s<br>
&nbsp;END CreatePrinter;<br>
<br>
BEGIN<br>
&nbsp;p:=CreatePrinter(2);<br>
&nbsp;q:=CreatePrinter(3);<br>
&nbsp;p.Print;<br>
&nbsp;q.Print<br>
END PrivClosureExample.<br>
<br>
<br>
On Thu, Oct 30, 2008 at 3:25 AM, Jörg Straube &lt;joerg.straube@iaeth.ch&gt; wrote:<br>
&gt;<br>
&gt;&gt;&gt; From Wikipedia we find<br>
&gt;&gt;&gt; As a consequence, closures can be used to hide state,<br>
&gt;&gt;&gt; and thus to implement object-oriented programming<br>
&gt;<br>
&gt; As Oberon is object-oriented, we don&#39;t need the concept<br>
&gt; of &quot;closures&quot; to implement OOP.<br>
&gt;<br>
&gt; Joerg<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; <a href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br>
&gt; <a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
&gt;<br>
<br>
<br>
<br>
--<br>
--<br>
Aubrey McIntosh, Ph.D.<br>
1502 Devon Circle<br>
Austin TX 78723-1814<br>
<a href="http://home.grandecom.net/%7Eamcintosh/aubrey/Search/" target="_blank">http://home.grandecom.net/~amcintosh/aubrey/Search/</a><br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Thu, 30 Oct 2008 21:11:05 +0600<br>
From: &quot;Alexander Iljin&quot; &lt;<a href="http://ajsoft.gm" target="_blank">ajsoft.gm</a>@<a href="http://gmail.com" target="_blank">gmail.com</a>&gt;<br>
Subject: Re: [Oberon] Oberon and closures<br>
To: &quot;ETH Oberon and related systems&quot; &lt;<a href="mailto:oberon@lists.inf.ethz.ch">oberon@lists.inf.ethz.ch</a>&gt;<br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:950bc9920810300811g1f930c2frc7227bd64c1bf01c@mail.gmail.com">950bc9920810300811g1f930c2frc7227bd64c1bf01c@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
Hello!<br>
<br>
On 10/30/08, <a href="mailto:Aubrey.McIntosh@alumni.utexas.net">Aubrey.McIntosh@alumni.utexas.net</a><br>
&lt;<a href="mailto:Aubrey.McIntosh@alumni.utexas.net">Aubrey.McIntosh@alumni.utexas.net</a>&gt; wrote:<br>
&gt; I would appreciate any pointer to info that may be<br>
&gt; more focused than my own Google search.<br>
<br>
<a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29" target="_blank">http://en.wikipedia.org/wiki/Closure_(computer_science)</a><br>
<br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Thu, 30 Oct 2008 17:54:24 +0100<br>
From: &quot;B. Smith-Mannschott&quot; &lt;<a href="mailto:benpsm@gmail.com">benpsm@gmail.com</a>&gt;<br>
Subject: Re: [Oberon] Oberon and closures<br>
To: ETH Oberon and related systems &lt;<a href="mailto:oberon@lists.inf.ethz.ch">oberon@lists.inf.ethz.ch</a>&gt;<br>
Message-ID: &lt;<a href="mailto:9014DD6E-0B81-4246-9021-D52AF8A7291E@gmail.com">9014DD6E-0B81-4246-9021-D52AF8A7291E@gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes<br>
<br>
<br>
On Oct 30, 2008, at 09:11, Jörg Straube wrote:<br>
<br>
&gt;<br>
&gt; What about this?<br>
&gt;<br>
&gt; MODULE Example;<br>
&gt; (* my oberon is also a little rusty *)<br>
&gt; TYPE<br>
&gt; &nbsp;Printer = POINTER TO Closure;<br>
&gt; &nbsp;Closure = RECORD<br>
&gt; &nbsp; &nbsp;n-: INTEGER;<br>
&gt; &nbsp; &nbsp;Print: PROCEDURE();<br>
&gt; &nbsp;END;<br>
&gt; PROCEDURE CreatePrinter*(i: INTEGER): Printer;<br>
&gt; &nbsp;VAR s: Printer;<br>
&gt; &nbsp;BEGIN<br>
&gt; &nbsp; &nbsp;NEW(s); s.n :=i; RETURN Printer<br>
&gt; &nbsp;END<br>
&gt;<br>
&gt; VAR p, q: Printer;<br>
&gt; BEGIN<br>
&gt; &nbsp;p:=CreatePrinter(2);<br>
&gt; &nbsp;q:=CreatePrinter(3);<br>
&gt; &nbsp;p.Print<br>
&gt; &nbsp;q.Print<br>
&gt; END Example.<br>
&gt;<br>
&gt;<br>
&gt; Joerg<br>
<br>
Indeed, there is an equivalence between objects (state with behavior)<br>
and<br>
closures (behavior with state).<br>
<br>
Anton van Straaten observed a few years ago (more humorously than I<br>
could manage):<br>
<br>
&lt;<a href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html" target="_blank">http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html</a><br>
&nbsp;&gt;<br>
 &nbsp; The venerable master Qc Na was walking with his student, Anton.<br>
Hoping to<br>
prompt the master into a discussion, Anton said &quot;Master, I have heard<br>
that<br>
objects are a very good thing - is this true?&quot; &nbsp;Qc Na looked pityingly<br>
at<br>
his student and replied, &quot;Foolish pupil - objects are merely a poor<br>
man&#39;s<br>
closures.&quot;<br>
Chastised, Anton took his leave from his master and returned to his<br>
cell,<br>
intent on studying closures. &nbsp;He carefully read the entire &quot;Lambda: The<br>
Ultimate...&quot; series of papers and its cousins, and implemented a small<br>
Scheme interpreter with a closure-based object system. &nbsp;He learned<br>
much, and<br>
looked forward to informing his master of his progress.<br>
<br>
 &nbsp; On his next walk with Qc Na, Anton attempted to impress his master by<br>
saying &quot;Master, I have diligently studied the matter, and now understand<br>
that objects are truly a poor man&#39;s closures.&quot; &nbsp;Qc Na responded by<br>
hitting<br>
Anton with his stick, saying &quot;When will you learn? Closures are a poor<br>
man&#39;s<br>
object.&quot; &nbsp;At that moment, Anton became enlightened.<br>
// Ben<br>
<br>
------------------------------<br>
<br>
Message: 4<br>
Date: Thu, 30 Oct 2008 18:00:28 +0100<br>
From: &quot;B. Smith-Mannschott&quot; &lt;<a href="mailto:benpsm@gmail.com">benpsm@gmail.com</a>&gt;<br>
Subject: Re: [Oberon] Oberon and closures<br>
To: ETH Oberon and related systems &lt;<a href="mailto:oberon@lists.inf.ethz.ch">oberon@lists.inf.ethz.ch</a>&gt;<br>
Message-ID: &lt;<a href="mailto:7E838A5B-F59A-4033-A414-E59C97CC60C7@gmail.com">7E838A5B-F59A-4033-A414-E59C97CC60C7@gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes<br>
<br>
<br>
On Oct 30, 2008, at 09:16, Bob Walkden wrote:<br>
<br>
&gt;&gt;&gt; So, yes, you can create a closure in Oberon.<br>
&gt;&gt;<br>
&gt;&gt; Well, no, not really. &nbsp;The Module being a single giant closure over<br>
&gt;&gt; all the procedures defined in it is *not* what is generally meant by<br>
&gt;&gt; &quot;closure&quot;. &nbsp;In particular, languages which support closures generally<br>
&gt;&gt; allow something like this:<br>
&gt;&gt;<br>
&gt;&gt; MODULE Example;<br>
&gt;&gt; (* my oberon&#39;s a little rusty *)<br>
&gt;&gt; TYPE<br>
&gt;&gt; &nbsp; Printer = PROCEDURE();<br>
&gt;&gt; VAR<br>
&gt;&gt; &nbsp; p, q: Printer;<br>
&gt;&gt;<br>
&gt;&gt; PROCEDURE CreateNumberPrinter(n: INTEGER): Printer;<br>
&gt;&gt; &nbsp; &nbsp; PROCEDURE PrintingProcedure;<br>
&gt;&gt; &nbsp; &nbsp; BEGIN Out.WriteInt(n)<br>
&gt;&gt; &nbsp; &nbsp; END PrintingProcedure;<br>
&gt;&gt; BEGIN<br>
&gt;&gt; &nbsp; &nbsp; RETURN PrintingProcedure<br>
&gt;&gt; END CreateNumberPrinter;<br>
&gt;&gt;<br>
&gt;&gt; BEGIN<br>
&gt;&gt; &nbsp; p := CreateNumberPrinter(1);<br>
&gt;&gt; &nbsp; q := CreateNumberPrinter(2);<br>
&gt;&gt; &nbsp; p; (* prints 1 *)<br>
&gt;&gt; &nbsp; q; (* prints 2 *)<br>
&gt;&gt; END Example;<br>
&gt;&gt;<br>
&gt;&gt; Note that each invocation of CreateNumberPrinter creates a new<br>
&gt;&gt; closure<br>
&gt;&gt; over the nested procedure PrintingProcedure. In fact the fact that<br>
&gt;&gt; Pascal/Modula/Oberon only allows top-level procedures as procedure<br>
&gt;&gt; values appears to be a direct result of the fact that the language<br>
&gt;&gt; doesn&#39;t support proper closures. (In order to support closures as<br>
&gt;&gt; above you need something more involved than a simple stack as an<br>
&gt;&gt; instance of PrintingProcedure needs to find its &quot;n&quot;, even after the<br>
&gt;&gt; CreateNumberPrinter that created it is no longer active on the<br>
&gt;&gt; stack).<br>
&gt;&gt;<br>
&gt;<br>
&gt; &quot;the language doesn&#39;t support proper closures&quot;<br>
&gt;<br>
&gt; What are the benefits of supporting this? It doesn&#39;t feel to me as<br>
&gt; though it is<br>
&gt; in &#39;the spirit of Oberon&#39;. It feels like the kind of accident<br>
&gt; waiting to happen<br>
&gt; that Prof. Wirth preferred to avoid.<br>
<br>
Yes supporting full closures would have complicated the compiler and/or<br>
the runtime system considerably and wouldn&#39;t have been in Wirth&#39;s style.<br>
By choosing not to indulge in this feature he was able to keep his<br>
languages<br>
and compilers far smaller and simpler than they otherwise would have<br>
been.<br>
<br>
There&#39;s no law that says that every language must support closures (or<br>
tail call eliminiation, or mult-methods, continuations, or ...) &nbsp;and I<br>
for<br>
one am glad that Wirth chose to keep Oberon simple.<br>
<br>
// Ben<br>
<br>
<br>
------------------------------<br>
<br>
Message: 5<br>
Date: Thu, 30 Oct 2008 20:58:26 +0100<br>
From: Thomas Frey &lt;<a href="mailto:thomas.frey@alumni.ethz.ch">thomas.frey@alumni.ethz.ch</a>&gt;<br>
Subject: Re: [Oberon] Oberon and closures<br>
To: ETH Oberon and related systems &lt;<a href="mailto:oberon@lists.inf.ethz.ch">oberon@lists.inf.ethz.ch</a>&gt;<br>
Message-ID: &lt;<a href="mailto:490A11E2.1070508@alumni.ethz.ch">490A11E2.1070508@alumni.ethz.ch</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed<br>
<br>
In Active Oberon we have an additional way of simulating (strongly<br>
typed) closures.<br>
<br>
Concept:<br>
the reachable state of the closure function is stored in the fields of a<br>
local OBJECT type (POINTER TO RECORD) (Note : Bound variables in<br>
functional languages are &quot;read only&quot;, here we rely on the programmer)<br>
The closure itself is then a delegate procedure variable bound to a<br>
method of an instance of the local OBJECT (class). The delegate<br>
encapsulates the code and the state (as a closure)<br>
<br>
The advantage of this way of doing a &quot;closure&quot; is that the computational<br>
effort is visible to the programmer and not hidden behind the scene as<br>
in other languages. (Note : Using objects and delegates normally allows<br>
for more natural solutions than the following example which tries to<br>
mimic closures as closely as possible)<br>
<br>
MODULE Closure; (** AUTHOR &quot;tf&quot;; PURPOSE &quot;closure simulation&quot;; *)<br>
<br>
IMPORT<br>
 &nbsp; Out := KernelLog;<br>
<br>
TYPE<br>
 &nbsp; Printer = PROCEDURE {DELEGATE} ();<br>
<br>
(* creates a closure *)<br>
PROCEDURE CreatePrinter(nr : LONGINT): Printer;<br>
TYPE<br>
 &nbsp; (* container for the accessed scope *)<br>
 &nbsp; PrinterClosure = OBJECT<br>
 &nbsp; VAR nr : LONGINT; (* state *)<br>
<br>
 &nbsp; &nbsp; (* functionality, able to access the &quot;copied scope&quot;*)<br>
 &nbsp; &nbsp; PROCEDURE Print;<br>
 &nbsp; &nbsp; BEGIN<br>
 &nbsp; &nbsp; &nbsp; Out.Int(nr, 0); Out.Ln;<br>
 &nbsp; &nbsp; END Print;<br>
 &nbsp; END PrinterClosure;<br>
<br>
VAR<br>
 &nbsp; &nbsp;closure : PrinterClosure;<br>
BEGIN<br>
 &nbsp; (* create the container for the bound variables *)<br>
 &nbsp; NEW(closure);<br>
 &nbsp; (* &quot;bind&quot; the variables *)<br>
 &nbsp; <a href="http://closure.nr" target="_blank">closure.nr</a> := nr;<br>
 &nbsp; (* return the closure *)<br>
 &nbsp; RETURN closure.Print;<br>
END CreatePrinter;<br>
<br>
<br>
PROCEDURE Test*;<br>
VAR print : Printer;<br>
BEGIN<br>
 &nbsp; print := CreatePrinter(5);<br>
 &nbsp; (* use the closure *)<br>
 &nbsp; print();<br>
END Test;<br>
<br>
END Closure.<br>
<br>
Closure.Test<br>
<br>
--Thomas<br>
<br>
B. Smith-Mannschott schrieb:<br>
&gt;<br>
&gt; On Oct 30, 2008, at 09:16, Bob Walkden wrote:<br>
&gt;<br>
&gt;&gt;&gt;&gt; So, yes, you can create a closure in Oberon.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Well, no, not really. &nbsp;The Module being a single giant closure over<br>
&gt;&gt;&gt; all the procedures defined in it is *not* what is generally meant by<br>
&gt;&gt;&gt; &quot;closure&quot;. &nbsp;In particular, languages which support closures generally<br>
&gt;&gt;&gt; allow something like this:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; MODULE Example;<br>
&gt;&gt;&gt; (* my oberon&#39;s a little rusty *)<br>
&gt;&gt;&gt; TYPE<br>
&gt;&gt;&gt; &nbsp; Printer = PROCEDURE();<br>
&gt;&gt;&gt; VAR<br>
&gt;&gt;&gt; &nbsp; p, q: Printer;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; PROCEDURE CreateNumberPrinter(n: INTEGER): Printer;<br>
&gt;&gt;&gt; &nbsp; &nbsp; PROCEDURE PrintingProcedure;<br>
&gt;&gt;&gt; &nbsp; &nbsp; BEGIN Out.WriteInt(n)<br>
&gt;&gt;&gt; &nbsp; &nbsp; END PrintingProcedure;<br>
&gt;&gt;&gt; BEGIN<br>
&gt;&gt;&gt; &nbsp; &nbsp; RETURN PrintingProcedure<br>
&gt;&gt;&gt; END CreateNumberPrinter;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; BEGIN<br>
&gt;&gt;&gt; &nbsp; p := CreateNumberPrinter(1);<br>
&gt;&gt;&gt; &nbsp; q := CreateNumberPrinter(2);<br>
&gt;&gt;&gt; &nbsp; p; (* prints 1 *)<br>
&gt;&gt;&gt; &nbsp; q; (* prints 2 *)<br>
&gt;&gt;&gt; END Example;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Note that each invocation of CreateNumberPrinter creates a new closure<br>
&gt;&gt;&gt; over the nested procedure PrintingProcedure. In fact the fact that<br>
&gt;&gt;&gt; Pascal/Modula/Oberon only allows top-level procedures as procedure<br>
&gt;&gt;&gt; values appears to be a direct result of the fact that the language<br>
&gt;&gt;&gt; doesn&#39;t support proper closures. (In order to support closures as<br>
&gt;&gt;&gt; above you need something more involved than a simple stack as an<br>
&gt;&gt;&gt; instance of PrintingProcedure needs to find its &quot;n&quot;, even after the<br>
&gt;&gt;&gt; CreateNumberPrinter that created it is no longer active on the stack).<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; &quot;the language doesn&#39;t support proper closures&quot;<br>
&gt;&gt;<br>
&gt;&gt; What are the benefits of supporting this? It doesn&#39;t feel to me as<br>
&gt;&gt; though it is<br>
&gt;&gt; in &#39;the spirit of Oberon&#39;. It feels like the kind of accident waiting<br>
&gt;&gt; to happen<br>
&gt;&gt; that Prof. Wirth preferred to avoid.<br>
&gt;<br>
&gt; Yes supporting full closures would have complicated the compiler and/or<br>
&gt; the runtime system considerably and wouldn&#39;t have been in Wirth&#39;s style.<br>
&gt; By choosing not to indulge in this feature he was able to keep his<br>
&gt; languages<br>
&gt; and compilers far smaller and simpler than they otherwise would have been.<br>
&gt;<br>
&gt; There&#39;s no law that says that every language must support closures (or<br>
&gt; tail call eliminiation, or mult-methods, continuations, or ...) &nbsp;and I for<br>
&gt; one am glad that Wirth chose to keep Oberon simple.<br>
&gt;<br>
&gt; // Ben<br>
&gt; --<br>
&gt; <a href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br>
&gt; <a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
&gt;<br>
<br>
<br>
------------------------------<br>
<font color="#888888"><br>
--<br>
<a href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br>
<a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
<br>
<br>
End of Oberon Digest, Vol 61, Issue 16<br>
**************************************<br>
</font></blockquote></div><br>