|
|
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]]).
| + | An object declared as, for example |
- | | + | |
- | {{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> | | <code> |
| def foo implements pbc { | | def foo implements pbc { |
- | to [[Miranda optUncall|__optUncall]]() { return [1, "add", [2]] } | + | to __optUncall() { return [1, "add", [2]] } |
| # ... | | # ... |
| } | | } |
| </code> | | </code> |
- | | + | will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, "add", [2])”) to create the object as received. |
- | ===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(`<Vector $x $y>`)}
| + | |
- | }
| + | |
- | return vector
| + | |
- | }
| + | |
- | to __optUncall() :any {
| + | |
- | return [<import>, "get", ["tests.makeVector"]]
| + | |
- | }
| + | |
- | }</pre>
| + | |
- | | + | |
- | Example of usage:
| + | |
- | | + | |
- | <pre># 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></pre>
| + | |
- | | + | |
- | {{stub}}
| + | |
- | [[Category:ELib specification]]
| + | |
will be passed-by-construction across CapTP. This means that its __optUncall() method will be called on the sending side, the elements of the result triple will be passed, and the corresponding triple as received will be called (here, as “E.call(1, "add", [2])”) to create the object as received.