Skip to content

Commit 3a1aa0a

Browse files
authored
Clean up termSyntax and rename to traverseTerm (#2735)
- Rename `termSyntax` to `traverseTerm` - Remove the third argument and have it instead call `traverseSyntax` directly - Clean up and correct some misleading/outdated comments While trying to debug #2729 I realized that `termSyntax` was a bit strange: it took a `Syntax` traversal as a third argument, but in fact `traverseSyntax`, when calling `termSyntax`, simply passed itself as that third argument. It's much cleaner/more sensible to just have `termSyntax` directly call `traverseSyntax` instead of taking it as a parameter. Also, `termSyntax` should really be named `traverseTerm`. Then we just have two mutually recursive traversals, `traverseTerm` and `traverseSyntax`, exactly mirroring the mutually recursive structure of `Term` + `Syntax`. I have no idea why I wrote `termSyntax` the way I did originally. I probably thought I was being terribly clever. Of course, this did not end up being the cause of #2729 --- indeed it does not seem to make any performance difference at all --- but I think it's still a nice improvement and makes the code more understandable.
1 parent 9a010dd commit 3a1aa0a

2 files changed

Lines changed: 28 additions & 34 deletions

File tree

src/swarm-lang/Swarm/Language/Syntax.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ module Swarm.Language.Syntax (
9797

9898
-- * Traversals
9999

100-
-- ** Term + type traversal
101-
termSyntax,
100+
-- ** AST traversal
101+
traverseTerm,
102102
traverseSyntax,
103103

104104
-- ** Erasure

src/swarm-lang/Swarm/Language/Syntax/Util.hs

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module Swarm.Language.Syntax.Util (
1717
-- * Traversals
1818

1919
-- ** Term + type traversal
20-
termSyntax,
20+
traverseTerm,
2121
traverseSyntax,
2222

2323
-- ** Erasure
@@ -111,19 +111,17 @@ locVarToSyntax (Loc s v) = Syntax s (TVar v) Empty
111111
-- Term + type traversal
112112
------------------------------------------------------------
113113

114-
-- | Traversal to pick out all Syntax nodes and types inside a Term.
115-
-- Generic over the phase so we can use it to change phase.
116-
--
117-
-- This would in fact be some kind of 'Tritraversal' (if there were
118-
-- such a thing defined in the lens package).
119-
termSyntax ::
114+
-- | Given a (possibly effectful) way to turn types from one phase
115+
-- into types at another phase, and likewise a way to transform
116+
-- imports, traverse a term, effectfully
117+
-- changing the phase of the term as a whole.
118+
traverseTerm ::
120119
Applicative f =>
121120
(SwarmType a -> f (SwarmType b)) ->
122121
(ImportLoc (ImportPhaseFor a) -> f (ImportLoc (ImportPhaseFor b))) ->
123-
(Syntax a -> f (Syntax b)) ->
124122
Term a ->
125123
f (Term b)
126-
termSyntax fty floc fsyn = \case
124+
traverseTerm fty floc = \case
127125
TUnit -> pure TUnit
128126
TConst c -> pure $ TConst c
129127
TDir d -> pure $ TDir d
@@ -137,40 +135,36 @@ termSyntax fty floc fsyn = \case
137135
TRef x -> pure $ TRef x
138136
TRequire d -> pure $ TRequire d
139137
TStock n d -> pure $ TStock n d
140-
SRequirements t s -> SRequirements t <$> fsyn s
138+
SRequirements t s -> SRequirements t <$> traverseSyntax fty floc s
141139
TVar x -> pure $ TVar x
142-
SPair s1 s2 -> SPair <$> fsyn s1 <*> fsyn s2
143-
SLam x ty s -> SLam x ty <$> fsyn s
144-
SApp s1 s2 -> SApp <$> fsyn s1 <*> fsyn s2
145-
SLet ls r x rty ty req s1 s2 -> SLet ls r x rty ty req <$> fsyn s1 <*> fsyn s2
146-
STydef x ty info s -> STydef x ty info <$> fsyn s
147-
SBind x t1 t2 req s1 s2 -> SBind x <$> traverse fty t1 <*> pure t2 <*> pure req <*> fsyn s1 <*> fsyn s2
148-
SDelay s -> SDelay <$> fsyn s
149-
SRcd m -> SRcd <$> (traverse . traverse . traverse) fsyn m
150-
SProj s x -> SProj <$> fsyn s <*> pure x
151-
SAnnotate s pty -> SAnnotate <$> fsyn s <*> pure pty
152-
SSuspend s -> SSuspend <$> fsyn s
153-
SParens s -> SParens <$> fsyn s
140+
SPair s1 s2 -> SPair <$> traverseSyntax fty floc s1 <*> traverseSyntax fty floc s2
141+
SLam x ty s -> SLam x ty <$> traverseSyntax fty floc s
142+
SApp s1 s2 -> SApp <$> traverseSyntax fty floc s1 <*> traverseSyntax fty floc s2
143+
SLet ls r x rty ty req s1 s2 -> SLet ls r x rty ty req <$> traverseSyntax fty floc s1 <*> traverseSyntax fty floc s2
144+
STydef x ty info s -> STydef x ty info <$> traverseSyntax fty floc s
145+
SBind x t1 t2 req s1 s2 -> SBind x <$> traverse fty t1 <*> pure t2 <*> pure req <*> traverseSyntax fty floc s1 <*> traverseSyntax fty floc s2
146+
SDelay s -> SDelay <$> traverseSyntax fty floc s
147+
SRcd m -> SRcd <$> (traverse . traverse . traverse) (traverseSyntax fty floc) m
148+
SProj s x -> SProj <$> traverseSyntax fty floc s <*> pure x
149+
SAnnotate s pty -> SAnnotate <$> traverseSyntax fty floc s <*> pure pty
150+
SSuspend s -> SSuspend <$> traverseSyntax fty floc s
151+
SParens s -> SParens <$> traverseSyntax fty floc s
154152
TType ty -> pure $ TType ty
155-
SImportIn ex loc s -> SImportIn ex <$> floc loc <*> fsyn s
156-
SExportIn x s -> SExportIn x <$> fsyn s
153+
SImportIn ex loc s -> SImportIn ex <$> floc loc <*> traverseSyntax fty floc s
154+
SExportIn x s -> SExportIn x <$> traverseSyntax fty floc s
157155

158156
-- | Given a (possibly effectful) way to turn types from one phase
159157
-- into types at another phase, and likewise a way to transform
160-
-- imports, map over all types in a syntax tree, effectfully
158+
-- imports, traverse a syntax tree, effectfully
161159
-- changing the phase of the syntax tree as a whole.
162-
--
163-
-- We could make this a @Traversal (Syntax a) (Syntax b) (SwarmType
164-
-- a) (SwarmType b)@ but we just keep an explicit type like this for
165-
-- simplicity.
166160
traverseSyntax ::
167161
Applicative f =>
168162
(SwarmType a -> f (SwarmType b)) ->
169163
(ImportLoc (ImportPhaseFor a) -> f (ImportLoc (ImportPhaseFor b))) ->
170164
Syntax a ->
171165
f (Syntax b)
172166
traverseSyntax f g (Syntax loc t com ty) =
173-
Syntax loc <$> termSyntax f g (traverseSyntax f g) t <*> pure com <*> f ty
167+
Syntax loc <$> traverseTerm f g t <*> pure com <*> f ty
174168

175169
------------------------------------------------------------
176170
-- Type erasure
@@ -186,8 +180,8 @@ instance Erasable Syntax where
186180
eraseRaw = runIdentity . traverseSyntax (const (pure ())) (pure . unresolveImportLoc)
187181

188182
instance Erasable Term where
189-
erase = runIdentity . termSyntax (const (pure ())) pure (pure . erase)
190-
eraseRaw = runIdentity . termSyntax (const (pure ())) (pure . unresolveImportLoc) (pure . eraseRaw)
183+
erase = runIdentity . traverseTerm (const (pure ())) pure
184+
eraseRaw = runIdentity . traverseTerm (const (pure ())) (pure . unresolveImportLoc)
191185

192186
------------------------------------------------------------
193187
-- Free variable traversals

0 commit comments

Comments
 (0)