(command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} { (braced_var_sub token: <Id.VSub_Name SPECIALFORMS_LETSTAR_SH> suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<true>}) ) } {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (C {<declare>} {<-g>} {<Id.Lit_VarLike 'SPECIALFORMS_LETSTAR_SH='> <true>}) (C {<.>} { (braced_var_sub token: <Id.VSub_Name BASH_SOURCE> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<Id.Lit_Slash '/'> <'*'>}) ) <'/common.sh'> } ) (C {<.>} { (braced_var_sub token: <Id.VSub_Name BASH_SOURCE> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<Id.Lit_Slash '/'> <'*'>}) ) <'/test.sh'> } ) (C {<.>} { (braced_var_sub token: <Id.VSub_Name BASH_SOURCE> suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<Id.Lit_Slash '/'> <'*'>}) ) <'/specialforms.sh'> } ) (command.ShFunction name: 'evaluator::specialforms::letstar' body: (BraceGroup children: [ (C {<declare>} {<Id.Lit_VarLike 'env='> (DQ (${ Id.VSub_Number 1))}) (C {<declare>} {<Id.Lit_VarLike 'functionName='> (DQ (${ Id.VSub_Number 2))}) (C {<declare>} {<Id.Lit_VarLike 'args='> (DQ (${ Id.VSub_Number 3))}) (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <length> } {($ Id.VSub_DollarName '$args')} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<-i>} {<Id.Lit_VarLike 'length='> (DQ (${ Id.VSub_Name RESULT))}) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.Op_Less left: {($ Id.VSub_DollarName '$length')} right: {<2>} ) ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<stderr>} {(DQ <'usage: (let <bindings> <expr 1> .. <expr N>)'>)}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [181 194] ) ] ) (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <first> } {($ Id.VSub_DollarName '$args')} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'bindings='> (${ Id.VSub_Name RESULT)}) (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <rest> } {($ Id.VSub_DollarName '$args')} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'expressions='> (${ Id.VSub_Name RESULT)}) (command.Sentence child: (C {<environment> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <pushScope>} {($ Id.VSub_DollarName '$env')} ) terminator: <Id.Op_Semi _> ) (C {<declare>} {<Id.Lit_VarLike 'runningEnv='> (DQ (${ Id.VSub_Name RESULT))}) (C {<declare>} {<thisBinding>} {<thisKey>} {<thisValue>} {<thisResult>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [ (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <isEmpty_c> } {(DQ (${ Id.VSub_Name bindings))} ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <first> } {(DQ (${ Id.VSub_Name bindings))} ) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:thisBinding) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [327] ) ] ) (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <rest> } {(DQ (${ Id.VSub_Name bindings))} ) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bindings) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [351] ) ] ) (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <length> } {(DQ (${ Id.VSub_Name thisBinding))} ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobNEqual left: {(DQ (${ Id.VSub_Name RESULT))} right: {<2>} ) ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<stderr>} {(DQ <'let binding must have exactly 2 elements'>)})] spids: [375 392] ) ] ) (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <index> } {(DQ (${ Id.VSub_Name thisBinding))} {<0>} ) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:thisKey) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [425] ) ] ) (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <index> } {(DQ (${ Id.VSub_Name thisBinding))} {<1>} ) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:thisValue) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [451] ) ] ) (C {<evaluator> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <eval>} {($ Id.VSub_DollarName '$runningEnv')} {($ Id.VSub_DollarName '$thisValue')} ) (C {<environment> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <setVariable>} {(DQ (${ Id.VSub_Name runningEnv))} {($ Id.VSub_DollarName '$thisKey')} {($ Id.VSub_DollarName '$RESULT')} ) ] ) ) (C {<declare>} {<currentSexp>} {<currentResult>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [ (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <isEmpty_c> } {(DQ (${ Id.VSub_Name expressions))} ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <first> } {(DQ (${ Id.VSub_Name expressions))} ) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:currentSexp) op: assign_op.Equal rhs: {(${ Id.VSub_Name RESULT)} spids: [539] ) ] ) (command.Sentence child: (C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <LinkedList> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <rest> } {(DQ (${ Id.VSub_Name expressions))} ) terminator: <Id.Op_Semi _> ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:expressions) op: assign_op.Equal rhs: {(${ Id.VSub_Name RESULT)} spids: [561] ) ] ) (C {<evaluator> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <eval>} {($ Id.VSub_DollarName '$runningEnv')} {($ Id.VSub_DollarName '$currentSexp')} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:currentResult) op: assign_op.Equal rhs: {(${ Id.VSub_Name RESULT)} spids: [577] ) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name currentResult))} spids: [586] ) ] ) ] ) ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Number '$0')} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {($ Id.VSub_DollarName '$BASH_SOURCE')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(command.ControlFlow token:<Id.ControlFlow_Return return>)] spids: [604 618] ) ] ) (C {<assert> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <report>}) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} { (braced_var_sub token: <Id.VSub_Number 1> suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{<isset>}) ) } {<Id.Lit_RBracket ']'>} ) (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$1'))} {<Id.Lit_Equals '='> <Id.Lit_Equals '='>} {(DQ <debug>)} {<Id.Lit_RBracket ']'>} ) ] ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<variable> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <printMetadata>})] spids: [636 666] ) ] ) ] )