diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,26 @@
 # Revision history for typst-hs
 
+## 0.5
+
+  * Support "as" keyword in imports (#21).
+    [API change] In Typst.Syntax, the Imports type now contains
+    fields for an optional "as" identifier.
+
+  * Support version type (#21).
+    [API change] Add VVersion constructor to Val, TVersion to ValType.
+    Support the `version` constructor function and the `at` method (#21).
+
+  * Parser: Ensure that `set` rule doesn't pick up `if` on next line (#23).
+
+  * Parser: Allow multiline strings (#20).
+
+  * Allow function applications in dictionary key construction (#19).
+    [API change]:  in Typst.Syntax, the Dict constructor for Expr
+    now takes type `[Spreadable (Expr, Expr)]` instead of
+    `[Spreadable (Identifier, Expr)]`. This is because the key
+    identifiers sometimes are not known at parse time and must
+    be computed in Evaluate.
+
 ## 0.4
 
   * `evaluateTypst` now returns a single Content instead of a sequence
diff --git a/src/Typst/Evaluate.hs b/src/Typst/Evaluate.hs
--- a/src/Typst/Evaluate.hs
+++ b/src/Typst/Evaluate.hs
@@ -482,8 +482,12 @@
           ( \m v -> do
               case v of
                 Reg (k, e) -> do
+                  k' <- case k of
+                           Ident i -> pure i
+                           _ -> do VString s <- evalExpr k
+                                   pure $ Identifier s
                   val <- evalExpr e
-                  pure $ m OM.|> (k, val)
+                  pure $ m OM.|> (k', val)
                 Spr y -> do
                   val <- evalExpr y
                   case val of
@@ -837,13 +841,15 @@
           _ -> fail "Import requires a path or module or function"
       case imports of
         AllIdentifiers -> importModule modmap
-        SomeIdentifiers idents -> do
-          let addFromModule m ident =
+        SomeIdentifiers pairs -> do
+          let addFromModule m (ident, mbAs) =
                 case M.lookup ident modmap of
                   Nothing -> fail $ show ident <> " not defined in module"
-                  Just v -> pure $ M.insert ident v m
-          foldM addFromModule mempty idents >>= importModule
-        NoIdentifiers -> addIdentifier modid (VModule modid modmap)
+                  Just v -> pure $ M.insert (fromMaybe ident mbAs) v m
+          foldM addFromModule mempty pairs >>= importModule
+        NoIdentifiers mbAs -> do
+          let ident = fromMaybe modid mbAs
+          addIdentifier ident (VModule ident modmap)
       pure VNone
     Include e -> do
       argval <- evalExpr e
diff --git a/src/Typst/Methods.hs b/src/Typst/Methods.hs
--- a/src/Typst/Methods.hs
+++ b/src/Typst/Methods.hs
@@ -19,7 +19,7 @@
 import Data.List (intersperse, sort, sortOn)
 import qualified Data.Map as M
 import qualified Data.Map.Ordered as OM
-import Data.Maybe (fromMaybe)
+import Data.Maybe (fromMaybe, listToMaybe)
 import Data.Text (Text)
 import qualified Data.Text as T
 import qualified Data.Vector as V
@@ -380,6 +380,12 @@
         "term" -> pure $ VContent t
         "description" -> pure $ VContent d
         _ -> noMethod "TermItem" fld
+    VVersion xs ->
+      case fld of
+        "at" -> pure $ makeFunction $ do
+                  i <- nthArg 1
+                  pure $ VInteger $ fromMaybe 0 $ listToMaybe $ drop i xs
+        _ -> noMethod "Version" fld
     VArray v -> do
       let toPos n =
             if n < 0
diff --git a/src/Typst/Module/Standard.hs b/src/Typst/Module/Standard.hs
--- a/src/Typst/Module/Standard.hs
+++ b/src/Typst/Module/Standard.hs
@@ -16,7 +16,7 @@
 import Data.Char (ord, chr)
 import Control.Applicative ((<|>))
 import Control.Monad (mplus, unless)
-import Control.Monad.Reader (lift)
+import Control.Monad.Reader (lift, asks)
 import qualified Data.Aeson as Aeson
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.Csv as Csv
@@ -421,6 +421,11 @@
              (val :: Int) <- nthArg 1
              pure $ VString $ T.pack [chr val] )
       ]
+    ),
+    ( "version",
+        makeFunction $ do
+          xs <- asks positional >>= mapM fromVal
+          pure $ VVersion xs
     ),
     ( "symbol",
       makeFunction $ do
diff --git a/src/Typst/Parse.hs b/src/Typst/Parse.hs
--- a/src/Typst/Parse.hs
+++ b/src/Typst/Parse.hs
@@ -912,7 +912,7 @@
 pStr :: P Literal
 pStr = lexeme $ do
   void $ char '"'
-  String . T.pack <$> manyTill (pStrEsc <|> noneOf "\"\r\n") (char '"')
+  String . T.pack <$> manyTill (pStrEsc <|> satisfy (/= '"')) (char '"')
 
 pUnit :: P Unit
 pUnit =
@@ -990,11 +990,7 @@
   where
     pEmptyDict = Dict mempty <$ sym ":"
     pNonemptyDict = Dict <$> sepEndBy1 (pSpread <|> pPair) (sym ",")
-    pPair = Reg <$> ((,) <$> pKey <*> try (sym ":" *> pExpr))
-    pKey = pIdentifier <|> pStrKey
-    pStrKey = do
-      String t <- pStr
-      pure $ Identifier t
+    pPair = Reg <$> ((,) <$> pExpr <*> try (sym ":" *> pExpr))
 
 pSpread :: P (Spreadable a)
 pSpread = try $ string ".." *> (Spr <$> pExpr)
@@ -1124,7 +1120,11 @@
 -- set-expr ::= 'set' expr args
 pSetExpr :: P Expr
 pSetExpr = do
+  oldAllowNewlines <- stAllowNewlines <$> getState
+  -- see #23 -- 'set' doesn't go with 'if' unless it's on the same line
+  updateState $ \st -> st {stAllowNewlines = 0}
   set <- pKeyword "set" *> (Set <$> pQualifiedIdentifier <*> pArgs)
+  updateState $ \st -> st {stAllowNewlines = oldAllowNewlines}
   addCondition <- option id $ pKeyword "if" *> ((\c x -> If [(c, x)]) <$> pExpr)
   pure $ addCondition set
 
@@ -1161,11 +1161,17 @@
 pImportExpr = pKeyword "import" *> (Import <$> pExpr <*> pImportItems)
   where
     pImportItems =
-      option NoIdentifiers $
-        sym ":"
+        (sym ":"
           *> ( (AllIdentifiers <$ sym "*")
-                 <|> (SomeIdentifiers <$> sepEndBy pIdentifier (sym ","))
+                 <|> (SomeIdentifiers
+                       <$> sepEndBy pIdentifierAs (sym ","))
              )
+        ) <|> (NoIdentifiers <$> pAs)
+    pIdentifierAs = do
+      ident <- pIdentifier
+      mbAs <- pAs
+      pure (ident, mbAs)
+    pAs = option Nothing $ Just <$> (pKeyword "as" *> pIdentifier)
 
 pBreakExpr :: P Expr
 pBreakExpr = Break <$ pKeyword "break"
diff --git a/src/Typst/Syntax.hs b/src/Typst/Syntax.hs
--- a/src/Typst/Syntax.hs
+++ b/src/Typst/Syntax.hs
@@ -139,7 +139,7 @@
   | FieldAccess Expr Expr
   | Group Expr
   | Array [Spreadable Expr]
-  | Dict [Spreadable (Identifier, Expr)]
+  | Dict [Spreadable (Expr, Expr)]
   | Binding Bind
   | Let Bind Expr
   | LetFunc Identifier [Param] Expr
@@ -159,6 +159,6 @@
 
 data Imports
   = AllIdentifiers
-  | SomeIdentifiers [Identifier]
-  | NoIdentifiers
+  | SomeIdentifiers [(Identifier, Maybe Identifier)] -- Maybe is the 'as'
+  | NoIdentifiers (Maybe Identifier)  -- Maybe is the 'as'
   deriving (Show, Ord, Eq, Data, Typeable)
diff --git a/src/Typst/Types.hs b/src/Typst/Types.hs
--- a/src/Typst/Types.hs
+++ b/src/Typst/Types.hs
@@ -112,6 +112,7 @@
   | VSelector !Selector
   | VModule Identifier (M.Map Identifier Val)
   | VStyles -- just a placeholder for now
+  | VVersion [Integer]
   | VType !ValType
   deriving (Show, Eq, Typeable)
 
@@ -170,6 +171,7 @@
   | TLabel
   | TCounter
   | TLocation
+  | TVersion
   | TType
   | TAny
   | ValType :|: ValType
@@ -205,6 +207,7 @@
     VModule {} -> TModule
     VSelector {} -> TSelector
     VStyles {} -> TStyles
+    VVersion {} -> TVersion
     VType {} -> TType
 
 hasType :: ValType -> Val -> Bool
@@ -376,6 +379,11 @@
   comp (VString "integer") (VType TInteger) = Just EQ
   comp (VType ty) (VString s) = Just $ compare (prettyType ty) s
   comp (VString s) (VType ty)  = Just $ compare s (prettyType ty)
+  comp (VVersion as) (VVersion bs)
+    | length as > length bs =
+       Just $ compare as (bs ++ replicate (length as - length bs) 0)
+    | otherwise =
+       Just $ compare (as ++ replicate (length as - length bs) 0) bs
   comp _ _ = Nothing
 
 instance Ord Val where
@@ -861,6 +869,7 @@
     VSymbol (Symbol t _ _) -> text t
     VSelector _ -> mempty
     VStyles -> mempty
+    VVersion xs -> text $ T.intercalate "." (map (T.pack . show) xs)
     VType ty -> text $ prettyType ty
 
 prettyType :: ValType -> Text
diff --git a/test/out/compiler/array-13.out b/test/out/compiler/array-13.out
--- a/test/out/compiler/array-13.out
+++ b/test/out/compiler/array-13.out
@@ -49,7 +49,7 @@
               (BasicBind (Just (Identifier "tasks")))
               (Dict
                  [ Reg
-                     ( Identifier "a"
+                     ( Ident (Identifier "a")
                      , Array
                          [ Reg (Literal (Int 1))
                          , Reg (Literal (Int 2))
@@ -57,7 +57,7 @@
                          ]
                      )
                  , Reg
-                     ( Identifier "b"
+                     ( Ident (Identifier "b")
                      , Array
                          [ Reg (Literal (Int 4))
                          , Reg (Literal (Int 5))
diff --git a/test/out/compiler/closure-05.out b/test/out/compiler/closure-05.out
--- a/test/out/compiler/closure-05.out
+++ b/test/out/compiler/closure-05.out
@@ -53,7 +53,8 @@
               (Block
                  (CodeBlock
                     [ Import
-                        (Ident (Identifier "b")) (SomeIdentifiers [ Identifier "b" ])
+                        (Ident (Identifier "b"))
+                        (SomeIdentifiers [ ( Identifier "b" , Nothing ) ])
                     , Ident (Identifier "b")
                     ]))
           , FuncCall
diff --git a/test/out/compiler/dict-00.out b/test/out/compiler/dict-00.out
--- a/test/out/compiler/dict-00.out
+++ b/test/out/compiler/dict-00.out
@@ -52,8 +52,8 @@
     (Let
        (BasicBind (Just (Identifier "dict")))
        (Dict
-          [ Reg ( Identifier "normal" , Literal (Int 1) )
-          , Reg ( Identifier "spacy key" , Literal (Int 2) )
+          [ Reg ( Ident (Identifier "normal") , Literal (Int 1) )
+          , Reg ( Literal (String "spacy key") , Literal (Int 2) )
           ]))
 , SoftBreak
 , Code
diff --git a/test/out/compiler/dict-01.out b/test/out/compiler/dict-01.out
--- a/test/out/compiler/dict-01.out
+++ b/test/out/compiler/dict-01.out
@@ -48,8 +48,8 @@
           [ Let
               (BasicBind (Just (Identifier "dict")))
               (Dict
-                 [ Reg ( Identifier "a" , Literal (Int 1) )
-                 , Reg ( Identifier "b b" , Literal (Int 1) )
+                 [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+                 , Reg ( Literal (String "b b") , Literal (Int 1) )
                  ])
           , Assign
               (FuncCall
@@ -64,21 +64,21 @@
               (FieldAccess
                  (Ident (Identifier "state")) (Ident (Identifier "dict")))
               (Dict
-                 [ Reg ( Identifier "ok" , Literal (Boolean True) )
-                 , Reg ( Identifier "err" , Literal (Boolean False) )
+                 [ Reg ( Ident (Identifier "ok") , Literal (Boolean True) )
+                 , Reg ( Ident (Identifier "err") , Literal (Boolean False) )
                  ])
           , FuncCall
               (Ident (Identifier "test"))
               [ NormalArg (Ident (Identifier "dict"))
               , NormalArg
                   (Dict
-                     [ Reg ( Identifier "a" , Literal (Int 1) )
-                     , Reg ( Identifier "b b" , Literal (Int 2) )
+                     [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+                     , Reg ( Literal (String "b b") , Literal (Int 2) )
                      , Reg
-                         ( Identifier "state"
+                         ( Ident (Identifier "state")
                          , Dict
-                             [ Reg ( Identifier "ok" , Literal (Boolean True) )
-                             , Reg ( Identifier "err" , Literal (Boolean False) )
+                             [ Reg ( Ident (Identifier "ok") , Literal (Boolean True) )
+                             , Reg ( Ident (Identifier "err") , Literal (Boolean False) )
                              ]
                          )
                      ])
diff --git a/test/out/compiler/dict-03.out b/test/out/compiler/dict-03.out
--- a/test/out/compiler/dict-03.out
+++ b/test/out/compiler/dict-03.out
@@ -50,8 +50,8 @@
               (FieldAccess
                  (Ident (Identifier "at"))
                  (Dict
-                    [ Reg ( Identifier "a" , Literal (Int 1) )
-                    , Reg ( Identifier "b" , Literal (Int 2) )
+                    [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+                    , Reg ( Ident (Identifier "b") , Literal (Int 2) )
                     ]))
               [ NormalArg (Literal (String "b"))
               , KeyValArg (Identifier "default") (Literal (Int 3))
@@ -69,8 +69,8 @@
               (FieldAccess
                  (Ident (Identifier "at"))
                  (Dict
-                    [ Reg ( Identifier "a" , Literal (Int 1) )
-                    , Reg ( Identifier "b" , Literal (Int 2) )
+                    [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+                    , Reg ( Ident (Identifier "b") , Literal (Int 2) )
                     ]))
               [ NormalArg (Literal (String "c"))
               , KeyValArg (Identifier "default") (Literal (Int 3))
diff --git a/test/out/compiler/dict-05.out b/test/out/compiler/dict-05.out
--- a/test/out/compiler/dict-05.out
+++ b/test/out/compiler/dict-05.out
@@ -46,9 +46,9 @@
     (Let
        (BasicBind (Just (Identifier "dict")))
        (Dict
-          [ Reg ( Identifier "a" , Literal (Int 3) )
-          , Reg ( Identifier "c" , Literal (Int 2) )
-          , Reg ( Identifier "b" , Literal (Int 1) )
+          [ Reg ( Ident (Identifier "a") , Literal (Int 3) )
+          , Reg ( Ident (Identifier "c") , Literal (Int 2) )
+          , Reg ( Ident (Identifier "b") , Literal (Int 1) )
           ]))
 , SoftBreak
 , Code
@@ -154,8 +154,8 @@
        [ NormalArg (Ident (Identifier "dict"))
        , NormalArg
            (Dict
-              [ Reg ( Identifier "a" , Literal (Int 3) )
-              , Reg ( Identifier "b" , Literal (Int 1) )
+              [ Reg ( Ident (Identifier "a") , Literal (Int 3) )
+              , Reg ( Ident (Identifier "b") , Literal (Int 1) )
               ])
        ])
 , ParBreak
diff --git a/test/out/compiler/field-00.out b/test/out/compiler/field-00.out
--- a/test/out/compiler/field-00.out
+++ b/test/out/compiler/field-00.out
@@ -46,8 +46,8 @@
     (Let
        (BasicBind (Just (Identifier "dict")))
        (Dict
-          [ Reg ( Identifier "nothing" , Literal (String "ness") )
-          , Reg ( Identifier "hello" , Literal (String "world") )
+          [ Reg ( Ident (Identifier "nothing") , Literal (String "ness") )
+          , Reg ( Ident (Identifier "hello") , Literal (String "world") )
           ]))
 , SoftBreak
 , Code
diff --git a/test/out/compiler/for-00.out b/test/out/compiler/for-00.out
--- a/test/out/compiler/for-00.out
+++ b/test/out/compiler/for-00.out
@@ -61,8 +61,8 @@
           , Simple (Just (Identifier "v"))
           ])
        (Dict
-          [ Reg ( Identifier "Name" , Literal (String "Typst") )
-          , Reg ( Identifier "Age" , Literal (Int 2) )
+          [ Reg ( Ident (Identifier "Name") , Literal (String "Typst") )
+          , Reg ( Ident (Identifier "Age") , Literal (Int 2) )
           ])
        (Block
           (Content
diff --git a/test/out/compiler/for-01.out b/test/out/compiler/for-01.out
--- a/test/out/compiler/for-01.out
+++ b/test/out/compiler/for-01.out
@@ -101,8 +101,8 @@
     (For
        (BasicBind (Just (Identifier "v")))
        (Dict
-          [ Reg ( Identifier "a" , Literal (Int 4) )
-          , Reg ( Identifier "b" , Literal (Int 5) )
+          [ Reg ( Ident (Identifier "a") , Literal (Int 4) )
+          , Reg ( Ident (Identifier "b") , Literal (Int 5) )
           ])
        (Block
           (CodeBlock
@@ -123,8 +123,8 @@
           , Simple (Just (Identifier "v"))
           ])
        (Dict
-          [ Reg ( Identifier "a" , Literal (Int 6) )
-          , Reg ( Identifier "b" , Literal (Int 7) )
+          [ Reg ( Ident (Identifier "a") , Literal (Int 6) )
+          , Reg ( Ident (Identifier "b") , Literal (Int 7) )
           ])
        (Block
           (CodeBlock
diff --git a/test/out/compiler/import-00.out b/test/out/compiler/import-00.out
--- a/test/out/compiler/import-00.out
+++ b/test/out/compiler/import-00.out
@@ -56,7 +56,10 @@
     ( line 9 , column 2 )
     (Import
        (Literal (String "module.typ"))
-       (SomeIdentifiers [ Identifier "fn" , Identifier "value" ]))
+       (SomeIdentifiers
+          [ ( Identifier "fn" , Nothing )
+          , ( Identifier "value" , Nothing )
+          ]))
 , SoftBreak
 , Code
     "test/typ/compiler/import-00.typ"
@@ -79,7 +82,8 @@
     ( line 15 , column 2 )
     (Import
        (Literal (String "module.typ"))
-       (SomeIdentifiers [ Identifier "a" , Identifier "c" ]))
+       (SomeIdentifiers
+          [ ( Identifier "a" , Nothing ) , ( Identifier "c" , Nothing ) ]))
 , Text "bye"
 , ParBreak
 ]
diff --git a/test/out/compiler/import-01.out b/test/out/compiler/import-01.out
--- a/test/out/compiler/import-01.out
+++ b/test/out/compiler/import-01.out
@@ -45,7 +45,7 @@
     ( line 3 , column 2 )
     (Import
        (Literal (String "module.typ"))
-       (SomeIdentifiers [ Identifier "item" ]))
+       (SomeIdentifiers [ ( Identifier "item" , Nothing ) ]))
 , SoftBreak
 , Code
     "test/typ/compiler/import-01.typ"
diff --git a/test/out/compiler/import-02.out b/test/out/compiler/import-02.out
--- a/test/out/compiler/import-02.out
+++ b/test/out/compiler/import-02.out
@@ -47,7 +47,7 @@
     ( line 5 , column 2 )
     (Import
        (Ident (Identifier "enum"))
-       (SomeIdentifiers [ Identifier "item" ]))
+       (SomeIdentifiers [ ( Identifier "item" , Nothing ) ]))
 , SoftBreak
 , Code
     "test/typ/compiler/import-02.typ"
diff --git a/test/out/compiler/import-03.out b/test/out/compiler/import-03.out
--- a/test/out/compiler/import-03.out
+++ b/test/out/compiler/import-03.out
@@ -43,7 +43,7 @@
 , Code
     "test/typ/compiler/import-03.typ"
     ( line 3 , column 2 )
-    (Import (Literal (String "module.typ")) NoIdentifiers)
+    (Import (Literal (String "module.typ")) (NoIdentifiers Nothing))
 , SoftBreak
 , Code
     "test/typ/compiler/import-03.typ"
diff --git a/test/out/compiler/import-05.out b/test/out/compiler/import-05.out
--- a/test/out/compiler/import-05.out
+++ b/test/out/compiler/import-05.out
@@ -51,7 +51,8 @@
     ( line 6 , column 2 )
     (Import
        (Literal (String "module.typ"))
-       (SomeIdentifiers [ Identifier "a" , Identifier "c" ]))
+       (SomeIdentifiers
+          [ ( Identifier "a" , Nothing ) , ( Identifier "c" , Nothing ) ]))
 , ParBreak
 ]
 --- evaluated ---
diff --git a/test/out/compiler/import-06.out b/test/out/compiler/import-06.out
--- a/test/out/compiler/import-06.out
+++ b/test/out/compiler/import-06.out
@@ -43,28 +43,29 @@
 , Code
     "test/typ/compiler/import-06.typ"
     ( line 3 , column 2 )
-    (Import (Ident (Identifier "enum")) NoIdentifiers)
+    (Import (Ident (Identifier "enum")) (NoIdentifiers Nothing))
 , SoftBreak
 , Code
     "test/typ/compiler/import-06.typ"
     ( line 4 , column 2 )
     (Let
        (BasicBind (Just (Identifier "d")))
-       (Dict [ Reg ( Identifier "e" , Ident (Identifier "enum") ) ]))
+       (Dict
+          [ Reg ( Ident (Identifier "e") , Ident (Identifier "enum") ) ]))
 , SoftBreak
 , Code
     "test/typ/compiler/import-06.typ"
     ( line 5 , column 2 )
     (Import
        (FieldAccess (Ident (Identifier "e")) (Ident (Identifier "d")))
-       NoIdentifiers)
+       (NoIdentifiers Nothing))
 , SoftBreak
 , Code
     "test/typ/compiler/import-06.typ"
     ( line 6 , column 2 )
     (Import
        (FieldAccess (Ident (Identifier "e")) (Ident (Identifier "d")))
-       (SomeIdentifiers [ Identifier "item" ]))
+       (SomeIdentifiers [ ( Identifier "item" , Nothing ) ]))
 , ParBreak
 , Code
     "test/typ/compiler/import-06.typ"
diff --git a/test/out/compiler/let-16.out b/test/out/compiler/let-16.out
--- a/test/out/compiler/let-16.out
+++ b/test/out/compiler/let-16.out
@@ -51,9 +51,9 @@
           , WithKey (Identifier "x") (Just (Identifier "c"))
           ])
        (Dict
-          [ Reg ( Identifier "a" , Literal (Int 1) )
-          , Reg ( Identifier "b" , Literal (Int 2) )
-          , Reg ( Identifier "x" , Literal (Int 3) )
+          [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+          , Reg ( Ident (Identifier "b") , Literal (Int 2) )
+          , Reg ( Ident (Identifier "x") , Literal (Int 3) )
           ]))
 , SoftBreak
 , Code
diff --git a/test/out/compiler/let-17.out b/test/out/compiler/let-17.out
--- a/test/out/compiler/let-17.out
+++ b/test/out/compiler/let-17.out
@@ -50,9 +50,9 @@
           , Sink (Just (Identifier "b"))
           ])
        (Dict
-          [ Reg ( Identifier "a" , Literal (Int 1) )
-          , Reg ( Identifier "b" , Literal (Int 2) )
-          , Reg ( Identifier "c" , Literal (Int 3) )
+          [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+          , Reg ( Ident (Identifier "b") , Literal (Int 2) )
+          , Reg ( Ident (Identifier "c") , Literal (Int 3) )
           ]))
 , SoftBreak
 , Code
@@ -63,8 +63,8 @@
        [ NormalArg (Ident (Identifier "b"))
        , NormalArg
            (Dict
-              [ Reg ( Identifier "b" , Literal (Int 2) )
-              , Reg ( Identifier "c" , Literal (Int 3) )
+              [ Reg ( Ident (Identifier "b") , Literal (Int 2) )
+              , Reg ( Ident (Identifier "c") , Literal (Int 3) )
               ])
        ])
 , ParBreak
diff --git a/test/out/compiler/let-18.out b/test/out/compiler/let-18.out
--- a/test/out/compiler/let-18.out
+++ b/test/out/compiler/let-18.out
@@ -51,9 +51,9 @@
           , WithKey (Identifier "c") Nothing
           ])
        (Dict
-          [ Reg ( Identifier "a" , Literal (Int 1) )
-          , Reg ( Identifier "b" , Literal (Int 2) )
-          , Reg ( Identifier "c" , Literal (Int 3) )
+          [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+          , Reg ( Ident (Identifier "b") , Literal (Int 2) )
+          , Reg ( Ident (Identifier "c") , Literal (Int 3) )
           ]))
 , SoftBreak
 , Code
@@ -62,7 +62,8 @@
     (FuncCall
        (Ident (Identifier "test"))
        [ NormalArg (Ident (Identifier "b"))
-       , NormalArg (Dict [ Reg ( Identifier "b" , Literal (Int 2) ) ])
+       , NormalArg
+           (Dict [ Reg ( Ident (Identifier "b") , Literal (Int 2) ) ])
        ])
 , ParBreak
 ]
diff --git a/test/out/compiler/let-19.out b/test/out/compiler/let-19.out
--- a/test/out/compiler/let-19.out
+++ b/test/out/compiler/let-19.out
@@ -49,7 +49,7 @@
           [ WithKey (Identifier "a") Nothing
           , Sink (Just (Identifier "b"))
           ])
-       (Dict [ Reg ( Identifier "a" , Literal (Int 1) ) ]))
+       (Dict [ Reg ( Ident (Identifier "a") , Literal (Int 1) ) ]))
 , SoftBreak
 , Code
     "test/typ/compiler/let-19.typ"
diff --git a/test/out/compiler/let-21.out b/test/out/compiler/let-21.out
--- a/test/out/compiler/let-21.out
+++ b/test/out/compiler/let-21.out
@@ -48,8 +48,8 @@
        (DestructuringBind
           [ Simple (Just (Identifier "a")) , Sink Nothing ])
        (Dict
-          [ Reg ( Identifier "a" , Literal (Int 1) )
-          , Reg ( Identifier "b" , Literal (Int 2) )
+          [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+          , Reg ( Ident (Identifier "b") , Literal (Int 2) )
           ]))
 , SoftBreak
 , Code
diff --git a/test/out/compiler/ops-01.out b/test/out/compiler/ops-01.out
--- a/test/out/compiler/ops-01.out
+++ b/test/out/compiler/ops-01.out
@@ -179,16 +179,16 @@
        (Ident (Identifier "test"))
        [ NormalArg
            (Plus
-              (Dict [ Reg ( Identifier "a" , Literal (Int 1) ) ])
+              (Dict [ Reg ( Ident (Identifier "a") , Literal (Int 1) ) ])
               (Dict
-                 [ Reg ( Identifier "b" , Literal (Int 2) )
-                 , Reg ( Identifier "c" , Literal (Int 3) )
+                 [ Reg ( Ident (Identifier "b") , Literal (Int 2) )
+                 , Reg ( Ident (Identifier "c") , Literal (Int 3) )
                  ]))
        , NormalArg
            (Dict
-              [ Reg ( Identifier "a" , Literal (Int 1) )
-              , Reg ( Identifier "b" , Literal (Int 2) )
-              , Reg ( Identifier "c" , Literal (Int 3) )
+              [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+              , Reg ( Ident (Identifier "b") , Literal (Int 2) )
+              , Reg ( Ident (Identifier "c") , Literal (Int 3) )
               ])
        ])
 , ParBreak
diff --git a/test/out/compiler/ops-08.out b/test/out/compiler/ops-08.out
--- a/test/out/compiler/ops-08.out
+++ b/test/out/compiler/ops-08.out
@@ -142,7 +142,8 @@
        (Ident (Identifier "test"))
        [ NormalArg
            (Equals
-              (Dict []) (Dict [ Reg ( Identifier "a" , Literal (Int 1) ) ]))
+              (Dict [])
+              (Dict [ Reg ( Ident (Identifier "a") , Literal (Int 1) ) ]))
        , NormalArg (Literal (Boolean False))
        ])
 , SoftBreak
@@ -155,12 +156,14 @@
            (Equals
               (Dict
                  [ Reg
-                     ( Identifier "a" , Minus (Literal (Int 2)) (Literal (Float 1.0)) )
-                 , Reg ( Identifier "b" , Literal (Int 2) )
+                     ( Ident (Identifier "a")
+                     , Minus (Literal (Int 2)) (Literal (Float 1.0))
+                     )
+                 , Reg ( Ident (Identifier "b") , Literal (Int 2) )
                  ])
               (Dict
-                 [ Reg ( Identifier "b" , Literal (Int 2) )
-                 , Reg ( Identifier "a" , Literal (Int 1) )
+                 [ Reg ( Ident (Identifier "b") , Literal (Int 2) )
+                 , Reg ( Ident (Identifier "a") , Literal (Int 1) )
                  ]))
        , NormalArg (Literal (Boolean True))
        ])
diff --git a/test/out/compiler/ops-13.out b/test/out/compiler/ops-13.out
--- a/test/out/compiler/ops-13.out
+++ b/test/out/compiler/ops-13.out
@@ -131,7 +131,8 @@
        [ NormalArg
            (InCollection
               (Literal (String "key"))
-              (Dict [ Reg ( Identifier "key" , Literal (String "value") ) ]))
+              (Dict
+                 [ Reg ( Ident (Identifier "key") , Literal (String "value") ) ]))
        , NormalArg (Literal (Boolean True))
        ])
 , SoftBreak
@@ -143,7 +144,8 @@
        [ NormalArg
            (InCollection
               (Literal (String "value"))
-              (Dict [ Reg ( Identifier "key" , Literal (String "value") ) ]))
+              (Dict
+                 [ Reg ( Ident (Identifier "key") , Literal (String "value") ) ]))
        , NormalArg (Literal (Boolean False))
        ])
 , SoftBreak
diff --git a/test/out/compiler/show-selector-00.out b/test/out/compiler/show-selector-00.out
--- a/test/out/compiler/show-selector-00.out
+++ b/test/out/compiler/show-selector-00.out
@@ -55,12 +55,13 @@
           [ KeyValArg (Identifier "radius") (Literal (Numeric 2.0 Pt))
           , KeyValArg
               (Identifier "outset")
-              (Dict [ Reg ( Identifier "y" , Literal (Numeric 2.5 Pt) ) ])
+              (Dict
+                 [ Reg ( Ident (Identifier "y") , Literal (Numeric 2.5 Pt) ) ])
           , KeyValArg
               (Identifier "inset")
               (Dict
-                 [ Reg ( Identifier "x" , Literal (Numeric 3.0 Pt) )
-                 , Reg ( Identifier "y" , Literal (Numeric 0.0 Pt) )
+                 [ Reg ( Ident (Identifier "x") , Literal (Numeric 3.0 Pt) )
+                 , Reg ( Ident (Identifier "y") , Literal (Numeric 0.0 Pt) )
                  ])
           , KeyValArg
               (Identifier "fill")
@@ -92,7 +93,7 @@
               (Identifier "stroke")
               (Dict
                  [ Reg
-                     ( Identifier "left"
+                     ( Ident (Identifier "left")
                      , Plus
                          (Literal (Numeric 1.5 Pt))
                          (FuncCall
@@ -108,7 +109,8 @@
        (Ident (Identifier "page"))
        [ KeyValArg
            (Identifier "margin")
-           (Dict [ Reg ( Identifier "top" , Literal (Numeric 12.0 Pt) ) ])
+           (Dict
+              [ Reg ( Ident (Identifier "top") , Literal (Numeric 12.0 Pt) ) ])
        ])
 , SoftBreak
 , Code
diff --git a/test/out/compiler/spread-03.out b/test/out/compiler/spread-03.out
--- a/test/out/compiler/spread-03.out
+++ b/test/out/compiler/spread-03.out
@@ -97,8 +97,8 @@
           [ Let
               (BasicBind (Just (Identifier "more")))
               (Dict
-                 [ Reg ( Identifier "c" , Literal (Int 3) )
-                 , Reg ( Identifier "d" , Literal (Int 4) )
+                 [ Reg ( Ident (Identifier "c") , Literal (Int 3) )
+                 , Reg ( Ident (Identifier "d") , Literal (Int 4) )
                  ])
           , LetFunc
               (Identifier "tostr")
diff --git a/test/out/compiler/string-13.out b/test/out/compiler/string-13.out
--- a/test/out/compiler/string-13.out
+++ b/test/out/compiler/string-13.out
@@ -70,10 +70,10 @@
               ])
        , NormalArg
            (Dict
-              [ Reg ( Identifier "start" , Literal (Int 4) )
-              , Reg ( Identifier "end" , Literal (Int 8) )
-              , Reg ( Identifier "text" , Literal (String "time") )
-              , Reg ( Identifier "captures" , Array [] )
+              [ Reg ( Ident (Identifier "start") , Literal (Int 4) )
+              , Reg ( Ident (Identifier "end") , Literal (Int 8) )
+              , Reg ( Ident (Identifier "text") , Literal (String "time") )
+              , Reg ( Ident (Identifier "captures") , Array [] )
               ])
        ])
 , ParBreak
@@ -105,17 +105,17 @@
            (Array
               [ Reg
                   (Dict
-                     [ Reg ( Identifier "start" , Literal (Int 0) )
-                     , Reg ( Identifier "end" , Literal (Int 3) )
-                     , Reg ( Identifier "text" , Literal (String "Day") )
-                     , Reg ( Identifier "captures" , Array [] )
+                     [ Reg ( Ident (Identifier "start") , Literal (Int 0) )
+                     , Reg ( Ident (Identifier "end") , Literal (Int 3) )
+                     , Reg ( Ident (Identifier "text") , Literal (String "Day") )
+                     , Reg ( Ident (Identifier "captures") , Array [] )
                      ])
               , Reg
                   (Dict
-                     [ Reg ( Identifier "start" , Literal (Int 7) )
-                     , Reg ( Identifier "end" , Literal (Int 10) )
-                     , Reg ( Identifier "text" , Literal (String "Day") )
-                     , Reg ( Identifier "captures" , Array [] )
+                     [ Reg ( Ident (Identifier "start") , Literal (Int 7) )
+                     , Reg ( Ident (Identifier "end") , Literal (Int 10) )
+                     , Reg ( Ident (Identifier "text") , Literal (String "Day") )
+                     , Reg ( Ident (Identifier "captures") , Array [] )
                      ])
               ])
        ])
diff --git a/test/out/compute/data-08.out b/test/out/compute/data-08.out
--- a/test/out/compute/data-08.out
+++ b/test/out/compute/data-08.out
@@ -132,8 +132,8 @@
               (Ident (Identifier "inline_table")) (Ident (Identifier "data")))
        , NormalArg
            (Dict
-              [ Reg ( Identifier "first" , Literal (String "amazing") )
-              , Reg ( Identifier "second" , Literal (String "greater") )
+              [ Reg ( Literal (String "first") , Literal (String "amazing") )
+              , Reg ( Literal (String "second") , Literal (String "greater") )
               ])
        ])
 , SoftBreak
diff --git a/test/out/compute/data-10.out b/test/out/compute/data-10.out
--- a/test/out/compute/data-10.out
+++ b/test/out/compute/data-10.out
@@ -117,8 +117,8 @@
               (Ident (Identifier "mapping")) (Ident (Identifier "data")))
        , NormalArg
            (Dict
-              [ Reg ( Identifier "1" , Literal (String "one") )
-              , Reg ( Identifier "2" , Literal (String "two") )
+              [ Reg ( Literal (String "1") , Literal (String "one") )
+              , Reg ( Literal (String "2") , Literal (String "two") )
               ])
        ])
 , SoftBreak
diff --git a/test/out/compute/data-12.out b/test/out/compute/data-12.out
--- a/test/out/compute/data-12.out
+++ b/test/out/compute/data-12.out
@@ -59,42 +59,47 @@
            (Array
               [ Reg
                   (Dict
-                     [ Reg ( Identifier "tag" , Literal (String "data") )
-                     , Reg ( Identifier "attrs" , Dict [] )
+                     [ Reg ( Ident (Identifier "tag") , Literal (String "data") )
+                     , Reg ( Ident (Identifier "attrs") , Dict [] )
                      , Reg
-                         ( Identifier "children"
+                         ( Ident (Identifier "children")
                          , Array
                              [ Reg (Literal (String "\n  "))
                              , Reg
                                  (Dict
-                                    [ Reg ( Identifier "tag" , Literal (String "hello") )
+                                    [ Reg ( Ident (Identifier "tag") , Literal (String "hello") )
                                     , Reg
-                                        ( Identifier "attrs"
-                                        , Dict [ Reg ( Identifier "name" , Literal (String "hi") ) ]
+                                        ( Ident (Identifier "attrs")
+                                        , Dict
+                                            [ Reg
+                                                ( Ident (Identifier "name")
+                                                , Literal (String "hi")
+                                                )
+                                            ]
                                         )
                                     , Reg
-                                        ( Identifier "children"
+                                        ( Ident (Identifier "children")
                                         , Array [ Reg (Literal (String "1")) ]
                                         )
                                     ])
                              , Reg (Literal (String "\n  "))
                              , Reg
                                  (Dict
-                                    [ Reg ( Identifier "tag" , Literal (String "data") )
-                                    , Reg ( Identifier "attrs" , Dict [] )
+                                    [ Reg ( Ident (Identifier "tag") , Literal (String "data") )
+                                    , Reg ( Ident (Identifier "attrs") , Dict [] )
                                     , Reg
-                                        ( Identifier "children"
+                                        ( Ident (Identifier "children")
                                         , Array
                                             [ Reg (Literal (String "\n    "))
                                             , Reg
                                                 (Dict
                                                    [ Reg
-                                                       ( Identifier "tag"
+                                                       ( Ident (Identifier "tag")
                                                        , Literal (String "hello")
                                                        )
-                                                   , Reg ( Identifier "attrs" , Dict [] )
+                                                   , Reg ( Ident (Identifier "attrs") , Dict [] )
                                                    , Reg
-                                                       ( Identifier "children"
+                                                       ( Ident (Identifier "children")
                                                        , Array [ Reg (Literal (String "World")) ]
                                                        )
                                                    ])
@@ -102,12 +107,12 @@
                                             , Reg
                                                 (Dict
                                                    [ Reg
-                                                       ( Identifier "tag"
+                                                       ( Ident (Identifier "tag")
                                                        , Literal (String "hello")
                                                        )
-                                                   , Reg ( Identifier "attrs" , Dict [] )
+                                                   , Reg ( Ident (Identifier "attrs") , Dict [] )
                                                    , Reg
-                                                       ( Identifier "children"
+                                                       ( Ident (Identifier "children")
                                                        , Array [ Reg (Literal (String "World")) ]
                                                        )
                                                    ])
diff --git a/test/out/layout/page-03.out b/test/out/layout/page-03.out
--- a/test/out/layout/page-03.out
+++ b/test/out/layout/page-03.out
@@ -73,8 +73,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "top" , Literal (Numeric 10.0 Pt) )
-              , Reg ( Identifier "rest" , Literal Auto )
+              [ Reg ( Ident (Identifier "top") , Literal (Numeric 10.0 Pt) )
+              , Reg ( Ident (Identifier "rest") , Literal Auto )
               ])
        , BlockArg [ Text "Hi" ]
        ])
diff --git a/test/out/layout/page-margin-01.out b/test/out/layout/page-margin-01.out
--- a/test/out/layout/page-margin-01.out
+++ b/test/out/layout/page-margin-01.out
@@ -59,7 +59,8 @@
                  (Ident (Identifier "page"))
                  [ KeyValArg
                      (Identifier "margin")
-                     (Dict [ Reg ( Identifier "left" , Literal (Numeric 0.0 Pt) ) ])
+                     (Dict
+                        [ Reg ( Ident (Identifier "left") , Literal (Numeric 0.0 Pt) ) ])
                  ])
           , Space
           , Code
@@ -84,7 +85,8 @@
                  (Ident (Identifier "page"))
                  [ KeyValArg
                      (Identifier "margin")
-                     (Dict [ Reg ( Identifier "right" , Literal (Numeric 0.0 Pt) ) ])
+                     (Dict
+                        [ Reg ( Ident (Identifier "right") , Literal (Numeric 0.0 Pt) ) ])
                  ])
           , Space
           , Code
@@ -109,7 +111,8 @@
                  (Ident (Identifier "page"))
                  [ KeyValArg
                      (Identifier "margin")
-                     (Dict [ Reg ( Identifier "top" , Literal (Numeric 0.0 Pt) ) ])
+                     (Dict
+                        [ Reg ( Ident (Identifier "top") , Literal (Numeric 0.0 Pt) ) ])
                  ])
           , Space
           , Code
@@ -132,7 +135,8 @@
                  (Ident (Identifier "page"))
                  [ KeyValArg
                      (Identifier "margin")
-                     (Dict [ Reg ( Identifier "bottom" , Literal (Numeric 0.0 Pt) ) ])
+                     (Dict
+                        [ Reg ( Ident (Identifier "bottom") , Literal (Numeric 0.0 Pt) ) ])
                  ])
           , Space
           , Code
@@ -159,8 +163,8 @@
                  [ KeyValArg
                      (Identifier "margin")
                      (Dict
-                        [ Reg ( Identifier "rest" , Literal (Numeric 0.0 Pt) )
-                        , Reg ( Identifier "left" , Literal (Numeric 20.0 Pt) )
+                        [ Reg ( Ident (Identifier "rest") , Literal (Numeric 0.0 Pt) )
+                        , Reg ( Ident (Identifier "left") , Literal (Numeric 20.0 Pt) )
                         ])
                  ])
           , Space
diff --git a/test/out/layout/page-marginals-00.out b/test/out/layout/page-marginals-00.out
--- a/test/out/layout/page-marginals-00.out
+++ b/test/out/layout/page-marginals-00.out
@@ -48,8 +48,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "x" , Literal (Numeric 15.0 Pt) )
-              , Reg ( Identifier "y" , Literal (Numeric 30.0 Pt) )
+              [ Reg ( Ident (Identifier "x") , Literal (Numeric 15.0 Pt) )
+              , Reg ( Ident (Identifier "y") , Literal (Numeric 30.0 Pt) )
               ])
        , KeyValArg
            (Identifier "header")
@@ -344,8 +344,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "top" , Literal (Numeric 15.0 Pt) )
-              , Reg ( Identifier "bottom" , Literal (Numeric 25.0 Pt) )
+              [ Reg ( Ident (Identifier "top") , Literal (Numeric 15.0 Pt) )
+              , Reg ( Ident (Identifier "bottom") , Literal (Numeric 25.0 Pt) )
               ])
        ])
 , SoftBreak
diff --git a/test/out/layout/par-justify-cjk-03.out b/test/out/layout/par-justify-cjk-03.out
--- a/test/out/layout/par-justify-cjk-03.out
+++ b/test/out/layout/par-justify-cjk-03.out
@@ -52,7 +52,8 @@
            (Plus (Literal (Numeric 170.0 Pt)) (Literal (Numeric 10.0 Pt)))
        , KeyValArg
            (Identifier "margin")
-           (Dict [ Reg ( Identifier "x" , Literal (Numeric 5.0 Pt) ) ])
+           (Dict
+              [ Reg ( Ident (Identifier "x") , Literal (Numeric 5.0 Pt) ) ])
        ])
 , SoftBreak
 , Code
diff --git a/test/out/meta/counter-page-00.out b/test/out/meta/counter-page-00.out
--- a/test/out/meta/counter-page-00.out
+++ b/test/out/meta/counter-page-00.out
@@ -50,8 +50,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "bottom" , Literal (Numeric 20.0 Pt) )
-              , Reg ( Identifier "rest" , Literal (Numeric 10.0 Pt) )
+              [ Reg ( Ident (Identifier "bottom") , Literal (Numeric 20.0 Pt) )
+              , Reg ( Ident (Identifier "rest") , Literal (Numeric 10.0 Pt) )
               ])
        ])
 , SoftBreak
diff --git a/test/out/meta/link-08.out b/test/out/meta/link-08.out
--- a/test/out/meta/link-08.out
+++ b/test/out/meta/link-08.out
@@ -47,9 +47,9 @@
        (Ident (Identifier "link"))
        [ NormalArg
            (Dict
-              [ Reg ( Identifier "page" , Literal (Int 1) )
-              , Reg ( Identifier "x" , Literal (Numeric 10.0 Pt) )
-              , Reg ( Identifier "y" , Literal (Numeric 20.0 Pt) )
+              [ Reg ( Ident (Identifier "page") , Literal (Int 1) )
+              , Reg ( Ident (Identifier "x") , Literal (Numeric 10.0 Pt) )
+              , Reg ( Ident (Identifier "y") , Literal (Numeric 20.0 Pt) )
               ])
        , BlockArg
            [ Text "Back"
diff --git a/test/out/meta/query-before-after-00.out b/test/out/meta/query-before-after-00.out
--- a/test/out/meta/query-before-after-00.out
+++ b/test/out/meta/query-before-after-00.out
@@ -49,8 +49,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "bottom" , Literal (Numeric 1.0 Cm) )
-              , Reg ( Identifier "rest" , Literal (Numeric 0.5 Cm) )
+              [ Reg ( Ident (Identifier "bottom") , Literal (Numeric 1.0 Cm) )
+              , Reg ( Ident (Identifier "rest") , Literal (Numeric 0.5 Cm) )
               ])
        ])
 , ParBreak
diff --git a/test/out/meta/query-before-after-01.out b/test/out/meta/query-before-after-01.out
--- a/test/out/meta/query-before-after-01.out
+++ b/test/out/meta/query-before-after-01.out
@@ -49,8 +49,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "bottom" , Literal (Numeric 1.0 Cm) )
-              , Reg ( Identifier "rest" , Literal (Numeric 0.5 Cm) )
+              [ Reg ( Ident (Identifier "bottom") , Literal (Numeric 1.0 Cm) )
+              , Reg ( Ident (Identifier "rest") , Literal (Numeric 0.5 Cm) )
               ])
        ])
 , ParBreak
diff --git a/test/out/meta/query-figure-00.out b/test/out/meta/query-figure-00.out
--- a/test/out/meta/query-figure-00.out
+++ b/test/out/meta/query-figure-00.out
@@ -49,8 +49,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "bottom" , Literal (Numeric 1.0 Cm) )
-              , Reg ( Identifier "rest" , Literal (Numeric 0.5 Cm) )
+              [ Reg ( Ident (Identifier "bottom") , Literal (Numeric 1.0 Cm) )
+              , Reg ( Ident (Identifier "rest") , Literal (Numeric 0.5 Cm) )
               ])
        ])
 , ParBreak
