I've downloaded the entire archive of CRAN (don't ask we why yet) and I see some old versions of packages do not have a NAMESPACE file, but I'm pretty sure they did have exported functions. Was there a different mechanism in R 1.5?
example: https://cran.r-project.org/src/contrib/Archive/zoo/zoo_0.1-1.tar.gz (last modified 2004)
├── COPYING
├── COPYRIGHTS
├── DESCRIPTION
├── INDEX
├── R
│ └── zoo.R
└── man
├── as.zoo.Rd
├── index.Rd
├── plot.zoo.Rd
└── zoo.Rd
Namespaces can now be defined for packages other than `base':
see `Writing R Extensions'. This hides some internal objects
and changes the search path from objects in a namespace. All
the base packages (except methods and tcltk) have namespaces,
as well as the recommended packages `KernSmooth', `MASS',
`boot', `class', `nnet', `rpart' and `spatial'.