remove IEvArrayString, implement __result__, cleanups

This commit is contained in:
Vyacheslav Matyukhin 2022-09-18 03:15:58 +04:00
parent 065a7aeec0
commit 43635bd39b
No known key found for this signature in database
GPG Key ID: 3D2A774C5489F96C
16 changed files with 114 additions and 84 deletions

View File

@ -152,12 +152,6 @@ export const ExpressionViewer: React.FC<Props> = ({ value, width }) => {
// {() => value.value} // {() => value.value}
// </VariableBox> // </VariableBox>
// ); // );
case SqValueTag.ArrayString:
return (
<VariableBox value={value} heading="Array String">
{() => value.value.map((r) => `"${r}"`).join(", ")}
</VariableBox>
);
case SqValueTag.Date: case SqValueTag.Date:
return ( return (
<VariableBox value={value} heading="Date"> <VariableBox value={value} heading="Date">
@ -242,24 +236,24 @@ export const ExpressionViewer: React.FC<Props> = ({ value, width }) => {
</VariableBox> </VariableBox>
); );
} }
case SqValueTag.Module: { // case SqValueTag.Module: {
return ( // return (
<VariableList value={value} heading="Module"> // <VariableList value={value} heading="Module">
{(_) => // {(_) =>
value.value // value.value
.entries() // .entries()
.filter(([key, _]) => !key.match(/^(__result__)$/)) // .filter(([key, _]) => !key.match(/^(__result__)$/))
.map(([key, r]) => ( // .map(([key, r]) => (
<ExpressionViewer // <ExpressionViewer
key={key} // key={key}
value={r} // value={r}
width={width !== undefined ? width - 20 : width} // width={width !== undefined ? width - 20 : width}
/> // />
)) // ))
} // }
</VariableList> // </VariableList>
); // );
} // }
case SqValueTag.Record: case SqValueTag.Record:
const plot = makePlot(value.value); const plot = makePlot(value.value);
if (plot) { if (plot) {

View File

@ -4,7 +4,7 @@ open Reducer_TestHelpers
describe("Parse ternary operator", () => { describe("Parse ternary operator", () => {
testParseToBe( testParseToBe(
"true ? 'YES' : 'NO'", "true ? 'YES' : 'NO'",
"Ok({(:$$_ternary_$$ true 'YES' 'NO')})", "Ok(true ? ('YES') : ('NO'))",
) )
}) })

View File

@ -11,6 +11,7 @@ describe("eval", () => {
testEvalToBe("(1+2)*3", "Ok(9)") testEvalToBe("(1+2)*3", "Ok(9)")
testEvalToBe("2>1", "Ok(true)") testEvalToBe("2>1", "Ok(true)")
testEvalToBe("concat('a ', 'b')", "Ok('a b')") testEvalToBe("concat('a ', 'b')", "Ok('a b')")
testEvalToBe("concat([3,4], [5,6,7])", "Ok([3,4,5,6,7])")
testEvalToBe("log(10)", "Ok(2.302585092994046)") testEvalToBe("log(10)", "Ok(2.302585092994046)")
testEvalToBe("cos(10)", "Ok(-0.8390715290764524)") testEvalToBe("cos(10)", "Ok(-0.8390715290764524)")
// TODO more built ins // TODO more built ins

View File

@ -1,5 +1,5 @@
import * as RSRecord from "../rescript/ForTS/ForTS_SquiggleValue/ForTS_SquiggleValue_Record.gen"; import * as RSRecord from "../rescript/ForTS/ForTS_SquiggleValue/ForTS_SquiggleValue_Record.gen";
import { wrapValue } from "./SqValue"; import { SqRecordValue, wrapValue } from "./SqValue";
import { SqValueLocation } from "./SqValueLocation"; import { SqValueLocation } from "./SqValueLocation";
type T = RSRecord.squiggleValue_Record; type T = RSRecord.squiggleValue_Record;
@ -16,4 +16,11 @@ export class SqRecord {
toString() { toString() {
return RSRecord.toString(this._value); return RSRecord.toString(this._value);
} }
asValue() {
return new SqRecordValue(
RSRecord.toSquiggleValue(this._value),
this.location
);
}
} }

View File

@ -44,14 +44,6 @@ export class SqArrayValue extends SqAbstractValue {
} }
} }
export class SqArrayStringValue extends SqAbstractValue {
tag = Tag.ArrayString as const;
get value() {
return this.valueMethod(RSValue.getArrayString);
}
}
export class SqBoolValue extends SqAbstractValue { export class SqBoolValue extends SqAbstractValue {
tag = Tag.Bool as const; tag = Tag.Bool as const;
@ -150,7 +142,6 @@ export class SqVoidValue extends SqAbstractValue {
const tagToClass = { const tagToClass = {
[Tag.Array]: SqArrayValue, [Tag.Array]: SqArrayValue,
[Tag.ArrayString]: SqArrayStringValue,
[Tag.Bool]: SqBoolValue, [Tag.Bool]: SqBoolValue,
[Tag.Date]: SqDateValue, [Tag.Date]: SqDateValue,
[Tag.Declaration]: SqDeclarationValue, [Tag.Declaration]: SqDeclarationValue,
@ -169,7 +160,6 @@ const tagToClass = {
// type SqValue = typeof tagToClass[keyof typeof tagToClass]; // type SqValue = typeof tagToClass[keyof typeof tagToClass];
export type SqValue = export type SqValue =
| SqArrayValue | SqArrayValue
| SqArrayStringValue
| SqBoolValue | SqBoolValue
| SqDateValue | SqDateValue
| SqDeclarationValue | SqDeclarationValue

View File

@ -13,9 +13,6 @@ type squiggleValue_Lambda = ForTS_SquiggleValue_Lambda.squiggleValue_Lambda //us
@module("./ForTS_SquiggleValue_tag") @scope("squiggleValueTag") @module("./ForTS_SquiggleValue_tag") @scope("squiggleValueTag")
external svtArray_: string = "Array" external svtArray_: string = "Array"
@module("./ForTS_SquiggleValue_tag") @scope("squiggleValueTag")
external svtArrayString_: string = "ArrayString"
@module("./ForTS_SquiggleValue_tag") @scope("squiggleValueTag") @module("./ForTS_SquiggleValue_tag") @scope("squiggleValueTag")
external svtBool_: string = "Bool" external svtBool_: string = "Bool"
@ -61,7 +58,6 @@ external castEnum: string => squiggleValueTag = "%identity"
let getTag = (variant: squiggleValue): squiggleValueTag => let getTag = (variant: squiggleValue): squiggleValueTag =>
switch variant { switch variant {
| IEvArray(_) => svtArray_->castEnum | IEvArray(_) => svtArray_->castEnum
| IEvArrayString(_) => svtArrayString_->castEnum
| IEvBool(_) => svtBool_->castEnum | IEvBool(_) => svtBool_->castEnum
| IEvDate(_) => svtDate_->castEnum | IEvDate(_) => svtDate_->castEnum
| IEvDeclaration(_) => svtDeclaration_->castEnum | IEvDeclaration(_) => svtDeclaration_->castEnum
@ -94,13 +90,6 @@ let getArray = (variant: squiggleValue): option<squiggleValue_Array> =>
| _ => None | _ => None
} }
@genType
let getArrayString = (variant: squiggleValue): option<array<string>> =>
switch variant {
| IEvArrayString(value) => value->Some
| _ => None
}
@genType @genType
let getBool = (variant: squiggleValue): option<bool> => let getBool = (variant: squiggleValue): option<bool> =>
switch variant { switch variant {

View File

@ -7,3 +7,6 @@ let getKeyValuePairs = (value: squiggleValue_Record): array<(string, squiggleVal
@genType @genType
let toString = (v: squiggleValue_Record) => ReducerInterface_InternalExpressionValue.toStringMap(v) let toString = (v: squiggleValue_Record) => ReducerInterface_InternalExpressionValue.toStringMap(v)
@genType
let toSquiggleValue = (v: squiggleValue_Record): squiggleValue => IEvRecord(v)

View File

@ -1,6 +1,5 @@
export enum squiggleValueTag { export enum squiggleValueTag {
Array = "Array", Array = "Array",
ArrayString = "ArrayString",
Bool = "Bool", Bool = "Bool",
Date = "Date", Date = "Date",
Declaration = "Declaration", Declaration = "Declaration",

View File

@ -93,4 +93,57 @@ let library = [
} }
} }
), ),
makeFn(
"concat",
[FRTypeString, FRTypeString],
inputs => {
switch inputs {
| [IEvString(a), IEvString(b)] => {
let answer = Js.String2.concat(a, b)
answer->Reducer_T.IEvString->Ok
}
| _ => Error(impossibleError)
}
}
),
makeFn(
"concat",
[FRTypeArray(FRTypeAny), FRTypeArray(FRTypeAny)],
inputs => {
switch inputs {
| [IEvArray(originalA), IEvArray(b)] => {
let a = originalA->Js.Array2.copy
let _ = Js.Array2.pushMany(a, b)
a->Reducer_T.IEvArray->Ok
}
| _ => Error(impossibleError)
}
}
),
makeFn(
"inspect",
[FRTypeAny],
inputs => {
switch inputs {
| [value] => {
Js.log(value->ReducerInterface_InternalExpressionValue.toString)
value->Ok
}
| _ => Error(impossibleError)
}
}
),
makeFn(
"inspect",
[FRTypeAny, FRTypeString],
inputs => {
switch inputs {
| [value, IEvString(label)] => {
Js.log(`${label}: ${value->ReducerInterface_InternalExpressionValue.toString}`)
value->Ok
}
| _ => Error(impossibleError)
}
}
),
] ]

View File

@ -34,15 +34,15 @@ let callInternal = (
| call => call->IEV.toStringFunctionCall->MathJs.Eval.eval | call => call->IEV.toStringFunctionCall->MathJs.Eval.eval
} }
let doAddArray = (originalA, b) => { // let doAddArray = (originalA, b) => {
let a = originalA->Js.Array2.copy // let a = originalA->Js.Array2.copy
let _ = Js.Array2.pushMany(a, b) // let _ = Js.Array2.pushMany(a, b)
a->Reducer_T.IEvArray->Ok // a->Reducer_T.IEvArray->Ok
} // }
let doAddString = (a, b) => { // let doAddString = (a, b) => {
let answer = Js.String2.concat(a, b) // let answer = Js.String2.concat(a, b)
answer->Reducer_T.IEvString->Ok // answer->Reducer_T.IEvString->Ok
} // }
let inspect = (value: Reducer_T.value) => { let inspect = (value: Reducer_T.value) => {
Js.log(value->IEV.toString) Js.log(value->IEV.toString)
@ -107,10 +107,10 @@ let callInternal = (
// | ("$_typeTuple_$", [IEvArray(elems)]) => TypeBuilder.typeTuple(elems) // | ("$_typeTuple_$", [IEvArray(elems)]) => TypeBuilder.typeTuple(elems)
// | ("$_typeArray_$", [elem]) => TypeBuilder.typeArray(elem) // | ("$_typeArray_$", [elem]) => TypeBuilder.typeArray(elem)
// | ("$_typeRecord_$", [IEvRecord(propertyMap)]) => TypeBuilder.typeRecord(propertyMap) // | ("$_typeRecord_$", [IEvRecord(propertyMap)]) => TypeBuilder.typeRecord(propertyMap)
| ("concat", [IEvArray(aValueArray), IEvArray(bValueArray)]) => // | ("concat", [IEvArray(aValueArray), IEvArray(bValueArray)]) =>
doAddArray(aValueArray, bValueArray) // doAddArray(aValueArray, bValueArray)
| ("concat", [IEvString(aValueString), IEvString(bValueString)]) => // | ("concat", [IEvString(aValueString), IEvString(bValueString)]) =>
doAddString(aValueString, bValueString) // doAddString(aValueString, bValueString)
| ("inspect", [value, IEvString(label)]) => inspectLabel(value, label) | ("inspect", [value, IEvString(label)]) => inspectLabel(value, label)
| ("inspect", [value]) => inspect(value) | ("inspect", [value]) => inspect(value)
| (_, [IEvBool(_)]) | (_, [IEvBool(_)])

View File

@ -6,8 +6,6 @@ type expression = Reducer_T.expression
let eArray = (anArray: array<T.expression>) => anArray->T.EArray let eArray = (anArray: array<T.expression>) => anArray->T.EArray
let eArrayString = anArray => anArray->T.IEvArrayString->T.EValue
let eBool = aBool => aBool->T.IEvBool->T.EValue let eBool = aBool => aBool->T.IEvBool->T.EValue
let eCall = (fn: expression, args: array<expression>): expression => T.ECall(fn, args) let eCall = (fn: expression, args: array<expression>): expression => T.ECall(fn, args)

View File

@ -11,11 +11,7 @@ let set = (namespace: t, id: string, value): t => {
let mergeFrom = (from: t, to: t): t => { let mergeFrom = (from: t, to: t): t => {
to->Belt.Map.String.reduce(from, (namespace, key, value) => { to->Belt.Map.String.reduce(from, (namespace, key, value) => {
if key != "__result__" {
namespace->set(key, value) namespace->set(key, value)
} else {
namespace
}
}) })
} }

View File

@ -3,7 +3,6 @@ type environment = GenericDist.env
@genType.opaque @genType.opaque
type rec value = type rec value =
| IEvArray(arrayValue) | IEvArray(arrayValue)
| IEvArrayString(array<string>)
| IEvBool(bool) | IEvBool(bool)
| IEvDate(Js.Date.t) | IEvDate(Js.Date.t)
| IEvDeclaration(lambdaDeclaration) | IEvDeclaration(lambdaDeclaration)

View File

@ -17,7 +17,6 @@ type functionCall = (string, array<t>)
let rec toString = (aValue: T.value) => let rec toString = (aValue: T.value) =>
switch aValue { switch aValue {
| IEvArray(anArray) => toStringArray(anArray) | IEvArray(anArray) => toStringArray(anArray)
| IEvArrayString(anArray) => toStringArrayString(anArray)
| IEvBool(aBool) => toStringBool(aBool) | IEvBool(aBool) => toStringBool(aBool)
| IEvDate(date) => toStringDate(date) | IEvDate(date) => toStringDate(date)
| IEvDeclaration(d) => toStringDeclaration(d) | IEvDeclaration(d) => toStringDeclaration(d)
@ -35,10 +34,6 @@ and toStringArray = anArray => {
let args = anArray->Js.Array2.map(each => toString(each))->Js.Array2.toString let args = anArray->Js.Array2.map(each => toString(each))->Js.Array2.toString
`[${args}]` `[${args}]`
} }
and toStringArrayString = anArray => {
let args = anArray->Js.Array2.toString
`[${args}]`
}
and toStringBool = aBool => Js.String.make(aBool) and toStringBool = aBool => Js.String.make(aBool)
and toStringCall = fName => `:${fName}` and toStringCall = fName => `:${fName}`
and toStringDate = date => DateTime.Date.toString(date) and toStringDate = date => DateTime.Date.toString(date)
@ -69,7 +64,6 @@ and toStringMap = aMap => {
let toStringWithType = (aValue: T.value) => let toStringWithType = (aValue: T.value) =>
switch aValue { switch aValue {
| IEvArray(_) => `Array::${toString(aValue)}` | IEvArray(_) => `Array::${toString(aValue)}`
| IEvArrayString(_) => `ArrayString::${toString(aValue)}`
| IEvBool(_) => `Bool::${toString(aValue)}` | IEvBool(_) => `Bool::${toString(aValue)}`
| IEvDate(_) => `Date::${toString(aValue)}` | IEvDate(_) => `Date::${toString(aValue)}`
| IEvDeclaration(_) => `Declaration::${toString(aValue)}` | IEvDeclaration(_) => `Declaration::${toString(aValue)}`
@ -116,7 +110,6 @@ let toStringResultRecord = x =>
type internalExpressionValueType = type internalExpressionValueType =
| EvtArray | EvtArray
| EvtArrayString
| EvtBool | EvtBool
| EvtDate | EvtDate
| EvtDeclaration | EvtDeclaration
@ -137,7 +130,6 @@ type functionDefinitionSignature =
let valueToValueType = (value: T.value) => let valueToValueType = (value: T.value) =>
switch value { switch value {
| IEvArray(_) => EvtArray | IEvArray(_) => EvtArray
| IEvArrayString(_) => EvtArrayString
| IEvBool(_) => EvtBool | IEvBool(_) => EvtBool
| IEvDate(_) => EvtDate | IEvDate(_) => EvtDate
| IEvDeclaration(_) => EvtDeclaration | IEvDeclaration(_) => EvtDeclaration
@ -160,7 +152,6 @@ let functionCallToCallSignature = (functionCall: functionCall): functionCallSign
let valueTypeToString = (valueType: internalExpressionValueType): string => let valueTypeToString = (valueType: internalExpressionValueType): string =>
switch valueType { switch valueType {
| EvtArray => `Array` | EvtArray => `Array`
| EvtArrayString => `ArrayString`
| EvtBool => `Bool` | EvtBool => `Bool`
// | EvtCall => `Call` // | EvtCall => `Call`
| EvtDate => `Date` | EvtDate => `Date`

View File

@ -22,7 +22,7 @@ let internalStdLib: Reducer_T.namespace = {
} }
| [IEvRecord(dict), IEvString(sIndex)] => switch Belt.Map.String.get(dict, sIndex) { | [IEvRecord(dict), IEvString(sIndex)] => switch Belt.Map.String.get(dict, sIndex) {
| Some(value) => value | Some(value) => value
| None => RERecordPropertyNotFound("Record index not found", sIndex)->ErrorException->raise | None => RERecordPropertyNotFound("Record property not found", sIndex)->ErrorException->raise
} }
| _ => REOther("Trying to access key on wrong value")->ErrorException->raise | _ => REOther("Trying to access key on wrong value")->ErrorException->raise
} }

View File

@ -161,15 +161,25 @@ let getContinuationsBefore = (project: t, sourceId: string): array<Reducer_T.nam
} }
let linkDependencies = (project: t, sourceId: string): Reducer_T.namespace => { let linkDependencies = (project: t, sourceId: string): Reducer_T.namespace => {
let nameSpace = Reducer_Namespace.mergeMany( let pastChain = project->getPastChain(sourceId)
Belt.Array.concat( let namespace = Reducer_Namespace.mergeMany(
Belt.Array.concatMany([
[project->getStdLib], [project->getStdLib],
project->getContinuationsBefore(sourceId) pastChain->Belt.Array.map(project->getBindings),
) pastChain->Belt.Array.map(
id => Reducer_Namespace.fromArray([
("__result__",
switch project->getResult(id) {
| Ok(result) => result
| Error(error) => error->Reducer_ErrorValue.ErrorException->raise
})
])
),
])
) )
let includesAsVariables = project->getIncludesAsVariables(sourceId) let includesAsVariables = project->getIncludesAsVariables(sourceId)
Belt.Array.reduce(includesAsVariables, nameSpace, (acc, (variable, includeFile)) => Belt.Array.reduce(includesAsVariables, namespace, (acc, (variable, includeFile)) =>
acc->Reducer_Namespace.set( acc->Reducer_Namespace.set(
variable, variable,
project->getBindings(includeFile)->Reducer_Namespace.toRecord project->getBindings(includeFile)->Reducer_Namespace.toRecord