diff --git a/test/out/meta/query-header-00.out b/test/out/meta/query-header-00.out
--- a/test/out/meta/query-header-00.out
+++ b/test/out/meta/query-header-00.out
@@ -48,8 +48,8 @@
        , KeyValArg
            (Identifier "margin")
            (Dict
-              [ Reg ( Identifier "y" , Literal (Numeric 1.0 Cm) )
-              , Reg ( Identifier "x" , Literal (Numeric 0.5 Cm) )
+              [ Reg ( Ident (Identifier "y") , Literal (Numeric 1.0 Cm) )
+              , Reg ( Ident (Identifier "x") , Literal (Numeric 0.5 Cm) )
               ])
        , KeyValArg
            (Identifier "header")
diff --git a/test/out/regression/issue19.out b/test/out/regression/issue19.out
new file mode 100644
--- /dev/null
+++ b/test/out/regression/issue19.out
@@ -0,0 +1,89 @@
+--- parse tree ---
+[ Code
+    "test/typ/regression/issue19.typ"
+    ( line 1 , column 2 )
+    (Let
+       (BasicBind (Just (Identifier "test")))
+       (FuncExpr
+          [ NormalParam (Identifier "x") , NormalParam (Identifier "y") ]
+          (Block
+             (CodeBlock
+                [ If
+                    [ ( Equals (Ident (Identifier "x")) (Ident (Identifier "y"))
+                      , Block (Content [ Text "\9989" ])
+                      )
+                    , ( Literal (Boolean True)
+                      , Block
+                          (Content
+                             [ Text "\10060"
+                             , Text "("
+                             , Code
+                                 "test/typ/regression/issue19.typ"
+                                 ( line 1 , column 47 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "x")) ])
+                             , Space
+                             , Text "/"
+                             , Text "="
+                             , Space
+                             , Code
+                                 "test/typ/regression/issue19.typ"
+                                 ( line 1 , column 59 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "y")) ])
+                             , Text ")"
+                             ])
+                      )
+                    ]
+                ]))))
+, SoftBreak
+, Code
+    "test/typ/regression/issue19.typ"
+    ( line 2 , column 2 )
+    (Let
+       (BasicBind (Just (Identifier "nums")))
+       (Array
+          [ Reg (Literal (Int 1))
+          , Reg (Literal None)
+          , Reg (Literal (Int 2))
+          ]))
+, SoftBreak
+, Code
+    "test/typ/regression/issue19.typ"
+    ( line 3 , column 2 )
+    (FuncCall
+       (FieldAccess
+          (Ident (Identifier "map")) (Ident (Identifier "nums")))
+       [ NormalArg
+           (FuncExpr
+              [ NormalParam (Identifier "num") ]
+              (Block
+                 (CodeBlock
+                    [ If
+                        [ ( Equals (Ident (Identifier "num")) (Literal None)
+                          , Block (CodeBlock [ Return (Just (Literal (Int 1))) ])
+                          )
+                        ]
+                    , Return
+                        (Just
+                           (Dict
+                              [ Reg
+                                  ( FuncCall
+                                      (Ident (Identifier "str"))
+                                      [ NormalArg (Ident (Identifier "num")) ]
+                                  , Literal (Int 1)
+                                  )
+                              ]))
+                    ])))
+       ])
+, ParBreak
+]
+--- evaluated ---
+document(body: { text(body: [
+]), 
+                 text(body: [
+]), 
+                 text(body: [((1: 1), 1, (2: 1))]), 
+                 parbreak() })
diff --git a/test/out/regression/issue20.out b/test/out/regression/issue20.out
new file mode 100644
--- /dev/null
+++ b/test/out/regression/issue20.out
@@ -0,0 +1,63 @@
+--- parse tree ---
+[ Code
+    "test/typ/regression/issue20.typ"
+    ( line 1 , column 2 )
+    (Let
+       (BasicBind (Just (Identifier "test")))
+       (FuncExpr
+          [ NormalParam (Identifier "x") , NormalParam (Identifier "y") ]
+          (Block
+             (CodeBlock
+                [ If
+                    [ ( Equals (Ident (Identifier "x")) (Ident (Identifier "y"))
+                      , Block (Content [ Text "\9989" ])
+                      )
+                    , ( Literal (Boolean True)
+                      , Block
+                          (Content
+                             [ Text "\10060"
+                             , Text "("
+                             , Code
+                                 "test/typ/regression/issue20.typ"
+                                 ( line 1 , column 47 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "x")) ])
+                             , Space
+                             , Text "/"
+                             , Text "="
+                             , Space
+                             , Code
+                                 "test/typ/regression/issue20.typ"
+                                 ( line 1 , column 59 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "y")) ])
+                             , Text ")"
+                             ])
+                      )
+                    ]
+                ]))))
+, SoftBreak
+, Code
+    "test/typ/regression/issue20.typ"
+    ( line 2 , column 2 )
+    (Let
+       (BasicBind (Just (Identifier "a")))
+       (Literal (String "\nThis is a\nmultiline string\n")))
+, SoftBreak
+, Code
+    "test/typ/regression/issue20.typ"
+    ( line 6 , column 2 )
+    (FuncCall
+       (FieldAccess (Ident (Identifier "len")) (Ident (Identifier "a")))
+       [])
+, ParBreak
+]
+--- evaluated ---
+document(body: { text(body: [
+]), 
+                 text(body: [
+]), 
+                 text(body: [28]), 
+                 parbreak() })
diff --git a/test/out/regression/issue21.out b/test/out/regression/issue21.out
new file mode 100644
--- /dev/null
+++ b/test/out/regression/issue21.out
@@ -0,0 +1,68 @@
+--- parse tree ---
+[ Code
+    "test/typ/regression/issue21.typ"
+    ( line 1 , column 2 )
+    (Let
+       (BasicBind (Just (Identifier "test")))
+       (FuncExpr
+          [ NormalParam (Identifier "x") , NormalParam (Identifier "y") ]
+          (Block
+             (CodeBlock
+                [ If
+                    [ ( Equals (Ident (Identifier "x")) (Ident (Identifier "y"))
+                      , Block (Content [ Text "\9989" ])
+                      )
+                    , ( Literal (Boolean True)
+                      , Block
+                          (Content
+                             [ Text "\10060"
+                             , Text "("
+                             , Code
+                                 "test/typ/regression/issue21.typ"
+                                 ( line 1 , column 47 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "x")) ])
+                             , Space
+                             , Text "/"
+                             , Text "="
+                             , Space
+                             , Code
+                                 "test/typ/regression/issue21.typ"
+                                 ( line 1 , column 59 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "y")) ])
+                             , Text ")"
+                             ])
+                      )
+                    ]
+                ]))))
+, SoftBreak
+, Code
+    "test/typ/regression/issue21.typ"
+    ( line 2 , column 2 )
+    (FuncCall
+       (Ident (Identifier "version"))
+       [ NormalArg (Literal (Int 1)) , NormalArg (Literal (Int 2)) ])
+, SoftBreak
+, Code
+    "test/typ/regression/issue21.typ"
+    ( line 3 , column 2 )
+    (FuncCall
+       (FieldAccess
+          (Ident (Identifier "at"))
+          (FuncCall
+             (Ident (Identifier "version"))
+             [ NormalArg (Literal (Int 1)) , NormalArg (Literal (Int 2)) ]))
+       [ NormalArg (Literal (Int 3)) ])
+, ParBreak
+]
+--- evaluated ---
+document(body: { text(body: [
+]), 
+                 text(body: [1.2]), 
+                 text(body: [
+]), 
+                 text(body: [0]), 
+                 parbreak() })
diff --git a/test/out/regression/issue21b.out b/test/out/regression/issue21b.out
new file mode 100644
--- /dev/null
+++ b/test/out/regression/issue21b.out
@@ -0,0 +1,83 @@
+--- parse tree ---
+[ Code
+    "test/typ/regression/issue21b.typ"
+    ( line 1 , column 2 )
+    (Let
+       (BasicBind (Just (Identifier "test")))
+       (FuncExpr
+          [ NormalParam (Identifier "x") , NormalParam (Identifier "y") ]
+          (Block
+             (CodeBlock
+                [ If
+                    [ ( Equals (Ident (Identifier "x")) (Ident (Identifier "y"))
+                      , Block (Content [ Text "\9989" ])
+                      )
+                    , ( Literal (Boolean True)
+                      , Block
+                          (Content
+                             [ Text "\10060"
+                             , Text "("
+                             , Code
+                                 "test/typ/regression/issue21b.typ"
+                                 ( line 1 , column 47 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "x")) ])
+                             , Space
+                             , Text "/"
+                             , Text "="
+                             , Space
+                             , Code
+                                 "test/typ/regression/issue21b.typ"
+                                 ( line 1 , column 59 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "y")) ])
+                             , Text ")"
+                             ])
+                      )
+                    ]
+                ]))))
+, SoftBreak
+, Code
+    "test/typ/regression/issue21b.typ"
+    ( line 2 , column 2 )
+    (Import
+       (Literal (String "issue19.typ"))
+       (NoIdentifiers (Just (Identifier "zeke"))))
+, SoftBreak
+, Code
+    "test/typ/regression/issue21b.typ"
+    ( line 3 , column 2 )
+    (FieldAccess
+       (Ident (Identifier "nums")) (Ident (Identifier "zeke")))
+, SoftBreak
+, Code
+    "test/typ/regression/issue21b.typ"
+    ( line 4 , column 2 )
+    (Import
+       (Literal (String "issue20.typ"))
+       (SomeIdentifiers
+          [ ( Identifier "a" , Just (Identifier "multiline") ) ]))
+, SoftBreak
+, Code
+    "test/typ/regression/issue21b.typ"
+    ( line 5 , column 2 )
+    (Ident (Identifier "multiline"))
+, ParBreak
+]
+--- evaluated ---
+document(body: { text(body: [
+]), 
+                 text(body: [
+]), 
+                 text(body: [(1, none, 2)]), 
+                 text(body: [
+]), 
+                 text(body: [
+]), 
+                 text(body: [
+This is a
+multiline string
+]), 
+                 parbreak() })
diff --git a/test/out/regression/issue23.out b/test/out/regression/issue23.out
new file mode 100644
--- /dev/null
+++ b/test/out/regression/issue23.out
@@ -0,0 +1,77 @@
+--- parse tree ---
+[ Code
+    "test/typ/regression/issue23.typ"
+    ( line 1 , column 2 )
+    (Let
+       (BasicBind (Just (Identifier "test")))
+       (FuncExpr
+          [ NormalParam (Identifier "x") , NormalParam (Identifier "y") ]
+          (Block
+             (CodeBlock
+                [ If
+                    [ ( Equals (Ident (Identifier "x")) (Ident (Identifier "y"))
+                      , Block (Content [ Text "\9989" ])
+                      )
+                    , ( Literal (Boolean True)
+                      , Block
+                          (Content
+                             [ Text "\10060"
+                             , Text "("
+                             , Code
+                                 "test/typ/regression/issue23.typ"
+                                 ( line 1 , column 47 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "x")) ])
+                             , Space
+                             , Text "/"
+                             , Text "="
+                             , Space
+                             , Code
+                                 "test/typ/regression/issue23.typ"
+                                 ( line 1 , column 59 )
+                                 (FuncCall
+                                    (Ident (Identifier "repr"))
+                                    [ NormalArg (Ident (Identifier "y")) ])
+                             , Text ")"
+                             ])
+                      )
+                    ]
+                ]))))
+, SoftBreak
+, Code
+    "test/typ/regression/issue23.typ"
+    ( line 2 , column 2 )
+    (LetFunc
+       (Identifier "fn")
+       []
+       (Block
+          (CodeBlock
+             [ Set
+                 (Ident (Identifier "text"))
+                 [ KeyValArg (Identifier "fill") (Ident (Identifier "red")) ]
+             , If
+                 [ ( Literal (Boolean True)
+                   , Block (Content [ SoftBreak , Text "test" , ParBreak ])
+                   )
+                 , ( Literal (Boolean True)
+                   , Block (Content [ SoftBreak , Text "test2" , ParBreak ])
+                   )
+                 ]
+             ])))
+, ParBreak
+, Code
+    "test/typ/regression/issue23.typ"
+    ( line 11 , column 2 )
+    (FuncCall (Ident (Identifier "fn")) [])
+, ParBreak
+]
+--- evaluated ---
+document(body: { text(body: [
+]), 
+                 parbreak(), 
+                 text(body: [
+test], 
+                      fill: rgb(100%,25%,21%,100%)), 
+                 parbreak(), 
+                 parbreak() })
diff --git a/test/out/regression/issue3.out b/test/out/regression/issue3.out
--- a/test/out/regression/issue3.out
+++ b/test/out/regression/issue3.out
@@ -46,10 +46,10 @@
        (BasicBind (Just (Identifier "alpha")))
        (Dict
           [ Reg
-              ( Identifier "named"
+              ( Ident (Identifier "named")
               , Dict
-                  [ Reg ( Identifier "a" , Literal (Int 1) )
-                  , Reg ( Identifier "b" , Literal (Int 2) )
+                  [ Reg ( Ident (Identifier "a") , Literal (Int 1) )
+                  , Reg ( Ident (Identifier "b") , Literal (Int 2) )
                   ]
               )
           ]))
@@ -61,7 +61,7 @@
        [ Spr
            (FieldAccess
               (Ident (Identifier "named")) (Ident (Identifier "alpha")))
-       , Reg ( Identifier "c" , Literal (Int 3) )
+       , Reg ( Ident (Identifier "c") , Literal (Int 3) )
        ])
 , ParBreak
 ]
