The CL package system is not enough for what we need. In addition to what exists we need the following features: * We need to be able to have several versions of a package present in an image. There are several reasons for that: - We might have several libraries and/or applications present at the same time, but that use different versions of the package. - We need to be able to develop a new version of a package while using an image containing libraries and/or applications that need a stable version of the package. We could use name mangling, i.e. specify the version of a package as part of the name, but then we would need to standardize the names of a package so that it can be parsed in order to determine the version. It would be nice to avoid that in favor of an independent package-version feature. The challenge is to make this feature transparent to existing code. Juho Snellman suggested a feature called package environments that might be used. * We need for client code to be able to specify which version of a package to use, either as a particular version, or as an earliest version. Again, package environments may be used to solve this problem, but I don't know how convenient that feature is. * In order to avoid having to :use a package [1] we need to be able to refer to a package with a relatively short package prefix. But the package nickname feature is not going to work for this need because the shorter the package name the more likely it is that there is a name clash between independently developed packages. Thus, we need a feature by which a package prefix can be chosen by client code as opposed to by the author of a package. There are several libraries out there that allow something like this, often referred to as "package aliases". * These needs are tied in with the system-definition facility (such as ASDF) but I am not sure exactly to what extent. Suggestion: * Add a keyword argument :version to make-package the argument is a string of the form "a.b.c" where a, b, c are non-negative integers indicating major, minor and subminor versions. The c can be omitted and then defaults to 0. * Add the corresponding option to defpackage. * Create a function alias-package package alias &key version version-at-least which creates an alias (a string designator) for package (a package designator) in the current package. * Add the corresponding option to defpackage (:alias package [{:version version} | {:version-at-least version}]) * To make alias-package work, a package needs to have a new feature, namely aliased-packages. * Create a function package-alias-list that returns the aliased packages. [1] We want to avoid having to :use a package because by doing so we commit to making all external symbols in that package available, and this might clash with new symbols in future versions of the package.