text: // Caterwaul JS | Spencer Tipping
  // Licensed under the terms of the MIT source code license
  caterwaul.configuration('std.qs',(function (qs_template,qse_template,literal_template){return function (){this.macro(qs_template,function (tree){return new this.ref(tree)}).macro(qse_template,function (tree){return new this.ref(this.macroexpand(tree))}).macro(literal_template,function (tree){return tree})}})(caterwaul.parse('qs[_]'),caterwaul.parse('qse[_]'),caterwaul.parse('literal[_]'))).tconfiguration('std.qs','std.qg',function (){this.rmacro(qs[qg[_]],function (expression){return expression.as('(')})}).tconfiguration('std.qs std.qg','std.fn',function (){this.configure('std.qg').rmacro(qs[fn[_][_]],function (vars,expression){return qs[qg[function (vars){return expression}]].replace({vars:vars,expression:expression})}).rmacro(qs[fn_[_]],function (expression){return qs[qg[function (){return expression}]].replace({expression:expression})}).rmacro(qs[fb[_][_]],function (vars,expression){return qse[fn[_t][fn_[fn[vars][e].apply(_t,arguments)]](this)].replace({_t:this.gensym(),vars:vars,e:expression})}).rmacro(qs[fb_[_]],function (expression){return qse[fn[_t][fn_[fn_[e].apply(_t,arguments)]](this)].replace({_t:this.gensym(),e:expression})}).rmacro(qs[fc[_][_]],function (vars,body){return qse[qg[fn[vars][body,undefined]]].replace({vars:vars,body:body})}).rmacro(qs[fc_[_]],function (body){return qse[qg[fn[vars][body,undefined]]].replace({body:body})})}).tconfiguration('std.qs std.qg std.fn','std.obj',function (){this.configure('std.qg std.fn').rmacro(qs[_/mb/_],fn[object,method][qse[qg[fn[_o][_o.m&&fn_[_o.m.apply(_o,arguments)]]](o)].replace({_o:this.gensym(),o:object,m:method})]).rmacro(qs[_/mb[_]],fn[object,method][qse[qg[fn[_o,_m][_o[_m]&&fn_[_o[_m].apply(_o,arguments)]]](o,m)].replace({_o:this.gensym(),_m:this.gensym(),o:object,m:method})]).rmacro(qs[_/se._[_]],fn[v,n,b][qse[qg[fn[n][b,n]].call(this,v)].replace({b:b,n:n,v:v})]).rmacro(qs[_/se[_]],fn[v,b][qse[v/se._[b]].replace({b:b,v:v})]).rmacro(qs[_/re._[_]],fn[v,n,b][qse[qg[fn[n][b]].call(this,v)].replace({b:b,n:n,v:v})]).rmacro(qs[_/re[_]],fn[v,b][qse[v/re._[b]].replace({b:b,v:v})])}).tconfiguration('std.qs std.qg std.fn','std.bind',function (){this.configure('std.qg');
  var lf=fb[form][this.rmacro(form,l_expander)],lsf=fb[form][this.rmacro(form,l_star_expander)],l_star_expander=fb[vars,expression][qs[qg[function (){var vars;
  return expression}].call(this)].replace({vars:this.macroexpand(vars),expression:expression})],l_expander=fb[vars,expression][vars=this.macroexpand(vars).flatten(','),qs[qg[function (vars){return e}].call(this,values)].replace({vars:vars.map(fn[n][n[0]]).unflatten(),e:expression,values:vars.map(fn[n][n[1]]).unflatten()})];
  lf(qs[l[_] in _]),lf(qs[l[_][_]]),lf(let_in),lf(let_brackets).rmacro(qs[_,where[_]],fn[expression,vars][l_expander(vars,expression)]);
  lsf(qs[l*[_] in _]),lsf(qs[l*[_][_]]),lsf(lets_in),lsf(lets_brackets).rmacro(qs[_,where*[_]],fn[expression,vars][l_star_expander(vars,expression)])},{let_in:caterwaul.parse('let [_] in _'),let_brackets:caterwaul.parse('let [_][_]'),lets_in:caterwaul.parse('let*[_] in _'),lets_brackets:caterwaul.parse('let*[_][_]')}).tconfiguration('std.qs std.qg std.fn','std.lvalue',function (){this.rmacro(qs[_(_)=_],fn[base,params,value][qs[base=qg[function (params){return value}]].replace({base:base,params:params,value:value})])}).tconfiguration('std.qs std.qg std.fn','std.cond',function (){this.configure('std.qg').rmacro(qs[_,when[_]],fn[expr,cond][qs[qg[l]&&qg[r]].replace({l:cond,r:expr})]).rmacro(qs[_,unless[_]],fn[expr,cond][qs[ !qg[l]&&qg[r]].replace({l:cond,r:expr})])}).tconfiguration('std.qs std.qg std.fn','std.ref',function (){this.macro(qs[caterwaul],fn_[new this.ref(this)])}).tconfiguration('std.qs std.fn std.bind','std.string',function (){this.rmacro(qs[_],fn[string][string.is_string()&&/#\{[^\}]+\}/.test(string.data)&&l*[q=string.data.charAt(0),s=string.as_escaped_string(),eq=new RegExp('\\\\'+q,'g'),strings=s.split(/#\{[^\}]+\}/),xs=[],result=new this.syntax('+')][s.replace(/#\{([^\}]+)\}/g,fn[_,s][xs.push(s),'']),this.util.map(fb[x,i][result.push(new this.syntax(q+(i<strings.length?strings[i]:'')+q)).push(new this.syntax('(',this.parse(xs[i].replace(eq,q))))],xs),new this.syntax('(',result.push(new this.syntax(q+(xs.length<strings.length?strings[strings.length-1]:'')+q)).unflatten())]])}).configuration('std',function (){this.configure('std.qs std.qg std.bind std.lvalue std.cond std.fn std.obj std.ref std.string')});
  