diff --git a/test/out/text/features-07.out b/test/out/text/features-07.out
--- a/test/out/text/features-07.out
+++ b/test/out/text/features-07.out
@@ -63,7 +63,7 @@
        (Ident (Identifier "text"))
        [ KeyValArg
            (Identifier "features")
-           (Dict [ Reg ( Identifier "liga" , Literal (Int 0) ) ])
+           (Dict [ Reg ( Ident (Identifier "liga") , Literal (Int 0) ) ])
        , BlockArg [ Text "No" , Space , Text "fi" ]
        ])
 , ParBreak
diff --git a/test/out/text/raw-code-04.out b/test/out/text/raw-code-04.out
--- a/test/out/text/raw-code-04.out
+++ b/test/out/text/raw-code-04.out
@@ -61,8 +61,8 @@
        [ KeyValArg
            (Identifier "inset")
            (Dict
-              [ Reg ( Identifier "x" , Literal (Numeric 4.0 Pt) )
-              , Reg ( Identifier "y" , Literal (Numeric 5.0 Pt) )
+              [ Reg ( Ident (Identifier "x") , Literal (Numeric 4.0 Pt) )
+              , Reg ( Ident (Identifier "y") , Literal (Numeric 5.0 Pt) )
               ])
        , KeyValArg (Identifier "radius") (Literal (Numeric 4.0 Pt))
        , KeyValArg
diff --git a/test/out/visualize/shape-ellipse-01.out b/test/out/visualize/shape-ellipse-01.out
--- a/test/out/visualize/shape-ellipse-01.out
+++ b/test/out/visualize/shape-ellipse-01.out
@@ -173,8 +173,8 @@
               , KeyValArg
                   (Identifier "outset")
                   (Dict
-                     [ Reg ( Identifier "top" , Literal (Numeric 3.0 Pt) )
-                     , Reg ( Identifier "rest" , Literal (Numeric 5.5 Pt) )
+                     [ Reg ( Ident (Identifier "top") , Literal (Numeric 3.0 Pt) )
+                     , Reg ( Ident (Identifier "rest") , Literal (Numeric 5.5 Pt) )
                      ])
               ])
        ])
