Filter arguments passed to mathjs calls by type so that error messages are not too weird
This commit is contained in:
		
							parent
							
								
									feb0284a89
								
							
						
					
					
						commit
						2265254531
					
				| 
						 | 
				
			
			@ -29,3 +29,9 @@ describe("builtin exception", () => {
 | 
			
		|||
    expectEvalToBe("testZadanga(1)", "Error(JS Exception: Error: Undefined function testZadanga)")
 | 
			
		||||
  )
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
Skip.describe("error reporting from collection functions", () => {
 | 
			
		||||
  testEval("arr = [normal(3,2)]; map(arr, zarathsuzaWasHere)", "") 
 | 
			
		||||
  // FIXME: returns "Error(Function not found: map(Array,Symbol))"
 | 
			
		||||
  // Actually this error is correct but not informative
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -149,7 +149,8 @@ let callInternal = (call: functionCall, environment, reducer: ExpressionT.reduce
 | 
			
		|||
  | ("reduceReverse", [EvArray(aValueArray), initialValue, EvLambda(aLambdaValue)]) =>
 | 
			
		||||
    doReduceReverseArray(aValueArray, initialValue, aLambdaValue)
 | 
			
		||||
  | ("reverse", [EvArray(aValueArray)]) => aValueArray->Belt.Array.reverse->EvArray->Ok
 | 
			
		||||
  | call => callMathJs(call)
 | 
			
		||||
  | (_, [EvBool(_)])  | (_, [EvNumber(_)]) | (_, [EvString(_)]) | (_, [EvBool(_), EvBool(_)])  | (_, [EvNumber(_), EvNumber(_)]) | (_, [EvString(_), EvString(_)]) => callMathJs(call)
 | 
			
		||||
  | call => Error(REFunctionNotFound(call->functionCallToCallSignature->functionCallSignatureToString)) // Report full type signature as error
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ type errorValue =
 | 
			
		|||
  | REOperationError(Operation.operationError)
 | 
			
		||||
  | REExpressionExpected
 | 
			
		||||
  | REFunctionExpected(string)
 | 
			
		||||
  | REFunctionNotFound(string)
 | 
			
		||||
  | REJavaScriptExn(option<string>, option<string>) // Javascript Exception
 | 
			
		||||
  | REMacroNotFound(string)
 | 
			
		||||
  | RENotAFunction(string)
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +30,7 @@ let errorToString = err =>
 | 
			
		|||
  | REAssignmentExpected => "Assignment expected"
 | 
			
		||||
  | REExpressionExpected => "Expression expected"
 | 
			
		||||
  | REFunctionExpected(msg) => `Function expected: ${msg}`
 | 
			
		||||
  | REFunctionNotFound(msg) => `Function not found: ${msg}`
 | 
			
		||||
  | REDistributionError(err) => `Distribution Math Error: ${DistributionTypes.Error.toString(err)}`
 | 
			
		||||
  | REOperationError(err) => `Math Error: ${Operation.Error.toString(err)}`
 | 
			
		||||
  | REJavaScriptExn(omsg, oname) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,3 +104,52 @@ type environment = DistributionOperation.env
 | 
			
		|||
 | 
			
		||||
@genType
 | 
			
		||||
let defaultEnvironment: environment = DistributionOperation.defaultEnv
 | 
			
		||||
 | 
			
		||||
type expresionValueType =
 | 
			
		||||
  | EvtArray
 | 
			
		||||
  | EvtArrayString
 | 
			
		||||
  | EvtBool
 | 
			
		||||
  | EvtCall
 | 
			
		||||
  | EvtDistribution
 | 
			
		||||
  | EvtLambda
 | 
			
		||||
  | EvtNumber
 | 
			
		||||
  | EvtRecord
 | 
			
		||||
  | EvtString
 | 
			
		||||
  | EvtSymbol
 | 
			
		||||
 | 
			
		||||
type functionCallSignature = CallSignature(string, array<expresionValueType>)
 | 
			
		||||
type functionDefinitionSignature = FunctionDefinitionSignature(functionCallSignature, expresionValueType)
 | 
			
		||||
 | 
			
		||||
let valueToValueType = (value) => switch value {
 | 
			
		||||
  | EvArray(_) => EvtArray
 | 
			
		||||
  | EvArrayString(_) => EvtArray
 | 
			
		||||
  | EvBool(_) => EvtBool
 | 
			
		||||
  | EvCall(_) => EvtCall
 | 
			
		||||
  | EvDistribution(_) => EvtDistribution
 | 
			
		||||
  | EvLambda(_) => EvtLambda
 | 
			
		||||
  | EvNumber(_) => EvtNumber
 | 
			
		||||
  | EvRecord(_) => EvtRecord
 | 
			
		||||
  | EvString(_) => EvtArray
 | 
			
		||||
  | EvSymbol(_) => EvtSymbol}
 | 
			
		||||
 | 
			
		||||
let functionCallToCallSignature = (functionCall: functionCall): functionCallSignature => {
 | 
			
		||||
  let (fn, args) = functionCall
 | 
			
		||||
  CallSignature(fn, args->Js.Array2.map(valueToValueType))}
 | 
			
		||||
 | 
			
		||||
let valueTypeToString = (valueType: expresionValueType): string =>
 | 
			
		||||
  switch valueType {
 | 
			
		||||
  | EvtArray => `Array`
 | 
			
		||||
  | EvtArrayString => `ArrayString`
 | 
			
		||||
  | EvtBool => `Bool`
 | 
			
		||||
  | EvtCall => `Call`
 | 
			
		||||
  | EvtDistribution => `Distribution`
 | 
			
		||||
  | EvtLambda => `Lambda`
 | 
			
		||||
  | EvtNumber => `Number`
 | 
			
		||||
  | EvtRecord => `Record`
 | 
			
		||||
  | EvtString => `String`
 | 
			
		||||
  | EvtSymbol => `Symbol`
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
let functionCallSignatureToString = (functionCallSignature: functionCallSignature): string => {
 | 
			
		||||
  let CallSignature(fn, args) = functionCallSignature
 | 
			
		||||
  `${fn}(${args->Js.Array2.map(valueTypeToString)->Js.Array2.toString})`}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user