Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resolving module name conflicts, need to get at ORD_MAP signature

Tags:

sml

smlnj

I'm working on a relatively large SML codebase. It was originally written to compile with MLton, but I'm now working with it under SML/NJ. I need to use RedBlackMapFn, which is defined in smlnj-lib.cm. However, I get an error:

elaborate/elaborate-bomenv.fun:9.20-9.27 Error: unbound signature: ORD_KEY
elaborate/elaborate-bomenv.fun:14.21-14.40 Error: unbound functor: RedBlackMapFn
elaborate/elaborate-bomenv.fun:32.20-32.27 Error: unbound signature: ORD_KEY
elaborate/elaborate-bomenv.fun:37.21-37.40 Error: unbound functor: RedBlackMapFn

So I assume that smlnj-lib.cm is not being pulled by CM. In an effort to fix this, I added $/smlnj-lib.cm to the sources.cm file in the directory that I'm working in. This causes a separate issue:

elaborate/sources.cm:25.1-25.18 Error: structure Random imported from $SMLNJ-LIB/Util/smlnj-lib.cm@243997(random.sml) and also from ./(sources.cm):lib/(sources.cm):basic/(sources.cm):random.sml
elaborate/sources.cm:25.1-25.18 Error: structure Queue imported from $SMLNJ-LIB/Util/smlnj-lib.cm@436143(queue.sml) and also from ./(sources.cm):lib/(sources.cm):basic/(sources.cm):two-list-queue.sml

No dice. I tried removing the Random structure that's coming from ./(sources.cm):lib/(sources.cm):basic/(sources.cm):random.sml, but it appears that it isn't equivalent to the one defined in the standard library, so I can't just substitute one for the other.

I'd like to use something like Python's import ... from ... as ... mechanism to give a new name to the Random that's coming from the standard library, but CM's documentation doesn't offer any hints as to how I'd go about that.

How can I resolve a module naming conflict across multiple SML files?

like image 454
Patrick Collins Avatar asked Oct 20 '22 03:10

Patrick Collins


1 Answers

I ended up splitting off the problematic file in to a separate .cm. The problem file here is elaborate-bomenv.{sig, fun}. The .cm file for this directory is sources.cm, which caused errors when it looked like:

Group
...
is

$/basis.cm
...
elaborate-bomenv.fun
elaborate-bomenv.sig
...

So instead, I made an elaborate-bomenv-sources.cm that looks like:

Group

signature ELABORATE_BOMENV
functor BOMEnv

is

$/smlnj-lib.cm
...
elaborate-bomenv.sig
elaborate-bomenv.fun

and changed the original sources.cm to read:

Group
...
is

$/basis.cm
...
./elaborate-bomenv-sources.cm
...

Which is ugly, but it works.

like image 99
Patrick Collins Avatar answered Oct 24 '22 01:10

Patrick Collins