PassByConstruction

From Erights

(Difference between revisions)
Jump to: navigation, search
(add more taxonomic info, put in specification)
(nerGwbbwGJHpGA)
Line 1: Line 1:
-
A PassByConstruction (also 'pbc') object is one which, when sent over a [[comm system]] (e.g. [[CapTP]]) to another vat, is sent as some serialized representation, and will typically arive [[near]] rather than as a [[far reference]] back to the originating vat ([[PassByProxy]]).
+
With the bases loaded you srcutk us out with that answer!
-
 
+
-
{{XXX|Are there any references neither PBP nor PBC?}}
+
-
 
+
-
PassByConstruction objects may additionally be [[Selfless]], which by definition makes them [[PassByCopy]], i.e. exactly duplicated. On the other hand, [[Selfish]] PassByConstruction objects are used, for example, for [[una]].
+
-
 
+
-
==Defining pass-by-construction objects==
+
-
 
+
-
E [[comm system]]s serialize any object approved by the <code>pbc</code> auditor as the [[portrayal]] returned by its [[Miranda optUncall|__optUncall/0]] method. For example, this is an object which will always arrive as the number 3:
+
-
 
+
-
<code>
+
-
    def foo implements pbc {
+
-
        to [[Miranda optUncall|__optUncall]]() { return [1, "add", [2]] }
+
-
        # ...
+
-
    }
+
-
</code>
+
-
 
+
-
===Example===
+
-
 
+
-
The first part of the example is a maker for a 2D Vector. The created vectors are Pass By Construction, they should pass the guard :pbc.
+
-
This code should be positioned in an [[emaker]] file in the java classpath at the location "tests/makeVector.emaker"
+
-
 
+
-
<pre>def makeVector implements pbc {
+
-
    to run(var x, var y) {
+
-
        def vector implements pbc {
+
-
            to getX() :any { return x }
+
-
            to getY() :any { return y }
+
-
            to __optUncall() :any { return [makeVector, "run", [x,y]] }
+
-
            to __printOn(out) {out.print(`&lt;Vector $x $y&gt;`)}
+
-
        }
+
-
        return vector
+
-
    }
+
-
    to __optUncall() :any {
+
-
        return [&lt;import&gt;, "get", ["tests.makeVector"]]
+
-
    }
+
-
}</pre>
+
-
 
+
-
Example of usage:
+
-
 
+
-
<pre># create a new Vector object
+
-
? def makeVector := &lt;import:tests.makeVector&gt;
+
-
# value: &lt;makeVector&gt;
+
-
 
+
-
? def vector := makeVector(6.6,7.7)
+
-
# value: &lt;Vector 6.6 7.7&gt;
+
-
 
+
-
? introducer.onTheAir()
+
-
# value: ["3DES_SDH_M2", "3DES_SDH_M"]
+
-
 
+
-
# function for creating a new local vat
+
-
? def seedVatAuthor := &lt;elang:interp.seedVatAuthor&gt;(&lt;unsafe&gt;).virtualize(introducer)
+
-
# value: &lt;virtualSeedVat&gt;
+
-
 
+
-
# Run this source code in the new vat. The method accepts a pbc object and prints it.
+
-
? def scriptSource:="def run(thing :pbc) {println(`Thing: $thing`)}"
+
-
# value: "def run(thing :near) {println(`Thing: $thing`)}"
+
-
 
+
-
# create the new vat. Return a far reference to the object and a reference to the vat object
+
-
? def [scriptObj, vat] := seedVatAuthor(scriptSource)
+
-
# value: [&lt;Promise&gt;, &lt;Vat newVirtualSeedVat in &lt;runs in newVirtualSeedVat&gt;&gt;]
+
-
 
+
-
# pass the pbc object into the new vat
+
-
? scriptObj &lt;- run(vector)
+
-
# value: &lt;Remote Promise&gt;
+
-
 
+
-
? Thing: &lt;Vector 6.6 7.7&gt;</pre>
+
-
 
+
-
{{stub}}
+
-
[[Category:ELib specification]]
+

Revision as of 03:30, 20 April 2011

With the bases loaded you srcutk us out with that answer!

Personal tools
more tools