title: F# "do" statements as Block expressions
body: <p>The <a href="http://fsharp.org/specs/language-spec/" rel="nofollow noreferrer">F# spec</a> describes in <em>10.2.5 <code>do</code> statements in Modules</em>, that on the module level a <code>do</code> statement may have attributes, and it will produce a warning, when the type of its expression does not evaluate to <code>unit</code>. Apparently, the behaviour of a <code>do</code> statement in other positions is akin to a Block expression (<em>6.5.1</em>), either a parenthesized or a begin-end-block, while still asserting the <code>unit</code> type.</p>
  
  <p>This makes the <code>do</code> statement suitable for controlling the scope of Deterministic disposal expressions (<em>6.6.4</em>):</p>
  
  <pre><code>let d x =
      printf "new %s, " x
      { new System.IDisposable with
          member __.Dispose() = printf "disposing %s, " x }
  
  let ab() =
      use a = d "a"
      use b = d "b"
      printf "a + b, "
  ab(); printfn ""
  // prints 'new a, new b, a + b, disposing b, disposing a, '
  
  let aba() =
      use a = d "a"
      do  use b = d "b"
          printf "a + b, "
      printf "a, "
  aba(); printfn ""
  // prints 'new a, new b, a + b, disposing b, a, disposing a, '
  </code></pre>
  
  <p>If it is not explicitly in the spec, is there anything else that keeps the maintainers of the F# compiler from breaking this usage?</p>