PassByConstruction
From Erights
(Difference between revisions)
Kevin Reid (Talk | contribs) (terminology, more links) |
Kevin Reid (Talk | contribs) (removing description of portrayals now that they have a separate page) |
||
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. | 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. | ||
- | + | 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> | <code> | ||
Line 9: | Line 9: | ||
} | } | ||
</code> | </code> | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
==Example== | ==Example== |
Revision as of 14:07, 21 April 2007
When objects are transfered to another vat, they arrive as far references by default. To reconstruct the object as a near reference in the receiving vat, Pass By Construction (pbc) can be used.
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 a 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>