diff --git a/test/out/visualize/shape-fill-stroke-02.out b/test/out/visualize/shape-fill-stroke-02.out
--- a/test/out/visualize/shape-fill-stroke-02.out
+++ b/test/out/visualize/shape-fill-stroke-02.out
@@ -62,10 +62,10 @@
        [ KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "left" , Ident (Identifier "red") )
-              , Reg ( Identifier "top" , Ident (Identifier "yellow") )
-              , Reg ( Identifier "right" , Ident (Identifier "green") )
-              , Reg ( Identifier "bottom" , Ident (Identifier "blue") )
+              [ Reg ( Ident (Identifier "left") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "top") , Ident (Identifier "yellow") )
+              , Reg ( Ident (Identifier "right") , Ident (Identifier "green") )
+              , Reg ( Ident (Identifier "bottom") , Ident (Identifier "blue") )
               ])
        , KeyValArg (Identifier "radius") (Literal (Numeric 100.0 Percent))
        , NormalArg
diff --git a/test/out/visualize/shape-rect-01.out b/test/out/visualize/shape-rect-01.out
--- a/test/out/visualize/shape-rect-01.out
+++ b/test/out/visualize/shape-rect-01.out
@@ -191,8 +191,8 @@
               , KeyValArg
                   (Identifier "radius")
                   (Dict
-                     [ Reg ( Identifier "left" , Literal (Numeric 10.0 Pt) )
-                     , Reg ( Identifier "right" , Literal (Numeric 5.0 Pt) )
+                     [ Reg ( Ident (Identifier "left") , Literal (Numeric 10.0 Pt) )
+                     , Reg ( Ident (Identifier "right") , Literal (Numeric 5.0 Pt) )
                      ])
               ])
        , NormalArg
@@ -202,10 +202,12 @@
               , KeyValArg
                   (Identifier "radius")
                   (Dict
-                     [ Reg ( Identifier "top-left" , Literal (Numeric 2.0 Pt) )
-                     , Reg ( Identifier "top-right" , Literal (Numeric 5.0 Pt) )
-                     , Reg ( Identifier "bottom-right" , Literal (Numeric 8.0 Pt) )
-                     , Reg ( Identifier "bottom-left" , Literal (Numeric 11.0 Pt) )
+                     [ Reg ( Ident (Identifier "top-left") , Literal (Numeric 2.0 Pt) )
+                     , Reg ( Ident (Identifier "top-right") , Literal (Numeric 5.0 Pt) )
+                     , Reg
+                         ( Ident (Identifier "bottom-right") , Literal (Numeric 8.0 Pt) )
+                     , Reg
+                         ( Ident (Identifier "bottom-left") , Literal (Numeric 11.0 Pt) )
                      ])
               ])
        ])
@@ -218,7 +220,8 @@
        (Ident (Identifier "rect"))
        [ KeyValArg
            (Identifier "stroke")
-           (Dict [ Reg ( Identifier "right" , Ident (Identifier "red") ) ])
+           (Dict
+              [ Reg ( Ident (Identifier "right") , Ident (Identifier "red") ) ])
        ])
 , SoftBreak
 , Code
