whole_func_string: function LetBlock(t, x, isStatement) {
      var n, n2;
  
      // t.token.type must be LET
      n = new Node(t, { type: LET_BLOCK, varDecls: [] });
      t.mustMatch(LEFT_PAREN);
      n.variables = Variables(t, x, n);
      t.mustMatch(RIGHT_PAREN);
  
      if (isStatement && t.peek() !== LEFT_CURLY) {
          /*
           * If this is really an expression in let statement guise, then we
           * need to wrap the LET_BLOCK node in a SEMICOLON node so that we pop
           * the return value of the expression.
           */
          n2 = new Node(t, { type: SEMICOLON,
                             expression: n });
          isStatement = false;
      }
  
      if (isStatement)
          n.block = Block(t, x);
      else
          n.expression = AssignExpression(t, x);
  
      return n;
  }
func_code_string: function LetBlock(t, x, isStatement) {
      var n, n2;
  
      // t.token.type must be LET
      n = new Node(t, { type: LET_BLOCK, varDecls: [] });
      t.mustMatch(LEFT_PAREN);
      n.variables = Variables(t, x, n);
      t.mustMatch(RIGHT_PAREN);
  
      if (isStatement && t.peek() !== LEFT_CURLY) {
          /*
           * If this is really an expression in let statement guise, then we
           * need to wrap the LET_BLOCK node in a SEMICOLON node so that we pop
           * the return value of the expression.
           */
          n2 = new Node(t, { type: SEMICOLON,
                             expression: n });
          isStatement = false;
      }
  
      if (isStatement)
          n.block = Block(t, x);
      else
          n.expression = AssignExpression(t, x);
  
      return n;
  }
func_documentation_string: /*
  LetBlock :: (tokenizer, compiler context, boolean) -> node
  
  Does not handle let inside of for loop init.