14.3 Linking Units
We can make our toy economy more efficient by having toy factories
that cooperate with stores, creating toys that do not have to be
repainted. Instead, the toys are always created using the store’s
color, which the factory gets by importing toy-store^:
"store-specific-factory-unit.rkt"
To invoke store-specific-factory@, we need
toy-store^ bindings to supply to the unit. But to get
toy-store^ bindings by invoking toy-store@, we will
need a toy factory! The unit implementations are mutually dependent,
and we cannot invoke either before the other.
The solution is to link the units together, and then we can
invoke the combined units. The define-compound-unit/infer form
links any number of units to form a combined unit. It can propagate
imports and exports from the linked units, and it can satisfy each
unit’s imports using the exports of other linked units.
> (require "toy-factory-sig.rkt") |
|
> (require "toy-store-sig.rkt") |
|
> (require "store-specific-factory-unit.rkt") |
|
|
|
The overall result above is a unit toy-store+factory@ that
exports both toy-factory^ and toy-store^. The
connection between store-specific-factory@ and
toy-store@ is inferred from the signatures that each imports
and exports.
This unit has no imports, so we can always invoke it: