@@ -158,12 +158,16 @@ literals = mkPattern' match'
158158 , prettyPrintCpp' ret
159159 ]
160160 match (Function _ name args ret) = mconcat <$> sequence
161− [ return $ emit $ if name == (Just tcoLoop) then "[&]" else "[=]"
161+ [ return $ emit captures
162162 , return $ emit "("
163− , return $ emit $ intercalate ", " (renderArg <$> args)
163+ , return $ emit $ intercalate ", " (render <$> args)
164164 , return $ emit ") -> boxed "
165165 , prettyPrintCpp' ret
166166 ]
167+ where
168+ (captures, render)
169+ | name == Just tcoLoop = ("[&]", renderArgByVal)
170+ | otherwise = ("[=]", renderArg)
167171 match (Indexer _ prop@(Var _ name) val) = mconcat <$> sequence
168172 [ prettyPrintCpp' val
169173 , return $ emit "::"
@@ -482,12 +486,21 @@ implFooterSource mn foreigns =
482486 \"
483487
484488varDecl :: Text
485−varDecl = "const boxed&"
489+varDecl = "const boxed"
490+
491+varRefDecl :: Text
492+varRefDecl = varDecl <> "&"
493+
494+renderArg' :: Text -> Text -> Text
495+renderArg' decl arg
496+ | arg == unusedName = decl
497+ | otherwise = decl <> " " <> arg
486498
487499renderArg :: Text -> Text
488−renderArg arg
489− | arg == unusedName = varDecl
490− | otherwise = varDecl <> " " <> arg
500+renderArg = renderArg' varRefDecl
501+
502+renderArgByVal :: Text -> Text
503+renderArgByVal = renderArg' varDecl
491504
492505foreignDict :: Text
493506foreignDict = "foreign"