@@ -705,14 +705,11 @@ handlerMap.set(SyntaxKind.INDEXING_EXPR, (frame) => {
705705 if ( index . payload < 0 || index . payload >= array . elements . length ) {
706706 throw new E604_IndexError ( "Index out of bounds" ) ;
707707 }
708- if ( frame . mode === Mode . GetValue ) {
709- return array . elements [ Number ( index . payload ) ] ;
710- }
711- else if ( frame . mode === Mode . GetCell ) {
708+ if ( frame . mode === Mode . GetCell ) {
712709 return new ArrayElementCell ( array , Number ( index . payload ) ) ;
713710 }
714- else { // Mode.Ignore
715- return new NoneValue ( ) ;
711+ else {
712+ return array . elements [ Number ( index . payload ) ] ;
716713 }
717714 }
718715 }
@@ -814,25 +811,19 @@ handlerMap.set(SyntaxKind.CALL_EXPR, (frame) => {
814811handlerMap . set ( SyntaxKind . INT_LIT_EXPR , ( frame ) => {
815812 assertNotAssignable ( frame ) ;
816813 let payload = intLitExprValue ( frame . node ) . payload as bigint ;
817- return frame . mode === Mode . Ignore
818- ? new NoneValue ( )
819- : new IntValue ( payload ) ;
814+ return new IntValue ( payload ) ;
820815} ) ;
821816
822817handlerMap . set ( SyntaxKind . STR_LIT_EXPR , ( frame ) => {
823818 assertNotAssignable ( frame ) ;
824819 let payload = strLitExprValue ( frame . node ) . payload as string ;
825- return frame . mode === Mode . Ignore
826- ? new NoneValue ( )
827- : new StrValue ( payload ) ;
820+ return new StrValue ( payload ) ;
828821} ) ;
829822
830823handlerMap . set ( SyntaxKind . BOOL_LIT_EXPR , ( frame ) => {
831824 assertNotAssignable ( frame ) ;
832825 let payload = boolLitExprValue ( frame . node ) . payload as boolean ;
833- return frame . mode === Mode . Ignore
834- ? new NoneValue ( )
835- : new BoolValue ( payload ) ;
826+ return new BoolValue ( payload ) ;
836827} ) ;
837828
838829handlerMap . set ( SyntaxKind . NONE_LIT_EXPR , ( frame ) => {
@@ -868,9 +859,7 @@ handlerMap.set(SyntaxKind.ARRAY_INITIALIZER_EXPR, (frame) => {
868859 return recurse ( frame , 1 , { node : elements [ frame . index ] } ) ;
869860 }
870861 else {
871- return frame . mode === Mode . Ignore
872- ? new NoneValue ( )
873- : new ArrayValue ( frame . vv ) ;
862+ return new ArrayValue ( frame . vv ) ;
874863 }
875864 }
876865 case 1 : {
@@ -883,20 +872,16 @@ handlerMap.set(SyntaxKind.ARRAY_INITIALIZER_EXPR, (frame) => {
883872
884873handlerMap . set ( SyntaxKind . VAR_REF_EXPR , ( frame ) => {
885874 let name = varRefExprName ( frame . node ) . payload as string ;
886- if ( frame . mode === Mode . GetValue ) {
887- let value = lookup ( frame . env , name ) ;
888- return value ;
889- }
890- else if ( frame . mode === Mode . GetCell ) {
875+ if ( frame . mode === Mode . GetCell ) {
891876 let [ mutable , varEnv ] = findEnvOfName ( frame . env , name ) ;
892877 if ( ! mutable ) {
893878 throw new E608_ReadonlyError ( `Binding '${ name } ' is readonly` ) ;
894879 }
895880 return new VarCell ( varEnv , name ) ;
896881 }
897- else { // Mode.Ignore
898- /* ignore */ lookup ( frame . env , name ) ;
899- return new NoneValue ( ) ;
882+ else {
883+ let value = lookup ( frame . env , name ) ;
884+ return value ;
900885 }
901886} ) ;
902887
@@ -949,10 +934,7 @@ handlerMap.set(SyntaxKind.QUOTE_EXPR, (frame) => {
949934 ) ;
950935 }
951936 else {
952- if ( frame . mode === Mode . Ignore ) {
953- return new NoneValue ( ) ;
954- }
955- else if ( statements . length === 1
937+ if ( statements . length === 1
956938 && isExprStatement ( statements [ 0 ] ) ) {
957939 return ( frame . vv [ 0 ] as SyntaxNodeValue ) . children [ 0 ] ;
958940 }
@@ -1111,7 +1093,7 @@ function step(frame: Frame, staticEnvs: Map<SyntaxNode, Env>): Frame | Value {
11111093 let handler = handlerMap . get ( frame . node . kind ) ;
11121094 if ( handler === undefined ) {
11131095 throw new E000_InternalError (
1114- `Missing handler for ${ frame . node . constructor . name } `
1096+ `Missing handler for ${ frame . node . kind . name } `
11151097 ) ;
11161098 }
11171099 return handler ( frame ) ;
@@ -1124,13 +1106,17 @@ function run(
11241106 fuel : number = Infinity ,
11251107) : Value {
11261108 while ( true ) {
1109+ if ( frame === rootFrame ) {
1110+ return frame . value ;
1111+ }
11271112 let result = step ( frame , staticEnvs ) ;
11281113 if ( result instanceof Frame ) {
1129- if ( result === rootFrame ) {
1130- return result . value ;
1131- }
11321114 frame = result ;
11331115 }
1116+ else if ( frame . mode === Mode . Ignore ) {
1117+ frame = frame . tail ! ;
1118+ frame . value = new NoneValue ( ) ;
1119+ }
11341120 else if ( result instanceof Cell ) {
11351121 frame = frame . tail ! ;
11361122 frame . cell = result ;
0 commit comments