[rust-dev] Brace-free if and alt

Patrick Walton pwalton at mozilla.com
Wed Apr 11 13:28:05 PDT 2012


Here's a total bikeshed. Apologies in advance:

There's been some criticism of Rust's syntax for being too brace-heavy. 
I've been thinking this for a while. Here's a minimal delta on the 
current syntax to address this:

Examples:

	// before:
	if foo() == "bar" { 10 } else { 20 }

	// after:
	if foo() == "bar" then 10 else 20
	// or:
	if foo() == "bar" { 10 } else { 20 }

	// before:
	alt foo() {
	    "bar" { 10 }
	    "baz" { 20 }
	    "boo" { 30 }
	}

	// after:
	alt foo() {
	    "bar" => 10,
	    "baz" => 20,
	    "boo" => 30
	}
	// or:
	alt foo() {
	    "bar" { 10 }
	    "baz" { 20 }
	    "boo" { 30 }
	}

BNF:

	if ::== "if" expr ("then" expr | block) ("else" expr)?
	alt ::== "alt" expr "{" (arm* last-arm) "}"
	arm ::== block-arm | pat "=>" expr ","
	last-arm ::== block-arm | pat "=>" expr ","?
	block-arm ::== pat block

You can think of it this way: We insert a "then" before the 
then-expression of each if; however, you can omit it if you use a block. 
We also insert a "=>" before each expression in an alt arm and a "," to 
separate expressions from subsequent patterns; however, both can be 
omitted if the arm expression is a block.

This does, unfortunately, create the dangling else ambiguity. I'm not 
sure this is much of a problem in practice, but it might be an issue.

The pretty printer would always omit the "then" and the "=>"/"," when 
the alt arm is a block. That way, we aren't introducing multiple 
preferred syntactic forms of the same Rust code (which I agree is 
generally undesirable); the blessed style is to never over-annotate when 
a "then" body or an alt expression is a block.

Here's an example piece of code (Jonanin's emulator) written 
before-and-after:

Before: https://github.com/Jonanin/rust-dcpu16/blob/master/asm.rs
After: https://gist.github.com/2360838

Thoughts?

Patrick


More information about the Rust-dev mailing list