Merge branch 'reducer-dev-F-ifthenelse' into ternary
packages/squiggle-lang/src/rescript/Reducer/Reducer_Dispatch/Reducer_Dispatch_BuiltInMacros.res packages/squiggle-lang/src/rescript/Reducer/Reducer_Expression/Reducer_Expression.res packages/squiggle-lang/src/rescript/Reducer/Reducer_Expression/Reducer_Expression_Builder.res packages/squiggle-lang/src/rescript/Reducer/Reducer_MathJs/Reducer_MathJs_ToExpression.res
This commit is contained in:
commit
888b615445
|
@ -66,4 +66,9 @@ describe("MathJs parse", () => {
|
||||||
describe("comments", () => {
|
describe("comments", () => {
|
||||||
testDescriptionParse("define", "1 # This is a comment", "1")
|
testDescriptionParse("define", "1 # This is a comment", "1")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("ternary operator", () => {
|
||||||
|
testParse("1 ? 2 : 3", "ternary(1, 2, 3)")
|
||||||
|
testParse("1 ? 2 : 3 ? 4 : 5", "ternary(1, 2, ternary(3, 4, 5))")
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -9,7 +9,7 @@ type node = {"type": string, "isNode": bool, "comment": string}
|
||||||
type arrayNode = {...node, "items": array<node>}
|
type arrayNode = {...node, "items": array<node>}
|
||||||
type block = {"node": node}
|
type block = {"node": node}
|
||||||
type blockNode = {...node, "blocks": array<block>}
|
type blockNode = {...node, "blocks": array<block>}
|
||||||
//conditionalNode
|
type conditionalNode = {...node, "condition": node, "trueExpr": node, "falseExpr": node}
|
||||||
type constantNode = {...node, "value": unit}
|
type constantNode = {...node, "value": unit}
|
||||||
type functionAssignmentNode = {...node, "name": string, "params": array<string>, "expr": node}
|
type functionAssignmentNode = {...node, "name": string, "params": array<string>, "expr": node}
|
||||||
type indexNode = {...node, "dimensions": array<node>}
|
type indexNode = {...node, "dimensions": array<node>}
|
||||||
|
@ -31,6 +31,7 @@ external castAssignmentNode: node => assignmentNode = "%identity"
|
||||||
external castAssignmentNodeWAccessor: node => assignmentNodeWAccessor = "%identity"
|
external castAssignmentNodeWAccessor: node => assignmentNodeWAccessor = "%identity"
|
||||||
external castAssignmentNodeWIndex: node => assignmentNodeWIndex = "%identity"
|
external castAssignmentNodeWIndex: node => assignmentNodeWIndex = "%identity"
|
||||||
external castBlockNode: node => blockNode = "%identity"
|
external castBlockNode: node => blockNode = "%identity"
|
||||||
|
external castConditionalNode: node => conditionalNode = "%identity"
|
||||||
external castConstantNode: node => constantNode = "%identity"
|
external castConstantNode: node => constantNode = "%identity"
|
||||||
external castFunctionAssignmentNode: node => functionAssignmentNode = "%identity"
|
external castFunctionAssignmentNode: node => functionAssignmentNode = "%identity"
|
||||||
external castFunctionNode: node => functionNode = "%identity"
|
external castFunctionNode: node => functionNode = "%identity"
|
||||||
|
@ -58,6 +59,7 @@ type mathJsNode =
|
||||||
| MjArrayNode(arrayNode)
|
| MjArrayNode(arrayNode)
|
||||||
| MjAssignmentNode(assignmentNode)
|
| MjAssignmentNode(assignmentNode)
|
||||||
| MjBlockNode(blockNode)
|
| MjBlockNode(blockNode)
|
||||||
|
| MjConditionalNode(conditionalNode)
|
||||||
| MjConstantNode(constantNode)
|
| MjConstantNode(constantNode)
|
||||||
| MjFunctionAssignmentNode(functionAssignmentNode)
|
| MjFunctionAssignmentNode(functionAssignmentNode)
|
||||||
| MjFunctionNode(functionNode)
|
| MjFunctionNode(functionNode)
|
||||||
|
@ -82,6 +84,7 @@ let castNodeType = (node: node) => {
|
||||||
| "ArrayNode" => node->castArrayNode->MjArrayNode->Ok
|
| "ArrayNode" => node->castArrayNode->MjArrayNode->Ok
|
||||||
| "AssignmentNode" => node->decideAssignmentNode
|
| "AssignmentNode" => node->decideAssignmentNode
|
||||||
| "BlockNode" => node->castBlockNode->MjBlockNode->Ok
|
| "BlockNode" => node->castBlockNode->MjBlockNode->Ok
|
||||||
|
| "ConditionalNode" => node->castConditionalNode->MjConditionalNode->Ok
|
||||||
| "ConstantNode" => node->castConstantNode->MjConstantNode->Ok
|
| "ConstantNode" => node->castConstantNode->MjConstantNode->Ok
|
||||||
| "FunctionAssignmentNode" => node->castFunctionAssignmentNode->MjFunctionAssignmentNode->Ok
|
| "FunctionAssignmentNode" => node->castFunctionAssignmentNode->MjFunctionAssignmentNode->Ok
|
||||||
| "FunctionNode" => node->castFunctionNode->MjFunctionNode->Ok
|
| "FunctionNode" => node->castFunctionNode->MjFunctionNode->Ok
|
||||||
|
@ -157,6 +160,10 @@ let rec toString = (mathJsNode: mathJsNode): string => {
|
||||||
| MjAssignmentNode(aNode) =>
|
| MjAssignmentNode(aNode) =>
|
||||||
`${aNode["object"]->toStringSymbolNode} = ${aNode["value"]->toStringMathJsNode}`
|
`${aNode["object"]->toStringSymbolNode} = ${aNode["value"]->toStringMathJsNode}`
|
||||||
| MjBlockNode(bNode) => `{${bNode["blocks"]->toStringBlocks}}`
|
| MjBlockNode(bNode) => `{${bNode["blocks"]->toStringBlocks}}`
|
||||||
|
| MjConditionalNode(cNode) =>
|
||||||
|
`ternary(${toStringMathJsNode(cNode["condition"])}, ${toStringMathJsNode(
|
||||||
|
cNode["trueExpr"],
|
||||||
|
)}, ${toStringMathJsNode(cNode["falseExpr"])})`
|
||||||
| MjConstantNode(cNode) => cNode["value"]->toStringValue
|
| MjConstantNode(cNode) => cNode["value"]->toStringValue
|
||||||
| MjFunctionAssignmentNode(faNode) => faNode->toStringFunctionAssignmentNode
|
| MjFunctionAssignmentNode(faNode) => faNode->toStringFunctionAssignmentNode
|
||||||
| MjFunctionNode(fNode) => fNode->toStringFunctionNode
|
| MjFunctionNode(fNode) => fNode->toStringFunctionNode
|
||||||
|
|
|
@ -113,6 +113,20 @@ let rec fromInnerNode = (mathJsNode: Parse.node): result<expression, errorValue>
|
||||||
aNode["items"]->Belt.List.fromArray->fromNodeList->Result.map(list => ExpressionT.EList(list))
|
aNode["items"]->Belt.List.fromArray->fromNodeList->Result.map(list => ExpressionT.EList(list))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let caseConditionalNode = cndNode => {
|
||||||
|
let rCondition = fromInnerNode(cndNode["condition"])
|
||||||
|
let rTrueExpr = fromInnerNode(cndNode["trueExpr"])
|
||||||
|
let rFalse = fromInnerNode(cndNode["falseExpr"])
|
||||||
|
|
||||||
|
rCondition->Result.flatMap(condition =>
|
||||||
|
rTrueExpr->Result.flatMap(trueExpr =>
|
||||||
|
rFalse->Result.flatMap(falseExpr =>
|
||||||
|
ExpressionBuilder.eFunction("$$ternary", list{condition, trueExpr, falseExpr})->Ok
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
let rFinalExpression: result<expression, errorValue> = switch typedMathJsNode {
|
let rFinalExpression: result<expression, errorValue> = switch typedMathJsNode {
|
||||||
| MjAccessorNode(aNode) => caseAccessorNode(aNode["object"], aNode["index"])
|
| MjAccessorNode(aNode) => caseAccessorNode(aNode["object"], aNode["index"])
|
||||||
| MjArrayNode(aNode) => caseArrayNode(aNode)
|
| MjArrayNode(aNode) => caseArrayNode(aNode)
|
||||||
|
@ -123,6 +137,7 @@ let rec fromInnerNode = (mathJsNode: Parse.node): result<expression, errorValue>
|
||||||
rExpr
|
rExpr
|
||||||
}
|
}
|
||||||
| MjBlockNode(bNode) => bNode["blocks"]->Js.Array2.map(blockToNode)->caseBlock
|
| MjBlockNode(bNode) => bNode["blocks"]->Js.Array2.map(blockToNode)->caseBlock
|
||||||
|
| MjConditionalNode(cndNode) => caseConditionalNode(cndNode)
|
||||||
| MjConstantNode(cNode) =>
|
| MjConstantNode(cNode) =>
|
||||||
cNode["value"]->JavaScript.Gate.jsToEv->Result.flatMap(v => v->ExpressionT.EValue->Ok)
|
cNode["value"]->JavaScript.Gate.jsToEv->Result.flatMap(v => v->ExpressionT.EValue->Ok)
|
||||||
| MjFunctionAssignmentNode(faNode) => caseFunctionAssignmentNode(faNode)
|
| MjFunctionAssignmentNode(faNode) => caseFunctionAssignmentNode(faNode)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user