@@ -4,11 +4,12 @@ use crate::stdlib::math::*;
44use crate :: stdlib:: logic:: * ;
55use crate :: stdlib:: compare:: * ;
66use crate :: stdlib:: matrix:: * ;
7- use crate :: stdlib:: range:: * ;
7+ use crate :: stdlib:: table:: * ;
8+ use crate :: stdlib:: range:: { RangeInclusive , RangeExclusive } ;
89use crate :: * ;
10+ use crate :: { MechError , MechErrorKind , hash_str, nodes:: Kind as NodeKind , nodes:: * } ;
11+ use crate :: nodes:: Matrix as Mat ;
912
10- use mech_core:: { MechError , MechErrorKind , hash_str, nodes:: Kind as NodeKind , nodes:: * } ;
11- use mech_core:: nodes:: Matrix as Mat ;
1213use na:: DMatrix ;
1314use indexmap:: set:: IndexSet ;
1415use indexmap:: map:: IndexMap ;
@@ -58,8 +59,6 @@ impl Interpreter {
5859 }
5960}
6061
61-
62-
6362//-----------------------------------------------------------------------------
6463
6564fn program ( program : & Program , plan : Plan , symbols : SymbolTableRef , functions : FunctionsRef ) -> MResult < Value > {
@@ -88,7 +87,6 @@ fn section_element(element: &SectionElement, plan: Plan, symbols: SymbolTableRef
8887 SectionElement :: Section ( sctn) => todo ! ( ) ,
8988 SectionElement :: Comment ( cmmnt) => Value :: Empty ,
9089 SectionElement :: Paragraph ( p) => Value :: Empty ,
91- SectionElement :: MechCode ( code) => todo ! ( ) ,
9290 SectionElement :: UnorderedList ( ul) => todo ! ( ) ,
9391 SectionElement :: CodeBlock => todo ! ( ) ,
9492 SectionElement :: OrderedList => todo ! ( ) ,
@@ -351,24 +349,12 @@ fn subscript(sbscrpt: &Subscript, val: &Value, plan: Plan, symbols: SymbolTableR
351349 match sbscrpt {
352350 Subscript :: Dot ( x) => {
353351 let key = x. hash ( ) ;
354- match val {
355- Value :: Record ( rcrd) => {
356- match rcrd. map . get ( & Value :: Id ( key) ) {
357- Some ( value) => return Ok ( value. clone ( ) ) ,
358- None => { return Err ( MechError { tokens : x. tokens ( ) , msg : file ! ( ) . to_string ( ) , id : line ! ( ) , kind : MechErrorKind :: UndefinedField ( key) } ) ; }
359- }
360- }
361- Value :: MutableReference ( r) => match & * r. borrow ( ) {
362- Value :: Record ( rcrd) => {
363- match rcrd. map . get ( & Value :: Id ( key) ) {
364- Some ( value) => return Ok ( value. clone ( ) ) ,
365- None => { return Err ( MechError { tokens : x. tokens ( ) , msg : file ! ( ) . to_string ( ) , id : line ! ( ) , kind : MechErrorKind :: UndefinedField ( key) } ) ; }
366- }
367- }
368- _ => todo ! ( ) ,
369- }
370- _ => todo ! ( ) ,
371- }
352+ let fxn_input: Vec < Value > = vec ! [ val. clone( ) , Value :: Id ( key) ] ;
353+ let new_fxn = AccessColumn { } . compile ( & fxn_input) ?;
354+ new_fxn. solve ( ) ;
355+ let res = new_fxn. out ( ) ;
356+ plan. borrow_mut ( ) . push ( new_fxn) ;
357+ return Ok ( res) ;
372358 } ,
373359 Subscript :: DotInt ( x) => {
374360 let mut fxn_input = vec ! [ val. clone( ) ] ;
@@ -584,7 +570,7 @@ fn set(m: &Set, plan: Plan, symbols: SymbolTableRef, functions: FunctionsRef) ->
584570
585571fn table ( t : & Table , plan : Plan , symbols : SymbolTableRef , functions : FunctionsRef ) -> MResult < Value > {
586572 let mut rows = vec ! [ ] ;
587- let header = table_header ( & t. header ) ?;
573+ let ( ids , col_kinds ) = table_header ( & t. header , functions . clone ( ) ) ?;
588574 let mut cols = 0 ;
589575 // Interpret the rows
590576 for row in & t. rows {
@@ -605,21 +591,35 @@ fn table(t: &Table, plan: Plan, symbols: SymbolTableRef, functions: FunctionsRef
605591 }
606592 // Build the table
607593 let mut data_map = IndexMap :: new ( ) ;
608- for ( field_label, column) in header. iter ( ) . zip ( data. iter ( ) ) {
609- data_map. insert ( field_label. clone ( ) , column. clone ( ) ) ;
594+ for ( field_label, ( column, knd) ) in ids. iter ( ) . zip ( data. iter ( ) . zip ( col_kinds) ) {
595+ let val = Value :: to_matrix ( column. clone ( ) , column. len ( ) , 1 ) ;
596+ match knd {
597+ ValueKind :: I64 => { data_map. insert ( field_label. clone ( ) , ( knd, val) ) ; } ,
598+ ValueKind :: U8 => {
599+ let vals: Vec < Value > = val. as_vec ( ) . iter ( ) . map ( |x| x. as_u8 ( ) . unwrap ( ) . to_value ( ) ) . collect :: < Vec < Value > > ( ) ;
600+ data_map. insert ( field_label. clone ( ) , ( knd, Value :: to_matrix ( vals. clone ( ) , vals. len ( ) , 1 ) ) ) ;
601+ } ,
602+ ValueKind :: Bool => {
603+ let vals: Vec < Value > = val. as_vec ( ) . iter ( ) . map ( |x| x. as_bool ( ) . unwrap ( ) . to_value ( ) ) . collect :: < Vec < Value > > ( ) ;
604+ data_map. insert ( field_label. clone ( ) , ( knd, Value :: to_matrix ( vals. clone ( ) , vals. len ( ) , 1 ) ) ) ;
605+ } ,
606+ _ => todo ! ( ) ,
607+ } ;
610608 }
611609 let tbl = MechTable { rows : t. rows . len ( ) , cols, data : data_map. clone ( ) } ;
612610 Ok ( Value :: Table ( tbl) )
613611}
614612
615- fn table_header ( fields : & Vec < Field > ) -> MResult < Vec < Value > > {
616- let mut row: Vec < Value > = Vec :: new ( ) ;
613+ fn table_header ( fields : & Vec < Field > , functions : FunctionsRef ) -> MResult < ( Vec < Value > , Vec < ValueKind > ) > {
614+ let mut ids: Vec < Value > = Vec :: new ( ) ;
615+ let mut kinds: Vec < ValueKind > = Vec :: new ( ) ;
617616 for f in fields {
618617 let id = f. name . hash ( ) ;
619- let kind = & f. kind ;
620- row. push ( Value :: Id ( id) ) ;
618+ let kind = kind_annotation ( & f. kind . kind , functions. clone ( ) ) ?;
619+ ids. push ( Value :: Id ( id) ) ;
620+ kinds. push ( kind. to_value_kind ( functions. clone ( ) ) ?) ;
621621 }
622- Ok ( row )
622+ Ok ( ( ids , kinds ) )
623623}
624624
625625fn table_row ( r : & TableRow , plan : Plan , symbols : SymbolTableRef , functions : FunctionsRef ) -> MResult < Vec < Value > > {
@@ -693,8 +693,8 @@ fn matrix_row(r: &MatrixRow, plan: Plan, symbols: SymbolTableRef, functions: Fun
693693 Value :: I32 ( _) => { Value :: MatrixI32 ( i32:: to_matrix ( row. iter ( ) . map ( |v| v. as_i32 ( ) . unwrap ( ) . borrow ( ) . clone ( ) ) . collect ( ) , 1 , row. len ( ) ) ) } ,
694694 Value :: I64 ( _) => { Value :: MatrixI64 ( i64:: to_matrix ( row. iter ( ) . map ( |v| v. as_i64 ( ) . unwrap ( ) . borrow ( ) . clone ( ) ) . collect ( ) , 1 , row. len ( ) ) ) } ,
695695 Value :: I128 ( _) => { Value :: MatrixI128 ( i128:: to_matrix ( row. iter ( ) . map ( |v| v. as_i128 ( ) . unwrap ( ) . borrow ( ) . clone ( ) ) . collect ( ) , 1 , row. len ( ) ) ) } ,
696- Value :: F32 ( _) => { Value :: MatrixF32 ( F32 :: to_matrix ( row. iter ( ) . map ( |v| F32 :: new ( v. as_f32 ( ) . unwrap ( ) . borrow ( ) . clone ( ) ) ) . collect ( ) , 1 , row. len ( ) ) ) } ,
697- Value :: F64 ( _) => { Value :: MatrixF64 ( F64 :: to_matrix ( row. iter ( ) . map ( |v| F64 :: new ( v. as_f64 ( ) . unwrap ( ) . borrow ( ) . clone ( ) ) ) . collect ( ) , 1 , row. len ( ) ) ) } ,
696+ Value :: F32 ( _) => { Value :: MatrixF32 ( F32 :: to_matrix ( row. iter ( ) . map ( |v| v. as_f32 ( ) . unwrap ( ) . borrow ( ) . clone ( ) ) . collect ( ) , 1 , row. len ( ) ) ) } ,
697+ Value :: F64 ( _) => { Value :: MatrixF64 ( F64 :: to_matrix ( row. iter ( ) . map ( |v| v. as_f64 ( ) . unwrap ( ) . borrow ( ) . clone ( ) ) . collect ( ) , 1 , row. len ( ) ) ) } ,
698698 _ => todo ! ( ) ,
699699 } ;
700700 Ok ( mat)
@@ -779,7 +779,7 @@ fn term(trm: &Term, plan: Plan, symbols: SymbolTableRef, functions: FunctionsRef
779779 FormulaOperator :: Comparison ( ComparisonOp :: GreaterThan ) => CompareGreaterThan { } . compile ( & vec ! [ lhs, rhs] ) ?,
780780
781781 FormulaOperator :: Logic ( LogicOp :: And ) => LogicAnd { } . compile ( & vec ! [ lhs, rhs] ) ?,
782- FormulaOperator :: Logic ( LogicOp :: Or ) => LogicOr { } . compile ( & vec ! [ lhs, rhs] ) ?,
782+ FormulaOperator :: Logic ( LogicOp :: Or ) => LogicOr { } . compile ( & vec ! [ lhs, rhs] ) ?,
783783 FormulaOperator :: Logic ( LogicOp :: Not ) => LogicNot { } . compile ( & vec ! [ lhs, rhs] ) ?,
784784 FormulaOperator :: Logic ( LogicOp :: Xor ) => LogicXor { } . compile ( & vec ! [ lhs, rhs] ) ?,
785785 } ;
0 commit comments