@@ -231,8 +234,8 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "x" , Literal (Numeric 5.0 Pt) )
-              , Reg ( Identifier "y" , Literal (Numeric 1.0 Pt) )
+              [ Reg ( Ident (Identifier "x") , Literal (Numeric 5.0 Pt) )
+              , Reg ( Ident (Identifier "y") , Literal (Numeric 1.0 Pt) )
               ])
        ])
 , ParBreak
diff --git a/test/out/visualize/stroke-00.out b/test/out/visualize/stroke-00.out
--- a/test/out/visualize/stroke-00.out
+++ b/test/out/visualize/stroke-00.out
@@ -96,9 +96,9 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 1.0 Pt) )
-              , Reg ( Identifier "dash" , Literal (String "dashed") )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 1.0 Pt) )
+              , Reg ( Ident (Identifier "dash") , Literal (String "dashed") )
               ])
        ])
 , SoftBreak
@@ -117,9 +117,9 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 4.0 Pt) )
-              , Reg ( Identifier "cap" , Literal (String "round") )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 4.0 Pt) )
+              , Reg ( Ident (Identifier "cap") , Literal (String "round") )
               ])
        ])
 , ParBreak
diff --git a/test/out/visualize/stroke-01.out b/test/out/visualize/stroke-01.out
--- a/test/out/visualize/stroke-01.out
+++ b/test/out/visualize/stroke-01.out
@@ -48,10 +48,11 @@
        [ KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 1.0 Pt) )
