rust/src
bors 87fe3ccf09 auto merge of #12039 : alexcrichton/rust/no-conditions, r=brson
This has been a long time coming. Conditions in rust were initially envisioned
as being a good alternative to error code return pattern. The idea is that all
errors are fatal-by-default, and you can opt-in to handling the error by
registering an error handler.

While sounding nice, conditions ended up having some unforseen shortcomings:

* Actually handling an error has some very awkward syntax:

        let mut result = None;                                        
        let mut answer = None;                                        
        io::io_error::cond.trap(|e| { result = Some(e) }).inside(|| { 
            answer = Some(some_io_operation());                       
        });                                                           
        match result {                                                
            Some(err) => { /* hit an I/O error */ }                   
            None => {                                                 
                let answer = answer.unwrap();                         
                /* deal with the result of I/O */                     
            }                                                         
        }                                                             

  This pattern can certainly use functions like io::result, but at its core
  actually handling conditions is fairly difficult

* The "zero value" of a function is often confusing. One of the main ideas
  behind using conditions was to change the signature of I/O functions. Instead
  of read_be_u32() returning a result, it returned a u32. Errors were notified
  via a condition, and if you caught the condition you understood that the "zero
  value" returned is actually a garbage value. These zero values are often
  difficult to understand, however.

  One case of this is the read_bytes() function. The function takes an integer
  length of the amount of bytes to read, and returns an array of that size. The
  array may actually be shorter, however, if an error occurred.

  Another case is fs::stat(). The theoretical "zero value" is a blank stat
  struct, but it's a little awkward to create and return a zero'd out stat
  struct on a call to stat().

  In general, the return value of functions that can raise error are much more
  natural when using a Result as opposed to an always-usable zero-value.

* Conditions impose a necessary runtime requirement on *all* I/O. In theory I/O
  is as simple as calling read() and write(), but using conditions imposed the
  restriction that a rust local task was required if you wanted to catch errors
  with I/O. While certainly an surmountable difficulty, this was always a bit of
  a thorn in the side of conditions.

* Functions raising conditions are not always clear that they are raising
  conditions. This suffers a similar problem to exceptions where you don't
  actually know whether a function raises a condition or not. The documentation
  likely explains, but if someone retroactively adds a condition to a function
  there's nothing forcing upstream users to acknowledge a new point of task
  failure.

* Libaries using I/O are not guaranteed to correctly raise on conditions when an
  error occurs. In developing various I/O libraries, it's much easier to just
  return `None` from a read rather than raising an error. The silent contract of
  "don't raise on EOF" was a little difficult to understand and threw a wrench
  into the answer of the question "when do I raise a condition?"

Many of these difficulties can be overcome through documentation, examples, and
general practice. In the end, all of these difficulties added together ended up
being too overwhelming and improving various aspects didn't end up helping that
much.

A result-based I/O error handling strategy also has shortcomings, but the
cognitive burden is much smaller. The tooling necessary to make this strategy as
usable as conditions were is much smaller than the tooling necessary for
conditions.

Perhaps conditions may manifest themselves as a future entity, but for now
we're going to remove them from the standard library.

Closes #9795
Closes #8968
2014-02-06 17:11:33 -08:00
..
compiletest auto merge of #12020 : alexcrichton/rust/output-flags, r=brson 2014-02-06 12:41:30 -08:00
doc auto merge of #12039 : alexcrichton/rust/no-conditions, r=brson 2014-02-06 17:11:33 -08:00
driver
etc Redesign output flags for rustc 2014-02-06 11:14:13 -08:00
gyp@1e46da1000
libarena
libextra getopts: unify tests 2014-02-06 10:04:26 -08:00
libflate
libgetopts getopts: fixed a failing test 2014-02-06 10:04:26 -08:00
libglob
libgreen Various bug fixes and rebase conflicts 2014-02-03 12:05:16 -08:00
libnative Implement clone() for TCP/UDP/Unix sockets 2014-02-05 11:43:49 -08:00
librustc Removed @self and @Trait. 2014-02-07 00:38:33 +02:00
librustdoc Removed @self and @Trait. 2014-02-07 00:38:33 +02:00
librustuv Implement clone() for TCP/UDP/Unix sockets 2014-02-05 11:43:49 -08:00
libsemver
libserialize pull extra::{serialize, ebml} into a separate libserialize crate 2014-02-05 10:38:22 -08:00
libstd auto merge of #12039 : alexcrichton/rust/no-conditions, r=brson 2014-02-06 17:11:33 -08:00
libsync move concurrent stuff from libextra to libsync 2014-02-05 11:56:04 -05:00
libsyntax auto merge of #12039 : alexcrichton/rust/no-conditions, r=brson 2014-02-06 17:11:33 -08:00
libterm
libuuid pull extra::{serialize, ebml} into a separate libserialize crate 2014-02-05 10:38:22 -08:00
libuv@fd5308383c
llvm@e1dabb48f0
rt
rustllvm
test auto merge of #12039 : alexcrichton/rust/no-conditions, r=brson 2014-02-06 17:11:33 -08:00
README.md
snapshots.txt Register new snapshots 2014-02-04 00:06:08 -08:00

This is a preliminary version of the Rust compiler, libraries and tools.

Source layout:

Path Description
librustc/ The self-hosted compiler
libstd/ The standard library (imported and linked by default)
libextra/ The "extras" library (slightly more peripheral code)
libgreen/ The M:N runtime library
libnative/ The 1:1 runtime library
libsyntax/ The Rust parser and pretty-printer
------------------- ---------------------------------------------------------
rt/ The runtime system
rt/rust_*.c - Some of the runtime services
rt/vg - Valgrind headers
rt/msvc - MSVC support
rt/sundown - The Markdown library used by rustdoc
------------------- ---------------------------------------------------------
compiletest/ The test runner
test/ Testsuite
test/codegen - Tests for the LLVM IR infrastructure
test/compile-fail - Tests that should fail to compile
test/debug-info - Tests for the debuginfo tool
test/run-fail - Tests that should compile, run and fail
test/run-make - Tests that depend on a Makefile infrastructure
test/run-pass - Tests that should compile, run and succeed
test/bench - Benchmarks and miscellaneous
test/pretty - Pretty-printer tests
test/auxiliary - Dependencies of tests
------------------- ---------------------------------------------------------
librustdoc/ The Rust API documentation tool
libuv/ The libuv submodule
------------------- ---------------------------------------------------------
llvm/ The LLVM submodule
rustllvm/ LLVM support code
------------------- ---------------------------------------------------------
etc/ Scripts, editors support, misc