     ] [
         [
             [ read-key >lower ] [ read-= ] [ read-value ] tri
-            2array ,
+            swap set
         ] keep (parse-attributes)
     ] if ;
 
 : parse-attributes ( state-parser -- hashtable )
-    [ (parse-attributes) ] { } make >hashtable ;
+    [ (parse-attributes) ] H{ } make-assoc ;
 
 : (parse-tag) ( string -- string' hashtable )
     [

: make-tag ( string attribs -- tag )
    [ [ closing-tag? ] keep "/" trim1 ] dip rot <tag> ;

: new-tag ( string type -- tag )
    tag new
        swap >>name
        swap >>text ; inline

: make-text-tag ( string -- tag ) text new-tag ; inline

: make-comment-tag ( string -- tag ) comment new-tag ; inline

: make-dtd-tag ( string -- tag ) dtd new-tag ; inline

: read-single-quote ( state-parser -- string )
    [ [ current CHAR: ' = ] take-until ] [ next drop ] bi ;

    [ blank? ] trim ;

: read-comment ( state-parser -- )
    "-->" take-until-sequence comment new-tag push-tag ;

: read-dtd ( state-parser -- )
    ">" take-until-sequence dtd new-tag push-tag ;

: read-bang ( state-parser -- )
    next dup { [ current CHAR: - = ] [ peek-next CHAR: - = ] } 1&& [
