pass reducer to dispatch
to define functions that has lambda arguments, dispatching requires a reducer
This commit is contained in:
		
							parent
							
								
									33ee0b27d5
								
							
						
					
					
						commit
						ae48bd6420
					
				|  | @ -1,7 +1,8 @@ | ||||||
| module ExternalLibrary = ReducerInterface.ExternalLibrary |  | ||||||
| module MathJs = Reducer_MathJs |  | ||||||
| module Bindings = Reducer_Expression_Bindings | module Bindings = Reducer_Expression_Bindings | ||||||
|  | module ExpressionT = Reducer_Expression_T | ||||||
|  | module ExternalLibrary = ReducerInterface.ExternalLibrary | ||||||
| module Lambda = Reducer_Expression_Lambda | module Lambda = Reducer_Expression_Lambda | ||||||
|  | module MathJs = Reducer_MathJs | ||||||
| open ReducerInterface.ExpressionValue | open ReducerInterface.ExpressionValue | ||||||
| open Reducer_ErrorValue | open Reducer_ErrorValue | ||||||
| 
 | 
 | ||||||
|  | @ -13,7 +14,10 @@ open Reducer_ErrorValue | ||||||
| 
 | 
 | ||||||
| exception TestRescriptException | exception TestRescriptException | ||||||
| 
 | 
 | ||||||
