@@ -336,6 +336,8 @@ func (exec *Execution) evalStatement(stmt Statement, env *Env) (Value, bool, err
336336 return NewNil (), false , nil
337337 case * ForStmt :
338338 return exec .evalForStatement (s , env )
339+ case * WhileStmt :
340+ return exec .evalWhileStatement (s , env )
339341 default :
340342 return NewNil (), false , exec .errorAt (stmt .Pos (), "unsupported statement" )
341343 }
@@ -1124,6 +1126,33 @@ func (exec *Execution) evalForStatement(stmt *ForStmt, env *Env) (Value, bool, e
11241126 return last , false , nil
11251127}
11261128
1129+ func (exec * Execution ) evalWhileStatement (stmt * WhileStmt , env * Env ) (Value , bool , error ) {
1130+ last := NewNil ()
1131+ for {
1132+ if err := exec .step (); err != nil {
1133+ return NewNil (), false , exec .wrapError (err , stmt .Pos ())
1134+ }
1135+ condition , err := exec .evalExpression (stmt .Condition , env )
1136+ if err != nil {
1137+ return NewNil (), false , err
1138+ }
1139+ if err := exec .checkMemoryWith (condition ); err != nil {
1140+ return NewNil (), false , err
1141+ }
1142+ if ! condition .Truthy () {
1143+ return last , false , nil
1144+ }
1145+ val , returned , err := exec .evalStatements (stmt .Body , env )
1146+ if err != nil {
1147+ return NewNil (), false , err
1148+ }
1149+ if returned {
1150+ return val , true , nil
1151+ }
1152+ last = val
1153+ }
1154+ }
1155+
11271156func (exec * Execution ) getMember (obj Value , property string , pos Position ) (Value , error ) {
11281157 switch obj .Kind () {
11291158 case KindHash , KindObject :
0 commit comments