(command.CommandList
  children: [
    (command.ShFunction
      name: READ
      body: (BraceGroup children:[(C {<read>} {<-u>} {<0>} {<-e>} {<-p>} {(DQ <'user> '>)} {<r>})])
    )
    (command.ShFunction
      name: EVAL
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:r)
                  op: assign_op.Equal
                  rhs: {(DQ (${ Id.VSub_Number 1))}
                  spids: [39]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: PRINT
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:r)
                  op: assign_op.Equal
                  rhs: {(DQ (${ Id.VSub_Number 1))}
                  spids: [57]
                )
              ]
            )
          ]
        )
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: 
        (condition.Shell
          commands: [(command.Sentence child:(C {<true>}) terminator:<Id.Op_Semi _>)]
        )
      body: 
        (command.DoGroup
          children: [
            (C {<READ>})
            (C {<EVAL>} {(DQ (${ Id.VSub_Name r))})
            (C {<PRINT>} {(DQ (${ Id.VSub_Name r))})
            (C {<echo>} {(DQ (${ Id.VSub_Name r))})
          ]
        )
    )
  ]
)