| let callInternal = (call: functionCall, _environment): result<'b, errorValue> => { | let callInternal = (call: functionCall, _environment, _reducer: ExpressionT.reducerFn): result< | ||||||
|  |   'b, | ||||||
|  |   errorValue, | ||||||
|  | > => { | ||||||
|   let callMathJs = (call: functionCall): result<'b, errorValue> => |   let callMathJs = (call: functionCall): result<'b, errorValue> => | ||||||
|     switch call { |     switch call { | ||||||
|     | ("javascriptraise", [msg]) => Js.Exn.raiseError(toString(msg)) // For Tests |     | ("javascriptraise", [msg]) => Js.Exn.raiseError(toString(msg)) // For Tests | ||||||
|  | @ -79,11 +83,13 @@ let callInternal = (call: functionCall, _environment): result<'b, errorValue> => | ||||||
| 
 | 
 | ||||||
|   switch call { |   switch call { | ||||||
|   // | ("$atIndex", [obj, index]) =>    (toStringWithType(obj) ++ "??~~~~" ++ toStringWithType(index))->EvString->Ok |   // | ("$atIndex", [obj, index]) =>    (toStringWithType(obj) ++ "??~~~~" ++ toStringWithType(index))->EvString->Ok | ||||||
|   | ("$atIndex", [EvArray(aValueArray), EvArray([EvNumber(fIndex)])]) =>    arrayAtIndex(aValueArray, fIndex) |   | ("$atIndex", [EvArray(aValueArray), EvArray([EvNumber(fIndex)])]) => | ||||||
|  |     arrayAtIndex(aValueArray, fIndex) | ||||||
|   | ("$atIndex", [EvRecord(dict), EvArray([EvString(sIndex)])]) => recordAtIndex(dict, sIndex) |   | ("$atIndex", [EvRecord(dict), EvArray([EvString(sIndex)])]) => recordAtIndex(dict, sIndex) | ||||||
|   | ("$constructRecord", [EvArray(arrayOfPairs)]) => constructRecord(arrayOfPairs) |   | ("$constructRecord", [EvArray(arrayOfPairs)]) => constructRecord(arrayOfPairs) | ||||||
|   | ("$exportBindings", [EvRecord(externalBindings)]) => doExportBindings(externalBindings) |   | ("$exportBindings", [EvRecord(externalBindings)]) => doExportBindings(externalBindings) | ||||||
|   | ("$setBindings", [EvRecord(externalBindings), EvSymbol(symbol), value]) =>    doSetBindings(externalBindings, symbol, value) |   | ("$setBindings", [EvRecord(externalBindings), EvSymbol(symbol), value]) => | ||||||
|  |     doSetBindings(externalBindings, symbol, value) | ||||||
|   | ("inspect", [value, EvString(label)]) => inspectLabel(value, label) |   | ("inspect", [value, EvString(label)]) => inspectLabel(value, label) | ||||||
|   | ("inspect", [value]) => inspect(value) |   | ("inspect", [value]) => inspect(value) | ||||||
|   // | ("map", [EvArray(aValueArray), EvLambda(lambdaValue)]) => doMapArray(aValueArray, aLambdaValue) |   // | ("map", [EvArray(aValueArray), EvLambda(lambdaValue)]) => doMapArray(aValueArray, aLambdaValue) | ||||||
|  | @ -95,12 +101,16 @@ let callInternal = (call: functionCall, _environment): result<'b, errorValue> => | ||||||
| /* | /* | ||||||
|   Reducer uses Result monad while reducing expressions |   Reducer uses Result monad while reducing expressions | ||||||
| */ | */ | ||||||
| let dispatch = (call: functionCall, environment): result<expressionValue, errorValue> => | let dispatch = (call: functionCall, environment, reducer: ExpressionT.reducerFn): result< | ||||||
|  |   expressionValue, | ||||||
|  |   errorValue, | ||||||
|  | > => | ||||||
|   try { |   try { | ||||||
|  |     let callInternalWithReducer = (call, environment) => callInternal(call, environment, reducer) | ||||||
|     let (fn, args) = call |     let (fn, args) = call | ||||||
|     // There is a bug that prevents string match in patterns |     // There is a bug that prevents string match in patterns | ||||||
|     // So we have to recreate a copy of the string |     // So we have to recreate a copy of the string | ||||||
|     ExternalLibrary.dispatch((Js.String.make(fn), args), environment, callInternal) |     ExternalLibrary.dispatch((Js.String.make(fn), args), environment, callInternalWithReducer) | ||||||
|   } catch { |   } catch { | ||||||
|   | Js.Exn.Error(obj) => REJavaScriptExn(Js.Exn.message(obj), Js.Exn.name(obj))->Error |   | Js.Exn.Error(obj) => REJavaScriptExn(Js.Exn.message(obj), Js.Exn.name(obj))->Error | ||||||
|   | _ => RETodo("unhandled rescript exception")->Error |   | _ => RETodo("unhandled rescript exception")->Error | ||||||
|  |  | ||||||
|  | @ -77,7 +77,8 @@ and reduceValueList = (valueList: list<expressionValue>, environment): result< | ||||||
|   'e, |   'e, | ||||||
| > => | > => | ||||||
|   switch valueList { |   switch valueList { | ||||||
|   | list{EvCall(fName), ...args} => (fName, args->Belt.List.toArray)->BuiltIn.dispatch(environment) |   | list{EvCall(fName), ...args} => | ||||||
|  |     (fName, args->Belt.List.toArray)->BuiltIn.dispatch(environment, reduceExpression) | ||||||
| 
 | 
 | ||||||
|   | list{EvLambda(lamdaCall), ...args} => |   | list{EvLambda(lamdaCall), ...args} => | ||||||
|     Lambda.doLambdaCall(lamdaCall, args, environment, reduceExpression) |     Lambda.doLambdaCall(lamdaCall, args, environment, reduceExpression) | ||||||
|  |  | ||||||
|  | @ -55,6 +55,5 @@ let applyParametersToLambda = ( | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| let doLambdaCall = (lambdaValue: ExpressionValue.lambdaValue, args, environment, reducer) => { | let doLambdaCall = (lambdaValue: ExpressionValue.lambdaValue, args, environment, reducer) => | ||||||
|   applyParametersToLambda(lambdaValue, args, environment, reducer) |   applyParametersToLambda(lambdaValue, args, environment, reducer) | ||||||
| } |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user