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?
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.