Pointers and references: Difference between revisions

Add Ecstasy example
(Add Ecstasy example)
 
(5 intermediate revisions by 3 users not shown)
Line 494:
===Pointers===
Pointers are declared like so, optionally with the type or program they will point to:
<syntaxhighlight lang="cobolcobolfree"> 01 ptr USAGE USAGEIS POINTER TO Some-Type.
01 prog-ptr USAGE USAGEIS PROGRAM-POINTER TO "some-program". *> TO is optional</syntaxhighlight>
 
<code>USAGE POINTER</code> data items are used in conjunction with <code>BASED</code> data items, with <code>ALLOCATE</code> optionally giving a pointer the address of the allocated memory. Pointers can also be used to free allocated memory, which will cause the pointer to be set to <code>NULL</code>.
<syntaxhighlight lang="cobolcobolfree">ALLOCATE01 heap-item RETURNINGPICTURE IS X, ptrBASED.
 
...
PROCEDURE DIVISION.
FREE ptr</syntaxhighlight>
ALLOCATE heap-item RETURNING ptr
*> ...
FREE ptr</syntaxhighlight>
 
<code>USAGE PROGRAM-POINTER</code> data items are used to point to programs and their entry points.
{{works with|OpenCOBOL}}
{{works with|Visual COBOL}}
<syntaxhighlight lang="cobolcobolfree">SET prog-ptr TO ENTRY "some-program"</syntaxhighlight>
 
Both types of pointer support basic pointer arithmetic.
<syntaxhighlight lang="cobolcobolfree">SET ptr1 UP BY 10
SET ptr2 DOWN BY LENGTH OF foo</syntaxhighlight>
 
Pointers can also be set to point to where other pointers are pointing or to other pointers themselves.
<syntaxhighlight lang="cobolcobolfree">SET ptr1 TO ptr2 *> ptr1 points to where ptr2 points
SET ptr2 TO ADDRESS OF ptr3 *> ptr2 points to ptr3</syntaxhighlight>
 
To alter the value pointed to by a pointer, the <code>SET</code> statement is needed once again and is used to set the address of <code>BASED</code> or <code>LINKAGE SECTION</code> data items, which can then be used to modify the data.
<syntaxhighlight lang="cobolcobolfree">SET ADDRESS OF foo TO ptr
MOVE "bar" TO foo</syntaxhighlight>
 
===References===
Object references are declared like so, optionally with the class/interface they will reference:
<syntaxhighlight lang="cobolcobolfree"> 01 obj USAGE USAGEIS OBJECT-REFERENCE "some-object".</syntaxhighlight>
 
They contain either a reference to an object or <code>NULL</code>.
 
They are initialised using by invoking a class constructor, and set using the <code>SET</code> statement.
<syntaxhighlight lang="cobolcobolfree">INVOKE SomeClass "new" RETURNING obj-ref
SET another-obj-ref TO obj-ref</syntaxhighlight>
 
Line 672 ⟶ 675:
→ 666
</syntaxhighlight>
 
=={{header|Ecstasy}}==
In Ecstasy, all values are references to objects. These references are like pointers in C, but address information is not accessible, and no arithmetic operations can be performed on them. Additionally, each reference is itself an object, providing reflective information about the reference.
 
Objects are always accessed and manipulated through references, using the <code>.</code> ("dot") operator.
 
Ecstasy uses call-by-value. When passing arguments, all arguments are references, passed by value.
 
<syntaxhighlight lang="ecstasy">
module test {
@Inject Console console;
 
public class Point(Int x, Int y) {
@Override String toString() = $"({x},{y})";
}
 
void run() {
Point p = new Point(0, 0);
endp.x = 7;
elsep.y $= p.x;
console.print($"{p=}");
 
// obtain the reference object itself
Ref<Point> r = &p;
console.print($"{r.actualType=}");
}
}
</syntaxhighlight>
 
{{out}}
<pre>
x$ xec test
p=(7,7)
r.actualType=Point
</pre>
 
=={{header|Forth}}==
Line 1,008 ⟶ 1,046:
all(.[]; type == "string" or (type == "number" and floor == .));
 
# The JSON Pointer spec allows 0 both for indexing an array and for retrieving a key named "0".
# like getpath() but for jsonpointer pointers
# disambiguate($k) accordingly disambiguates $k w.r.t. `.`.
# $k should be a string or integer.
# If $k is a string and . is an object then: if has($k) then $k else null end.
# If $k is an integer and . is an array, then emit $k.
# If $k is an integer-valued string and . is an array then exit $k|tonumber.
# Otherwise emit null
def disambiguate( $k ):
if ($k|type) == "string"
then if type == "object" then $k
elif type == "array" and ($k|test("^[0-9]+$"))
then ($k|tonumber)
else null
. as $in end
elif ($k|type) == "number" and type == "array"
then $k
else null
end;
 
# $array should be an array of strings and integers.
# Emit the disambiguated array, suitable for running getpath/1.
# Emit null if disambiguation fails at any point.
def disambiguatePath($array):
. as $in
| reduce $array[] as $x ([];
if . then . as $path
| ($in | getpath($path) | disambiguate($x)) as $y
| if $refy then getpointer(. + [ $ref)y ]
else null
end
else .
end);
 
# getjsonpointer() is like getpath() but for jsonpointer pointers
def getjsonpointer($pointer):
if $pointer == "" then . # special case
else
# first decode ~1, then ~0
($pointer | split("/") | .[1:]
| map(gsub("~1"; "/") | gsub("~0"; "~") | if test("^[0-9]+$") then tonumber else . end)) as $jqpatharray
| disambiguatePath($array) as $apath
| getpath($jqpath);
| if $apath then getpath($apath) else null end
end;
 
# like getpath() but allow $p to be a jsonpointer or an array
Line 1,027 ⟶ 1,102:
def deref($pointer):
def resolve($x):
if ($x | type) == "object"
. as $in
|then if ($x["$ref"] |as type) == "object"$ref
| thenif $x["$ref"] asthen getpointer($ref)
| if $ref then getpointer($ref)
else $x
end
else $x
end;
else $x
end;
 
if ($pointer|type) == "string"
Line 2,129 ⟶ 2,203:
 
The following example illustrates the difference by passing both value and reference type parameters to a function. Note that in Wren parameters are always passed by value.
<syntaxhighlight lang="ecmascriptwren">// This function takes a string (behaves like a value type) and a list (reference type).
// The value and the reference are copied to their respective parameters.
var f = Fn.new { |s, l|
162

edits