smlpolyml

Structuring a Library in SML


I'm currently building a testing library in Standard ML (using Poly/ML as the interpreter). I have the following directory structure:

project/a.sml
project/src/b.sml
project/src/c.sml
...

Where a.sml is just a bunch of calls to use

use "src/b.sml"
use "src/c.sml"
...

b.sml, c.sml etc. are all structure definitions like this

structure ComponentX
struct
...
end

which form nice, logically separated components of the library. I sometimes also create one module in one file, and then introduce a substructure within the same module in another file.

I can then use the testing library fine within the root directory of the project, by calling use "a.sml".

However, I can't seem to be able to use the code outside of its own directory, which is a bit of an issue. For example, say I'm in the parent directory of project. If I then call use "project/a.sml", the subsequent calls to use "src/x.sml" try to find a src directory in the parent (which doesn't exist).

Is there some way to do a relative use, or is there a better way to structure this altogether?


Solution

  • The use function itself in Poly/ML doesn't change the path when it is used recursively. You will need to change the path within the sub-directory explicitly using OS.FileSys.chDir. use is just a function so you could redefine it if you wanted. The OS.Path and OS.FileSys structures could be useful.

    An alternative is to reorganise your code to make use of PolyML.make. You would have to rename your files to match the name of the structure that each file contains e.g. ComponentX.sml would contain structure ComponentX. For more on this see polyml.org/documentation/Reference/PolyMLMake.html or a this answer about Poly/ML with nested directory structures.