OperatorTable addAssignOperator(":", "atPutNumber") curlyBrackets := method( m := Map clone call message arguments foreach(arg, m doMessage(arg)) m ) Map atPutNumber := method( self atPut( call evalArgAt(0) asMutable removePrefix("\"") removeSuffix("\""), call evalArgAt(1) ) ) Map asString := method( pairs := Sequence asMutable foreach(k,v, pairs appendSeq(" #{k}=\"#{v}\"" interpolate) ) pairs ) xmlGen := Object clone do( tabs := 0 ind_print := method(s, "\t" repeated(tabs) print s println self ) etiq := method(str, ind_print("<" .. str .. ">") self ) indent_up := method(tabs = tabs+1) indent_down := method(tabs = tabs-1) forward = method( msgName := call message name args := call message arguments if (args isEmpty not and args first name == "curlyBrackets") then ( m := doString(args first asString) etiq(msgName .. m) args removeFirst ) else ( etiq(msgName) ) indent_up args foreach(arg, m := doMessage(arg) if (m type == "Sequence", ind_print(arg) ) ) indent_down etiq("/" .. msgName) ) ) xmlGen html( head( title("Mi pagina"), meta("robots") ), body( p("Hola"), a({"href":"google.es", "alt":"Google!"}, "URL") ) )