-              , Reg ( Identifier "cap" , Literal (String "butt") )
-              , Reg ( Identifier "dash" , Literal (String "dash-dotted") )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 1.0 Pt) )
+              , Reg ( Ident (Identifier "cap") , Literal (String "butt") )
+              , Reg
+                  ( Ident (Identifier "dash") , Literal (String "dash-dotted") )
               ])
        ])
 , SoftBreak
@@ -91,7 +92,7 @@
        [ KeyValArg (Identifier "length") (Literal (Numeric 60.0 Pt))
        , KeyValArg
            (Identifier "stroke")
-           (Dict [ Reg ( Identifier "dash" , Literal None ) ])
+           (Dict [ Reg ( Ident (Identifier "dash") , Literal None ) ])
        ])
 , ParBreak
 ]
diff --git a/test/out/visualize/stroke-02.out b/test/out/visualize/stroke-02.out
--- a/test/out/visualize/stroke-02.out
+++ b/test/out/visualize/stroke-02.out
@@ -66,12 +66,12 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "rest" , Ident (Identifier "red") )
+              [ Reg ( Ident (Identifier "rest") , Ident (Identifier "red") )
               , Reg
-                  ( Identifier "top"
+                  ( Ident (Identifier "top")
                   , Dict
-                      [ Reg ( Identifier "paint" , Ident (Identifier "blue") )
-                      , Reg ( Identifier "dash" , Literal (String "dashed") )
+                      [ Reg ( Ident (Identifier "paint") , Ident (Identifier "blue") )
+                      , Reg ( Ident (Identifier "dash") , Literal (String "dashed") )
                       ]
                   )
               ])
@@ -93,8 +93,8 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "thickness" , Literal (Numeric 5.0 Pt) )
-              , Reg ( Identifier "join" , Literal (String "round") )
+              [ Reg ( Ident (Identifier "thickness") , Literal (Numeric 5.0 Pt) )
+              , Reg ( Ident (Identifier "join") , Literal (String "round") )
               ])
        ])
 , ParBreak
