PassByConstruction

From Erights

(Difference between revisions)
Jump to: navigation, search
m (Pass By Construction moved to PassByConstruction: use formal name)
(revert)
 
(16 intermediate revisions not shown)
Line 1: Line 1:
-
When objects are transfered to another [[vat]], they arrive as [[far reference|far references]] by default. To reconstruct the object as a [[near reference]] in the receiving vat, Pass By Construction (pbc) can be used.
+
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]]).
 +
 
 +
{{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:
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:
Line 10: Line 16:
</code>
</code>
-
==Example==
+
===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.
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.
Line 59: Line 65:
? Thing: &lt;Vector 6.6 7.7&gt;</pre>
? Thing: &lt;Vector 6.6 7.7&gt;</pre>
 +
 +
{{stub}}
 +
[[Category:ELib specification]]

Latest revision as of 22:48, 20 April 2011

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).

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 systems serialize any object approved by the pbc auditor as the portrayal returned by its __optUncall/0 method. For example, this is an object which will always arrive as the number 3:

   def foo implements pbc {
       to __optUncall() { return [1, "add", [2]] }
       # ...
   }

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"

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(`<Vector $x $y>`)}
        }
        return vector
    }
    to __optUncall() :any {
        return [<import>, "get", ["tests.makeVector"]]
    }
}

Example of usage:

# create a new Vector object
? def makeVector := <import:tests.makeVector>
# value: <makeVector>

? def vector := makeVector(6.6,7.7)
# value: <Vector 6.6 7.7>

? introducer.onTheAir()
# value: ["3DES_SDH_M2", "3DES_SDH_M"]

# function for creating a new local vat
? def seedVatAuthor := <elang:interp.seedVatAuthor>(<unsafe>).virtualize(introducer)
# value: <virtualSeedVat>

# 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: [<Promise>, <Vat newVirtualSeedVat in <runs in newVirtualSeedVat>>]

# pass the pbc object into the new vat
? scriptObj <- run(vector)
# value: <Remote Promise>

? Thing: <Vector 6.6 7.7>
This page is a stub; it should be expanded with more information. If doing so, check the original E web site and the mailing list archives for content which could be moved into this page.
Personal tools
more tools