Parametric polymorphism: Difference between revisions

Content deleted Content added
Lerno (talk | contribs)
Updated C3
Miks1965 (talk | contribs)
PascalABC.NET
 
(5 intermediate revisions by 3 users not shown)
Line 199:
=={{header|C++}}==
 
<syntaxhighlight lang="cpp">template<classtypename T>
class tree {
{
T value;
tree *left;
Line 212 ⟶ 211:
 
<syntaxhighlight lang="cpp">template<class T>
void tree<T>::replace_all (T new_value) {
{
value = new_value;
if (left != NULLnullptr)
left->replace_all (new_value);
if (right != NULLnullptr)
right->replace_all (new_value);
}</syntaxhighlight>
 
Line 308 ⟶ 306:
 
{{omit from|Clojure}}
 
=={{header|COBOL}}==
 
<syntaxhighlight lang="cobolfree"> >>SOURCE FORMAT IS FREE
IDENTIFICATION DIVISION.
CLASS-ID. Tree INHERITS FROM Base USING X.
DATE-WRITTEN. 20240702.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
OBJECT-COMPUTER.
MEMORY SIZE IS 1073741824 CHARACTERS.
REPOSITORY.
CLASS Base.
CLASS X.
IDENTIFICATION DIVISION.
OBJECT.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 ws-value USAGE IS OBJECT REFERENCE X ONLY.
77 ws-left USAGE IS OBJECT REFERENCE Tree ONLY.
77 ws-right USAGE IS OBJECT REFERENCE Tree ONLY.
PROCEDURE DIVISION.
IDENTIFICATION DIVISION.
METHOD-ID. replace_all.
DATA DIVISION.
LINKAGE SECTION.
77 new_value USAGE IS OBJECT REFERENCE X ONLY.
PROCEDURE DIVISION USING BY REFERENCE new_value.
MOVE new_value TO ws-value.
IF ws-left IS NOT EQUAL TO NULL THEN
INVOKE ws-left "replace_all" USING BY REFERENCE new_value.
IF ws-right IS NOT EQUAL TO NULL THEN
INVOKE ws-right "replace_all" USING BY REFERENCE new_value.
GOBACK.
END METHOD replace_all.
END OBJECT.
END CLASS Tree.</syntaxhighlight>
 
=={{header|Common Lisp}}==
Line 495 ⟶ 530:
# value: <tree></syntaxhighlight>
 
=={{header|F_Sharp|F#FreeBASIC}}==
{{trans|Visual Basic .NET}}
FreeBASIC does not support object-oriented programming, so we will use a more procedural approach.
<syntaxhighlight lang="vbnet">Type BinaryTree
valor As Integer
izda As BinaryTree Ptr
dcha As BinaryTree Ptr
End Type
 
Sub PrintTree(t As BinaryTree Ptr, depth As Integer)
If t = 0 Then Exit Sub
Print String(depth, Chr(9)); t->valor
PrintTree(t->izda, depth + 1)
PrintTree(t->dcha, depth + 1)
End Sub
 
Dim As BinaryTree b = Type(6)
Dim As BinaryTree bLeft = Type(5)
Dim As BinaryTree bRight = Type(7)
b.izda = @bLeft
b.dcha = @bRight
 
PrintTree(@b, 0)</syntaxhighlight>
 
=={{header|F_Sharp|F#}}==
<syntaxhighlight lang="fsharp">
namespace RosettaCode
Line 986 ⟶ 1,044:
 
{{omit from|Oforth|Oforth is nt statically-typed language}}
 
=={{header|PascalABC.NET}}==
<syntaxhighlight lang="delphi">
type Node<T> = auto class
data: T;
left,right: Node<T>;
end;
 
function CreateTree(n: integer): Node<integer>;
begin
if n = 0 then
Result := nil
else
Result := new Node<integer>(
Random(100),
CreateTree((n-1) div 2),
CreateTree(n-1 - (n-1) div 2)
);
end;
 
procedure InfixTraverse<T>(root: Node<T>; act: T -> ());
begin
if root = nil then
exit;
InfixTraverse(root.left,act);
act(root.data);
InfixTraverse(root.right,act);
end;
 
begin
var tree := CreateTree(10);
Println(tree);
InfixTraverse(tree, x -> Print(x));
end.
</syntaxhighlight>
{{out}}
<pre>
(58,(52,(3,nil,nil),(35,nil,(25,nil,nil))),(29,(3,nil,(50,nil,nil)),(2,nil,(86,nil,nil))))
3 52 35 25 58 3 50 29 2 86
</pre>
 
=={{header|Phix}}==
Line 1,141 ⟶ 1,239:
-> NIL</pre>
 
=={{header|RacketProlog}}==
{{works with|SWI Prolog}}
SWI-Prolog does not support object-oriented programming, but we can simulate it.
<syntaxhighlight lang="prolog">% Tree Definition
tree(leaf(_)).
tree(branch(Left, Right)) :- tree(Left), tree(Right).
 
% Definition of the addone function
Typed Racket has parametric polymorphism:
addone(X, Y) :- Y is X + 1.
 
% Definition of treewalk
treewalk(leaf(Value), Func, leaf(NewValue)) :- call(Func, Value, NewValue).
treewalk(branch(Left, Right), Func, branch(NewLeft, NewRight)) :-
treewalk(Left, Func, NewLeft),
treewalk(Right, Func, NewRight).
 
% Execution
run :-
X = branch(leaf(2), branch(leaf(3),leaf(4))),
treewalk(X, addone, Y),
write(Y).</syntaxhighlight>
 
=={{header|Racket}}==
Typed Racket has parametric polymorphism:
<syntaxhighlight lang="racket">
#lang typed/racket
Line 1,577 ⟶ 1,695:
 
Fortunately, we can simulate PP by passing an extra parameter to a collection class's contructor to specify the type of values to be used for that particular instantiation. We can then use this to guard against the wrong type of values being passed to the class's other methods.
<syntaxhighlight lang="ecmascriptwren">class BinaryTree {
construct new(T, value) {
if (!(T is Class)) Fiber.abort ("T must be a class.")