diff --git a/test/out/visualize/stroke-03.out b/test/out/visualize/stroke-03.out
--- a/test/out/visualize/stroke-03.out
+++ b/test/out/visualize/stroke-03.out
@@ -49,10 +49,10 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 1.0 Pt) )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 1.0 Pt) )
               , Reg
-                  ( Identifier "dash"
+                  ( Ident (Identifier "dash")
                   , Array
                       [ Reg (Literal (String "dot")) , Reg (Literal (Numeric 1.0 Pt)) ]
                   )
@@ -74,10 +74,10 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 1.0 Pt) )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 1.0 Pt) )
               , Reg
-                  ( Identifier "dash"
+                  ( Ident (Identifier "dash")
                   , Array
                       [ Reg (Literal (String "dot"))
                       , Reg (Literal (Numeric 1.0 Pt))
@@ -103,13 +103,13 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 1.0 Pt) )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 1.0 Pt) )
               , Reg
-                  ( Identifier "dash"
+                  ( Ident (Identifier "dash")
                   , Dict
                       [ Reg
-                          ( Identifier "array"
+                          ( Ident (Identifier "array")
                           , Array
                               [ Reg (Literal (String "dot"))
                               , Reg (Literal (Numeric 1.0 Pt))
@@ -117,7 +117,7 @@
                               , Reg (Literal (Numeric 2.0 Pt))
                               ]
                           )
-                      , Reg ( Identifier "phase" , Literal (Numeric 5.0 Pt) )
+                      , Reg ( Ident (Identifier "phase") , Literal (Numeric 5.0 Pt) )
                       ]
                   )
               ])
@@ -138,9 +138,9 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 1.0 Pt) )
-              , Reg ( Identifier "dash" , Array [] )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 1.0 Pt) )
+              , Reg ( Ident (Identifier "dash") , Array [] )
               ])
        ])
 , SoftBreak
@@ -159,10 +159,10 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 1.0 Pt) )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 1.0 Pt) )
               , Reg
-                  ( Identifier "dash"
+                  ( Ident (Identifier "dash")
                   , Array
                       [ Reg (Literal (Numeric 1.0 Pt))
                       , Reg (Literal (Numeric 3.0 Pt))
diff --git a/test/out/visualize/stroke-04.out b/test/out/visualize/stroke-04.out
--- a/test/out/visualize/stroke-04.out
+++ b/test/out/visualize/stroke-04.out
@@ -53,9 +53,9 @@
               [ KeyValArg
                   (Identifier "stroke")
                   (Dict
-                     [ Reg ( Identifier "thickness" , Literal (Numeric 4.0 Pt) )
-                     , Reg ( Identifier "paint" , Ident (Identifier "blue") )
-                     , Reg ( Identifier "join" , Literal (String "round") )
+                     [ Reg ( Ident (Identifier "thickness") , Literal (Numeric 4.0 Pt) )
+                     , Reg ( Ident (Identifier "paint") , Ident (Identifier "blue") )
+                     , Reg ( Ident (Identifier "join") , Literal (String "round") )
                      ])
               , NormalArg
                   (Array
@@ -84,9 +84,9 @@
               [ KeyValArg
                   (Identifier "stroke")
                   (Dict
-                     [ Reg ( Identifier "thickness" , Literal (Numeric 4.0 Pt) )
-                     , Reg ( Identifier "paint" , Ident (Identifier "blue") )
-                     , Reg ( Identifier "join" , Literal (String "bevel") )
+                     [ Reg ( Ident (Identifier "thickness") , Literal (Numeric 4.0 Pt) )
+                     , Reg ( Ident (Identifier "paint") , Ident (Identifier "blue") )
+                     , Reg ( Ident (Identifier "join") , Literal (String "bevel") )
                      ])
               , NormalArg
                   (Array
@@ -115,9 +115,9 @@
               [ KeyValArg
                   (Identifier "stroke")
                   (Dict
-                     [ Reg ( Identifier "thickness" , Literal (Numeric 4.0 Pt) )
-                     , Reg ( Identifier "paint" , Ident (Identifier "blue") )
-                     , Reg ( Identifier "join" , Literal (String "miter") )
+                     [ Reg ( Ident (Identifier "thickness") , Literal (Numeric 4.0 Pt) )
+                     , Reg ( Ident (Identifier "paint") , Ident (Identifier "blue") )
+                     , Reg ( Ident (Identifier "join") , Literal (String "miter") )
                      ])
               , NormalArg
                   (Array
@@ -146,10 +146,10 @@
               [ KeyValArg
                   (Identifier "stroke")
                   (Dict
-                     [ Reg ( Identifier "thickness" , Literal (Numeric 4.0 Pt) )
-                     , Reg ( Identifier "paint" , Ident (Identifier "blue") )
-                     , Reg ( Identifier "join" , Literal (String "miter") )
-                     , Reg ( Identifier "miter-limit" , Literal (Float 20.0) )
+                     [ Reg ( Ident (Identifier "thickness") , Literal (Numeric 4.0 Pt) )
+                     , Reg ( Ident (Identifier "paint") , Ident (Identifier "blue") )
+                     , Reg ( Ident (Identifier "join") , Literal (String "miter") )
+                     , Reg ( Ident (Identifier "miter-limit") , Literal (Float 20.0) )
                      ])
               , NormalArg
                   (Array
diff --git a/test/out/visualize/stroke-07.out b/test/out/visualize/stroke-07.out
--- a/test/out/visualize/stroke-07.out
+++ b/test/out/visualize/stroke-07.out
@@ -103,10 +103,10 @@
        , KeyValArg
            (Identifier "stroke")
            (Dict
-              [ Reg ( Identifier "paint" , Ident (Identifier "red") )
-              , Reg ( Identifier "thickness" , Literal (Numeric 0.0 Pt) )
+              [ Reg ( Ident (Identifier "paint") , Ident (Identifier "red") )
+              , Reg ( Ident (Identifier "thickness") , Literal (Numeric 0.0 Pt) )
               , Reg
-                  ( Identifier "dash"
+                  ( Ident (Identifier "dash")
                   , Array
                       [ Reg (Literal (String "dot")) , Reg (Literal (Numeric 1.0 Pt)) ]
                   )
diff --git a/test/typ/regression/issue19.typ b/test/typ/regression/issue19.typ
new file mode 100644
--- /dev/null
+++ b/test/typ/regression/issue19.typ
@@ -0,0 +1,7 @@
+#let nums = (1, none, 2)
+#nums.map(num => {
+  if num == none {
+    return 1
+  }
+  return ((str(num)): 1)
+})
diff --git a/test/typ/regression/issue20.typ b/test/typ/regression/issue20.typ
new file mode 100644
--- /dev/null
+++ b/test/typ/regression/issue20.typ
@@ -0,0 +1,5 @@
+#let a = "
+This is a
+multiline string
+"
+#a.len()
diff --git a/test/typ/regression/issue21.typ b/test/typ/regression/issue21.typ
new file mode 100644
--- /dev/null
+++ b/test/typ/regression/issue21.typ
@@ -0,0 +1,2 @@
+#version(1,2)
+#version(1,2).at(3)
diff --git a/test/typ/regression/issue21b.typ b/test/typ/regression/issue21b.typ
new file mode 100644
--- /dev/null
+++ b/test/typ/regression/issue21b.typ
@@ -0,0 +1,4 @@
+#import "issue19.typ" as zeke
+#zeke.nums
+#import "issue20.typ": a as multiline
+#multiline
diff --git a/test/typ/regression/issue23.typ b/test/typ/regression/issue23.typ
new file mode 100644
--- /dev/null
+++ b/test/typ/regression/issue23.typ
@@ -0,0 +1,10 @@
+#let fn() = {
+  set text(fill: red)
+  if true [
+    test
+  ] else [
+    test2
+  ]
+}
+
+#fn()
diff --git a/typst.cabal b/typst.cabal
--- a/typst.cabal
+++ b/typst.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               typst
-version:            0.4
+version:            0.5
 synopsis:           Parsing and evaluating typst syntax.
 description:        A library for parsing and evaluating typst syntax.
                     Typst (<https://typst.app>) is a document layout and
