Richard,<br><br>don't you think about case as some sort of imperative construction? Because I can't see why "case" can't be that "keyword to introduce new variable" — case is isolated in some sense. It was already done with list comprehensions, after all. Moreover, this is the case in Haskell that you've mentioned:<br><br>Prelude> let a = [1, 2, 3]<br>Prelude> case a of [b, c, d] -> "ok"<br>"ok"<br>Prelude> b<br><interactive>:6:1: Not in scope: `b'<br><br>So does OCaml:<br><br># let a = [1; 2; 3] ;;<br>val a : int list = [1; 2; 3]<br># match a with<br>    [b; c; d] -> b<br>  | _ -> 0 ;;<br>- : int = 1<br># b ;;<br>Error: Unbound value b<br><br><br>So it's more like some obscure "feature" of Erlang for newcomers, which is no good.<br>Speaking about better example:<br><br>test(Input) -><br>    Result = case test1(Input) of<br>                 {ok, BetterInput} -><br>                     case test2(BetterInput) of<br>                         {ok, BestInput} -><br>                             do_something(BestInput);<br>                         {error, _Reason}=Error -><br>                             Error<br>                     end;<br>                 {error, _Reson}=Error -><br>                     Error<br>             end,<br>    case Result of<br>        {ok, _}=Ok -> Ok;<br>        {error, _Reason}=Error -> %% OOPS!<br>            do_something_on_error(Error)<br>    end.<br><br>I can come up with a few solutions to this compile-time error, but I can't understand why I should. Correct indentation solves a problem of reasoning about nested constructions.<br><br>On Wednesday, July 11, 2012 5:35:07 AM UTC+4, Richard O'Keefe wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<br>On 10/07/2012, at 10:00 PM, Dmitry Groshev wrote:
<br>
<br>> Exactly what I was talking about. I can't see any sense in bloating the code with nonsensical functions
<br>
<br>It isn't the functions that are nonsensical, it is
<br>using the same variable with two different meanings
<br>which is in the strict literal sense of the word nonsensical.
<br>
<br>Give us a serious example!
<br>Show us some code that is easier to read if you do this!
<br>
<br>Yes, other functional languages have nested variable scopes within a
<br>single function (although the semantics is often defined in terms of
<br>nested functions), BUT those languages require you to introduce new
<br>bindings with keywords
<br>
<br>    (define (f X)
<br>      (let ((R) (E))              ;;; HERE!
<br>        (let ((V (do-something)))
<br>          (case (car V)
<br>            ((result) (set! R (cadr V)))
<br>            ((error)  (set! E (cadr V))))))
<br>      (let ((R) (E))              ;;; HERE!
<br>          (case (car V)
<br>            ((result) (set! R (cadr V)))
<br>            ((error)  (set! E (cadr V)))))))
<br>
<br>Lisp and Scheme have LET and LET*.
<br>ML has let.
<br>Haskell has let and where.
<br>
<br>If you want Lisp-Flavoured Erlang, it exists.
<br>
<br>______________________________<wbr>_________________
<br>erlang-questions mailing list
<br><a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a>
<br><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a>
<br></blockquote>