Nelson allows to overload all functions and all operators available in the interpreter.
Some examples are better than a long text.
In this example, we want to change behavior of gamma function for double type.
Creates a function file '@double/gamma.m'
function r = gamma(A)
disp('gamma function overload called.')
r = builtin('gamma', A + 100 )
endadd parent directory of '@double' directory and try to call gamma with a double or single type.
If you want to continue to call standard function, see builtin function.
In this example, we want to create an 'complexObj' i.e an special complex number object.
We create an function:
function r = complexObj(a, b)
s.r = a;
s.i = b;
r = class(s, 'complexObj');
endThis function creates in fact a struct typed 'complexObj', you can consider it as an constructor.
o = complexObj(5, 4);You can check the new 'user-defined' type:
>> class(o)
ans =
complexObjIf you forget the ";" at the end. You have:
>> o = complexObj(5, 4)
Error:
Check for incorrect argument data type or missing argument in call to function 'cos'.It is normal because when you create an overloaded object, you need to also create dedicated display (@complexObj/display.m).
function display(obj)
disp('complexObj display:')
disp('real part');
disp(obj.r);
disp('imag part');
disp(obj.i);
endand extraction function:
function r = subsref(varargin)
obj = varargin{1};
if varargin{2} == 1
r = obj.r;
else
r = obj.i;
end
endResult:
>> o = complexObj(5, 4)
o =
complexObj_disp:
real part
5.0000
imag part
4.0000And if you want to add to 'complexObj', you need also to define: '@complexObj/plus.m'
function r = plus(a, b)
% stupid addition algo.
R1 = a.r + b.r;
R2 = a.i + b.i;
r = complexObj(R1, R2);
endResult of o + o:
>> o + o
ans =
complexObj_disp:
real part
10.0000
imag part
8.0000This example is available here
This syntax