Forgot to reply-all. d'oh! Regards, Paul Nathan
Sent from my iPhone On Feb 28, 2013, at 11:01 AM, Paul Nathan <pnat...@vandals.uidaho.edu> wrote: > I would suggest a three-ring strategy. > > 1. Compiler and minimal libs, much like C. This is the sacred system > maintained by rust devs. This is just what would be needed for writing > embedded systems and other minimal lib situations. > > 2. Blessed ring: moves faster and is collected periodically. C.f. Haskell > platform. It represents common programming tasks and 'batteries'. Not > standardized.( no iso document) > > 3. Rust-cpan. Free for all. Yahoos. Whatever. Popular packages might make > into the platform. > > N. b. - Version locking can be problematic and a hassle; see in the case of > Haskell/cabal. > > Well, those are my 2c. :) > > Regards, > Paul Nathan > > Sent from my iPhone > > On Feb 28, 2013, at 10:50 AM, Graydon Hoare <gray...@mozilla.com> wrote: > >> On 28/02/2013 9:43 AM, Erick Tryzelaar wrote: >>> Hello Tommy, >>> >>> I feel our process will ultimately be more along the lines of a small >>> standard library that needs hooks into the compiler and runtime, and an >>> extensive CPAN-esque repository for everything else. We'll have first >>> party "blessed" packages for things like a web client, compression, and >>> hashing algorithms. >> >> This "blessed packages" approach to libstd is appealing in some ways but >> unappealing in others; it's something we discussed at the last weekly >> meeting and I'm curious to hear more perspectives on it. There are a >> bunch of tensions at work: >> >> - Terminology-wise, "standard library" as in "gets written into a >> standards document" suggests a very minimal libcore-like (or >> smaller) component. This is Stroustrup's philosophy[1] and it has >> a credible basis. You don't want to burden ISO translators with >> writing up the docs to your space invaders emulator[2]. >> >> - In terms of user convenience, tracking numerous library versions >> is a pain, as is tracking numerous "works on OS $foo" statuses. >> A standard-ish (or "common" if we want to avoid the word "standard") >> library is helpful in setting expectations about what a user can >> expect to be able to get working "on all reasonable installs", >> as well as which APIs will have long-term support and high levels >> of QA, documentation, integration testing, porting, etc. >> >> - Gating releases of a language on readiness-status of libraries and >> maintaining legacy APIs is a pain, true, but users often care much >> more about library APIs than they do about language features. "How >> do I write $foo in Rust" is very often an API question, not a >> language question, and the absence of a good API is equivalent >> to saying "go away". >> >> - Certain code idioms are mutually recursive. These need to be in the >> same crate for our purposes. >> >> In general my tendency is towards "batteries included" from the _user >> experience_ perspective when possible; this does leave some question >> about whether (and how) to approach a best-of-both-worlds situation as >> far as making the _developer experience_ also pleasant. >> >> I've been pushing around ideas about how to manage possibly re-exporting >> pinned versions of particular external libraries as part of the libstd >> namespace, as a way to mediate these tensions. Doing so would have >> possibly-weird, possibly-ok effects: >> >> - We might have to teach rustpkg to handle the idea of a mod >> directive resolving against a pkgid, the same way we're going >> to be teaching it to resolve extern mod directives. That is, we >> might need to be able to write 'mod foo = "github.com/user/foo";' >> and have it imply that the package manager check out that >> library but _build it into the referencing crate_ rather than as >> an extern. But I think that's ... possibly ok, and might even be >> pleasantly uniform in practice. >> >> - The libstd major-version might advance as the _maximum_ of advances >> in included libraries. It might bump with nearly every release, >> though I have a long-standing idea in mind to mitigate this: version >> attributes on module items. This is essentially a way to turn what >> _would_ be a major-version bump (API change) into a minor-version >> bump (API addition), since the items wind up qualified by separate >> version numbers. This might wind up weird or it might wind up quite >> practical. We haven't implemented it yet. Put concretely, we might >> get away with doing this (in libstd): >> >> #[vers="1.0.0"] >> pub mod foo = "github.com/user/foo#1.0"; >> >> #[vers="1.1.0"] >> pub mod foo = "github.com/user/foo#2.0"; >> >> which would "absorb" the major-version change between two versions >> of libfoo into a minor-version change to libstd, because we're >> "keeping the old API" of foo around qualified with std vers 1.0.0. >> Anyone who bound to "pkg.rust-lang.org/std#1.0.0" would get the >> old libfoo API they are expecting, but the package manager would >> be willing to provide it by downloading 1.0.0 or 1.1.0; in semver >> logic we literally are just "adding API" so are treated as such by >> version-reasoning tools. Moreover if a user wants to use a mixture >> of old and new APIs they can: >> >> extern mod std = "pkg.rust-lang.org/std#1.0.0"; >> std::foo::bar(1); // using foo::bar 1.0 API >> >> mod futuristic { >> // This module's been upgraded. >> extern mod std = "pkg.rust-lang.org/std#1.1.0"; >> std::foo::bar(1, true); // using foo::bar 2.0 API >> } >> >> of course if we got sick of maintaining foo 1.0 in libstd, we'd >> remove it and that would cause a major-version bump to libstd. >> Presumably we'd clear out a bunch of old re-exports at once in >> such a case -- anything that we're convinced is obsolete & unused, >> or causing undue maintenance pain. >> >> I'm interested to hear thoughts from others, as usual. This is tricky to >> get just right but it's important. API compatibility is the thing >> hardest to handle over time as they'll _always_ evolve, no matter how >> stable the language; having a strategy for thinking about backward >> compatibility might help us avoid the version tarpit that has happened >> to so many languages (inability to ship new APIs due to mismatches in >> users' willingness to upgrade, essentially). How we do this will have >> pretty major implications for how we work over time. >> >> -Graydon >> >> [1] https://en.wikipedia.org/wiki/Standard_library#Philosophies >> [2] >> http://docs.factorcode.org/content/article-handbook-library-reference.html >> >> _______________________________________________ >> Rust-dev mailing list >> Rust-dev@mozilla.org >> https://mail.mozilla.org/listinfo/rust-dev >> _______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev