<story><title>2016 Rust Commercial User Survey Results</title><url>https://internals.rust-lang.org/t/2016-rust-commercial-user-survey-results/4317</url></story><parent_chain><item><author>Animats</author><text>From the article: &lt;i&gt;&amp;quot;...fourteen companies responded to our outreach&amp;quot;&lt;/i&gt;&lt;p&gt;That&amp;#x27;s not a survey, that&amp;#x27;s a focus group.&lt;p&gt;I&amp;#x27;m impressed with Rust.  The borrow checker is the biggest advance in memory safety since garbage collection.&lt;p&gt;But there&amp;#x27;s a lot about Rust that&amp;#x27;s unnecessarily weird.&lt;p&gt;- The type system is unusual, and complex. It&amp;#x27;s hard to do anything without templates.&lt;p&gt;- The template libraries are heavily biased towards closure-oriented functional programming. This is cool, but hard to read.  Parts of expressions are nameless and have no visible type. This is terse but hard to maintain.&lt;p&gt;- The hacks needed to avoid the need for exceptions are uglier than exceptions.&lt;p&gt;This creates major obstacles to adoption. Unlike the borrow checker, none of these things are clearly improvements. They&amp;#x27;re just different.&lt;p&gt;I would have gone for Python-type exceptions rather than error enums and macros, single-inheritance OOP rather than traits, and Python-type with clauses rather than RAII.</text></item></parent_chain><comment><author>pcwalton</author><text>&amp;gt; - The type system is unusual, and complex. It&amp;#x27;s hard to do anything without templates.&lt;p&gt;You need generics to have the borrow checker that you praise above. Otherwise references would be basically crippled.&lt;p&gt;&amp;gt;  The template libraries are heavily biased towards closure-oriented functional programming.&lt;p&gt;No, they aren&amp;#x27;t. I use for loops all the time in Rust, and it&amp;#x27;s totally natural to do so. My general guideline in my own code (which is followed in projects like WebRender and Servo layout) is that if it&amp;#x27;s one line, I use the functional idiom; if it&amp;#x27;s more than one line, I use a for loop.&lt;p&gt;&amp;gt;  Parts of expressions are nameless and have no visible type. This is terse but hard to maintain.&lt;p&gt;Are you thinking of unboxed closures here? If so, they&amp;#x27;re necessary to avoid unnecessary heap allocations in normal code. If we didn&amp;#x27;t have that, then we couldn&amp;#x27;t compete with C++11 closures.&lt;p&gt;&amp;gt; - The hacks needed to avoid the need for exceptions are uglier than exceptions.&lt;p&gt;Unwinding is the single most divisive issue in Rust. We would alienate most of our community (I&amp;#x27;m not kidding) if libraries required it. For a time, there was a language fork over the issue until it was resolved.&lt;p&gt;&amp;gt; Unlike the borrow checker, none of these things are clearly improvements. They&amp;#x27;re just different.&lt;p&gt;No, they&amp;#x27;re needed for the borrow checker and most of the other features to work.&lt;p&gt;&amp;gt; I would have gone for Python-type exceptions rather than error enums and macros&lt;p&gt;Then, as above, you instantly alienate all embedded developers.&lt;p&gt;&amp;gt; single-inheritance OOP rather than traits&lt;p&gt;This doesn&amp;#x27;t work in practice unless you introduce interfaces: it&amp;#x27;s way too inexpressive. This is why Java and C# have interfaces. Traits are just interfaces.&lt;p&gt;&amp;gt; Python-type with clauses rather than RAII.&lt;p&gt;You want to force an extra layer of indentation for every Box or Vec you create, and leak memory if you forget to write &amp;quot;with&amp;quot;? No thank you!</text></comment>
<story><title>2016 Rust Commercial User Survey Results</title><url>https://internals.rust-lang.org/t/2016-rust-commercial-user-survey-results/4317</url></story><parent_chain><item><author>Animats</author><text>From the article: &lt;i&gt;&amp;quot;...fourteen companies responded to our outreach&amp;quot;&lt;/i&gt;&lt;p&gt;That&amp;#x27;s not a survey, that&amp;#x27;s a focus group.&lt;p&gt;I&amp;#x27;m impressed with Rust.  The borrow checker is the biggest advance in memory safety since garbage collection.&lt;p&gt;But there&amp;#x27;s a lot about Rust that&amp;#x27;s unnecessarily weird.&lt;p&gt;- The type system is unusual, and complex. It&amp;#x27;s hard to do anything without templates.&lt;p&gt;- The template libraries are heavily biased towards closure-oriented functional programming. This is cool, but hard to read.  Parts of expressions are nameless and have no visible type. This is terse but hard to maintain.&lt;p&gt;- The hacks needed to avoid the need for exceptions are uglier than exceptions.&lt;p&gt;This creates major obstacles to adoption. Unlike the borrow checker, none of these things are clearly improvements. They&amp;#x27;re just different.&lt;p&gt;I would have gone for Python-type exceptions rather than error enums and macros, single-inheritance OOP rather than traits, and Python-type with clauses rather than RAII.</text></item></parent_chain><comment><author>vvanders</author><text>&amp;gt; The type system is unusual, and complex. It&amp;#x27;s hard to do anything without templates.&lt;p&gt;You mean generics not templates?&lt;p&gt;Nothing forces you to use generics, you can pass traits by pointer and avoid the code generation. It&amp;#x27;s actually a really nice property that lets you determine static vs dynamic dispatch independent of implementation&lt;p&gt;WRT Exceptions, this has been widely debated. I personally prefer error codes. I hate unchecked exceptions, ruins the whole idea.&lt;p&gt;Also I&amp;#x27;m not a huge fan of OOP hierarchies. They tend lean more towards Is-A vs Has-A when the latter is more common across the domains I&amp;#x27;ve worked in.</text></comment>