(command.CommandList children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(Id.Lit_LBracket '[')} { (braced_var_sub token: (Token id:Id.VSub_Name val:SPECIALFORMS_LET_SH span_id:10) suffix_op: (suffix_op.Unary op_id:Id.VTest_Plus arg_word:{(true)}) ) } {(Id.Lit_RBracket ']')} ) (command.ControlFlow token:(Token id:Id.ControlFlow_Return val:return span_id:19)) ] ) (C {(declare)} {(-g)} {(Id.Lit_VarLike 'SPECIALFORMS_LET_SH=') (true)}) (C {(.)} { (braced_var_sub token: (Token id:Id.VSub_Name val:BASH_SOURCE span_id:32) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(Id.Lit_Slash /) ('*')}) ) (/common.sh) } ) (C {(.)} { (braced_var_sub token: (Token id:Id.VSub_Name val:BASH_SOURCE span_id:42) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(Id.Lit_Slash /) ('*')}) ) (/test.sh) } ) (C {(.)} { (braced_var_sub token: (Token id:Id.VSub_Name val:BASH_SOURCE span_id:52) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(Id.Lit_Slash /) ('*')}) ) (/specialforms.sh) } ) (command.ShFunction name: 'evaluator::specialforms::let' body: (command.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_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (length) } {($ Id.VSub_DollarName '$args')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:159) ) (C {(declare)} {(-i)} {(Id.Lit_VarLike 'length=') (DQ (${ Id.VSub_Name RESULT))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.Op_Less left: {($ Id.VSub_DollarName '$length')} right: {(2)} ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:184) ) ] action: [ (C {(stderr)} {(DQ ('usage: (let <bindings> <expr 1> .. <expr N>)'))}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:196) arg_word: {(1)} ) ] spids: [173 186] ) ] ) (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (first) } {($ Id.VSub_DollarName '$args')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:215) ) (C {(declare)} {(Id.Lit_VarLike 'bindings=') (${ Id.VSub_Name RESULT)}) (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (rest) } {($ Id.VSub_DollarName '$args')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:235) ) (C {(declare)} {(Id.Lit_VarLike 'expressions=') (${ Id.VSub_Name RESULT)}) (command.Sentence child: (C {(environment) (Id.Lit_Other ':') (Id.Lit_Other ':') (pushScope)} {($ Id.VSub_DollarName '$env')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:257) ) (C {(declare)} {(Id.Lit_VarLike 'runningEnv=') (DQ (${ Id.VSub_Name RESULT))}) (C {(declare)} {(thisBinding)} {(thisKey)} {(thisValue)} {(thisResult)}) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:280) cond: [ (command.Sentence child: (command.Pipeline children: [ (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (isEmpty_c) } {(DQ (${ Id.VSub_Name bindings))} ) ] negated: T ) terminator: (Token id:Id.Op_Semi val:';' span_id:298) ) ] body: (command.DoGroup children: [ (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (first) } {(DQ (${ Id.VSub_Name bindings))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:317) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:thisBinding) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [319] ) ] ) (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (rest) } {(DQ (${ Id.VSub_Name bindings))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:341) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bindings) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [343] ) ] ) (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (length) } {(DQ (${ Id.VSub_Name thisBinding))} ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobNEqual left: {(DQ (${ Id.VSub_Name RESULT))} right: {(2)} ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:382) ) ] action: [(C {(stderr)} {(DQ ('let binding must have exactly 2 elements'))})] spids: [367 384] ) ] ) (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (index) } {(DQ (${ Id.VSub_Name thisBinding))} {(0)} ) terminator: (Token id:Id.Op_Semi val:';' span_id:415) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:thisKey) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [417] ) ] ) (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (index) } {(DQ (${ Id.VSub_Name thisBinding))} {(1)} ) terminator: (Token id:Id.Op_Semi val:';' span_id:441) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:thisValue) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name RESULT))} spids: [443] ) ] ) (C {(evaluator) (Id.Lit_Other ':') (Id.Lit_Other ':') (eval)} {($ Id.VSub_DollarName '$env')} {($ Id.VSub_DollarName '$thisValue')} ) (C {(environment) (Id.Lit_Other ':') (Id.Lit_Other ':') (setVariable)} {(DQ (${ Id.VSub_Name runningEnv))} {($ Id.VSub_DollarName '$thisKey')} {($ Id.VSub_DollarName '$RESULT')} ) ] ) ) (C {(declare)} {(currentSexp)} {(currentResult)}) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:492) cond: [ (command.Sentence child: (command.Pipeline children: [ (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (isEmpty_c) } {(DQ (${ Id.VSub_Name expressions))} ) ] negated: T ) terminator: (Token id:Id.Op_Semi val:';' span_id:510) ) ] body: (command.DoGroup children: [ (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (first) } {(DQ (${ Id.VSub_Name expressions))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:529) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:currentSexp) op: assign_op.Equal rhs: {(${ Id.VSub_Name RESULT)} spids: [531] ) ] ) (command.Sentence child: (C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (LinkedList) (Id.Lit_Other ':') (Id.Lit_Other ':') (rest) } {(DQ (${ Id.VSub_Name expressions))} ) terminator: (Token id:Id.Op_Semi val:';' span_id:551) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:expressions) op: assign_op.Equal rhs: {(${ Id.VSub_Name RESULT)} spids: [553] ) ] ) (C {(evaluator) (Id.Lit_Other ':') (Id.Lit_Other ':') (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: [569] ) ] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:RESULT) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name currentResult))} spids: [578] ) ] ) ] ) ) (command.If arms: [ (if_arm cond: [ (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: (Token id:Id.Op_Semi val:';' span_id:608) ) ] action: [(command.ControlFlow token:(Token id:Id.ControlFlow_Return val:return span_id:613))] spids: [596 610] ) ] ) (C {(assert) (Id.Lit_Other ':') (Id.Lit_Other ':') (report)}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.AndOr ops: [Id.Op_DAmp] children: [ (C {(Id.Lit_LBracket '[')} { (braced_var_sub token: (Token id:Id.VSub_Number val:1 span_id:633) 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: (Token id:Id.Op_Semi val:';' span_id:656) ) ] action: [(C {(variable) (Id.Lit_Other ':') (Id.Lit_Other ':') (printMetadata)})] spids: [628 658] ) ] ) ] )