143 lines
4.1 KiB
C#
143 lines
4.1 KiB
C#
using Parser.Objects;
|
|
using System;
|
|
|
|
namespace Parser.MFunctions
|
|
{
|
|
public static class MOperations
|
|
{
|
|
public static MObject? Colon(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
var array = CreateRangeMatrix(lValue, rValue);
|
|
return MObject.CreateDoubleMatrix(array);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private static double[,] CreateRangeMatrix(double lValue, double rValue)
|
|
{
|
|
var length = (int)Math.Round(rValue - lValue) + 1;
|
|
var result = new double[1, length];
|
|
for (var i = 0; i < length; i++)
|
|
{
|
|
result[0, i] = lValue + i;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static MObject? Plus(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateDoubleNumber(lValue + rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? Minus(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateDoubleNumber(lValue - rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? Star(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateDoubleNumber(lValue * rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? Slash(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateDoubleNumber(lValue / rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? Greater(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateLogical(lValue > rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? GreaterOrEquals(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateLogical(lValue >= rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? Less(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateLogical(lValue < rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? LessOrEquals(MObject left, MObject right)
|
|
{
|
|
if (left is MDoubleNumber { Value: var lValue }
|
|
&& right is MDoubleNumber { Value: var rValue })
|
|
{
|
|
return MObject.CreateLogical(lValue <= rValue);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? Minus(MObject operand)
|
|
{
|
|
if (operand is MDoubleNumber { Value: var value })
|
|
{
|
|
return MObject.CreateDoubleNumber(-value);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static MObject? ArraySlice(MObject array, MObject range)
|
|
{
|
|
if (array is MDoubleMatrix m
|
|
&& range is MDoubleNumber { Value: var doubleIndex })
|
|
{
|
|
var index = (int)doubleIndex;
|
|
return MObject.CreateDoubleNumber(m[index]);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|