Gajus Kuizinas (2016-05-03T20:02:14.000Z)
> I don't think this flies anyway. It has to be more like a function body,
otherwise var and function declarations would hoist out of it, which would
be insane IMO.
Agreed.
> Also, I really would want to avoid examples like [..]
Agreed.
> IIUC, the goal here is to allow a sequence of statements to produce a
value, not (necessarily) to allow arbitrary block semantics.
Agreed.
> strict function declarations don't hoist out of blocks, so the hoisting
issue is var only. I would find it surprising if var declarations did not
hoist out of do expressions.
If the intention is to have do-as-IIFE, then it would surprising to see var
host outside of a do expression.
> If all we want is sugar for IIFEs, I wouldn't bother. With arrow
functions, IIFEs are already a lot shorter. The extra brevity of do
expressions is not worth it.
I disagree. It is nice to be able to define a one-off IIFE. Furthermore,
wouldn't this allow a simpler GC implementation?
> I find the do{} solution more elegant and I believe this pattern ()=>{}()
will be abused pretty soon and JS will start looking like brainfuck but
that's another story I guess.
Agreed.
> I do have one usability concern with arrow IIFEs. I hate when I see them
written as ()=>{...whatever...}() because you don't know that it's an IIFE
until the end. Function expressions have the same issue.
Good point.
> Rather, I suggest that the following must work:> while (true) { do {
break; } }
I am surprised by this requirement. I don't think `do` should serve allow
control flow statements at all.
I would argue that `do` expression would be mostly useful for promoting use
of `const`, e.g.,
    _.map(groupedEvents, (locationEvents) => {        let locationName;
        const locationEvent = locationEvents[0];
        if (locationEvent.locationDisplayName) {            locationName =
locationEvent.locationDisplayName;        } else if
(locationEvent.cinemaIsPlatform)
{            locationName = locationEvent.locationName;        } else if (
isCinemaNamePartOfLocationName(locationEvent.locationName,
locationEvent.cinemaName)) {            locationName =
locationEvent.locationName;        } else {            locationName =
locationEvent.cinemaName + ' ' + locationEvent.locationName;        }
        // ...
I would like to avoid using `let` in this case and `do` expression is great
for this:
    _.map(groupedEvents, (locationEvents) => {        let locationName;
        const locationEvent = locationEvents[0];
        const locationName = do {            if
(locationEvent.locationDisplayName)
{                locationEvent.locationDisplayName;            } else if
(locationEvent.cinemaIsPlatform) {
locationEvent.locationName;            } else if (
isCinemaNamePartOfLocationName(locationEvent.locationName,
locationEvent.cinemaName)) {                locationEvent.locationName;
        } else {                locationEvent.cinemaName + ' ' +
locationEvent.locationName;            }        };
        // ...
However, I do not like at all that `do` expression returns value of the
last statement. I would much rather prefer to have `return` to be able to
control return of the value within `do` expression, e.g.
    _.map(groupedEvents, (locationEvents) => {        let locationName;
        const locationEvent = locationEvents[0];
        const locationName = do {            if
(locationEvent.locationDisplayName)
{                return locationEvent.locationDisplayName;            }
            if (locationEvent.cinemaIsPlatform) {                return
locationEvent.locationName;            }
            if (isCinemaNamePartOfLocationName(locationEvent.locationName,
locationEvent.cinemaName)) {                return
locationEvent.locationName;            }
            return locationEvent.cinemaName + ' ' +
locationEvent.locationName;        };
        // ...
Has this discussion been moved to some other medium?
No messages have been exchanged since 2014. In the mean time, transpilers
such as Babel have implemented the proposal (
http://babeljs.io/docs/plugins/transform-do-expressions/) and are
"promoting" its use in the form of the original proposal.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160503/7fdd16f4/attachment.html>
gajus at gajus.com (2016-05-03T20:06:54.094Z)
> I don't think this flies anyway. It has to be more like a function body, otherwise var and function declarations would hoist out of it, which would be insane IMO.

Agreed.

> Also, I really would want to avoid examples like [..]

Agreed.

> IIUC, the goal here is to allow a sequence of statements to produce a value, not (necessarily) to allow arbitrary block semantics.

Agreed.

> strict function declarations don't hoist out of blocks, so the hoisting issue is var only. I would find it surprising if var declarations did not hoist out of do expressions.

If the intention is to have do-as-IIFE, then it would surprising to see var host outside of a do expression.

> If all we want is sugar for IIFEs, I wouldn't bother. With arrow functions, IIFEs are already a lot shorter. The extra brevity of do expressions is not worth it.

I disagree. It is nice to be able to define a one-off IIFE. Furthermore, wouldn't this allow a simpler GC implementation?

> I find the do{} solution more elegant and I believe this pattern ()=>{}() will be abused pretty soon and JS will start looking like brainfuck but that's another story I guess.

Agreed.

> I do have one usability concern with arrow IIFEs. I hate when I see them written as ()=>{...whatever...}() because you don't know that it's an IIFE until the end. Function expressions have the same issue.

Good point.

> Rather, I suggest that the following must work:
> while (true) { do { break; } }

I am surprised by this requirement. I don't think that `do` expression should allow control flow statements at all (of the block in which it is contained).

I would argue that `do` expression would be mostly useful for promoting use of `const`, e.g.,

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        if (locationEvent.locationDisplayName) {
            locationName = locationEvent.locationDisplayName;
        } else if (locationEvent.cinemaIsPlatform) {
            locationName = locationEvent.locationName;
        } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
            locationName = locationEvent.locationName;
        } else {
            locationName = locationEvent.cinemaName + ' ' + locationEvent.locationName;
        }

        // ...

I would like to avoid using `let` in this case and `do` expression is great for this:

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                locationEvent.locationDisplayName;
            } else if (locationEvent.cinemaIsPlatform) {
                locationEvent.locationName;
            } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                locationEvent.locationName;
            } else {
                locationEvent.cinemaName + ' ' + locationEvent.locationName;
            }
        };

        // ...

However, I do not like at all that `do` expression returns value of the last statement. I would much rather prefer to have `return` to be able to control return of the value within `do` expression, e.g.

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                return locationEvent.locationDisplayName;
            }

            if (locationEvent.cinemaIsPlatform) {
                return locationEvent.locationName;
            }

            if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                return locationEvent.locationName;
            }

            return locationEvent.cinemaName + ' ' + locationEvent.locationName;
        };

        // ...

Has this discussion been moved to some other medium?

No messages have been exchanged since 2014. In the mean time, transpilers such as Babel have implemented the proposal (http://babeljs.io/docs/plugins/transform-do-expressions/) and are "promoting" its use in the form of the original proposal.
gajus at gajus.com (2016-05-03T20:06:24.829Z)
> I don't think this flies anyway. It has to be more like a function body, otherwise var and function declarations would hoist out of it, which would be insane IMO.

Agreed.

> Also, I really would want to avoid examples like [..]

Agreed.

> IIUC, the goal here is to allow a sequence of statements to produce a value, not (necessarily) to allow arbitrary block semantics.

Agreed.

> strict function declarations don't hoist out of blocks, so the hoisting issue is var only. I would find it surprising if var declarations did not hoist out of do expressions.

If the intention is to have do-as-IIFE, then it would surprising to see var host outside of a do expression.

> If all we want is sugar for IIFEs, I wouldn't bother. With arrow functions, IIFEs are already a lot shorter. The extra brevity of do expressions is not worth it.

I disagree. It is nice to be able to define a one-off IIFE. Furthermore, wouldn't this allow a simpler GC implementation?

> I find the do{} solution more elegant and I believe this pattern ()=>{}() will be abused pretty soon and JS will start looking like brainfuck but that's another story I guess.

Agreed.

> I do have one usability concern with arrow IIFEs. I hate when I see them written as ()=>{...whatever...}() because you don't know that it's an IIFE until the end. Function expressions have the same issue.

Good point.

> Rather, I suggest that the following must work:
> while (true) { do { break; } }

I am surprised by this requirement. I don't think that `do` expression should allow control flow statements at all.

I would argue that `do` expression would be mostly useful for promoting use of `const`, e.g.,

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        if (locationEvent.locationDisplayName) {
            locationName = locationEvent.locationDisplayName;
        } else if (locationEvent.cinemaIsPlatform) {
            locationName = locationEvent.locationName;
        } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
            locationName = locationEvent.locationName;
        } else {
            locationName = locationEvent.cinemaName + ' ' + locationEvent.locationName;
        }

        // ...

I would like to avoid using `let` in this case and `do` expression is great for this:

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                locationEvent.locationDisplayName;
            } else if (locationEvent.cinemaIsPlatform) {
                locationEvent.locationName;
            } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                locationEvent.locationName;
            } else {
                locationEvent.cinemaName + ' ' + locationEvent.locationName;
            }
        };

        // ...

However, I do not like at all that `do` expression returns value of the last statement. I would much rather prefer to have `return` to be able to control return of the value within `do` expression, e.g.

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                return locationEvent.locationDisplayName;
            }

            if (locationEvent.cinemaIsPlatform) {
                return locationEvent.locationName;
            }

            if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                return locationEvent.locationName;
            }

            return locationEvent.cinemaName + ' ' + locationEvent.locationName;
        };

        // ...

Has this discussion been moved to some other medium?

No messages have been exchanged since 2014. In the mean time, transpilers such as Babel have implemented the proposal (http://babeljs.io/docs/plugins/transform-do-expressions/) and are "promoting" its use in the form of the original proposal.
gajus at gajus.com (2016-05-03T20:06:00.921Z)
> I don't think this flies anyway. It has to be more like a function body, otherwise var and function declarations would hoist out of it, which would be insane IMO.

Agreed.

> Also, I really would want to avoid examples like [..]

Agreed.

> IIUC, the goal here is to allow a sequence of statements to produce a value, not (necessarily) to allow arbitrary block semantics.

Agreed.

> strict function declarations don't hoist out of blocks, so the hoisting issue is var only. I would find it surprising if var declarations did not hoist out of do expressions.

If the intention is to have do-as-IIFE, then it would surprising to see var host outside of a do expression.

> If all we want is sugar for IIFEs, I wouldn't bother. With arrow functions, IIFEs are already a lot shorter. The extra brevity of do expressions is not worth it.

I disagree. It is nice to be able to define a one-off IIFE. Furthermore, wouldn't this allow a simpler GC implementation?

> I find the do{} solution more elegant and I believe this pattern ()=>{}() will be abused pretty soon and JS will start looking like brainfuck but that's another story I guess.

Agreed.

> I do have one usability concern with arrow IIFEs. I hate when I see them written as ()=>{...whatever...}() because you don't know that it's an IIFE until the end. Function expressions have the same issue.

Good point.

> Rather, I suggest that the following must work:
> while (true) { do { break; } }

I am surprised by this requirement. I don't think `do` expression should allow control flow statements at all.

I would argue that `do` expression would be mostly useful for promoting use of `const`, e.g.,

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        if (locationEvent.locationDisplayName) {
            locationName = locationEvent.locationDisplayName;
        } else if (locationEvent.cinemaIsPlatform) {
            locationName = locationEvent.locationName;
        } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
            locationName = locationEvent.locationName;
        } else {
            locationName = locationEvent.cinemaName + ' ' + locationEvent.locationName;
        }

        // ...

I would like to avoid using `let` in this case and `do` expression is great for this:

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                locationEvent.locationDisplayName;
            } else if (locationEvent.cinemaIsPlatform) {
                locationEvent.locationName;
            } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                locationEvent.locationName;
            } else {
                locationEvent.cinemaName + ' ' + locationEvent.locationName;
            }
        };

        // ...

However, I do not like at all that `do` expression returns value of the last statement. I would much rather prefer to have `return` to be able to control return of the value within `do` expression, e.g.

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                return locationEvent.locationDisplayName;
            }

            if (locationEvent.cinemaIsPlatform) {
                return locationEvent.locationName;
            }

            if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                return locationEvent.locationName;
            }

            return locationEvent.cinemaName + ' ' + locationEvent.locationName;
        };

        // ...

Has this discussion been moved to some other medium?

No messages have been exchanged since 2014. In the mean time, transpilers such as Babel have implemented the proposal (http://babeljs.io/docs/plugins/transform-do-expressions/) and are "promoting" its use in the form of the original proposal.
gajus at gajus.com (2016-05-03T20:04:30.249Z)
> I don't think this flies anyway. It has to be more like a function body, otherwise var and function declarations would hoist out of it, which would be insane IMO.

Agreed.

> Also, I really would want to avoid examples like [..]

Agreed.

> IIUC, the goal here is to allow a sequence of statements to produce a value, not (necessarily) to allow arbitrary block semantics.

Agreed.

> strict function declarations don't hoist out of blocks, so the hoisting issue is var only. I would find it surprising if var declarations did not hoist out of do expressions.

If the intention is to have do-as-IIFE, then it would surprising to see var host outside of a do expression.

> If all we want is sugar for IIFEs, I wouldn't bother. With arrow functions, IIFEs are already a lot shorter. The extra brevity of do expressions is not worth it.

I disagree. It is nice to be able to define a one-off IIFE. Furthermore, wouldn't this allow a simpler GC implementation?

> I find the do{} solution more elegant and I believe this pattern ()=>{}() will be abused pretty soon and JS will start looking like brainfuck but that's another story I guess.

Agreed.

> I do have one usability concern with arrow IIFEs. I hate when I see them written as ()=>{...whatever...}() because you don't know that it's an IIFE until the end. Function expressions have the same issue.

Good point.

> Rather, I suggest that the following must work:
> while (true) { do { break; } }

I am surprised by this requirement. I don't think `do` should serve allow control flow statements at all.

I would argue that `do` expression would be mostly useful for promoting use of `const`, e.g.,

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        if (locationEvent.locationDisplayName) {
            locationName = locationEvent.locationDisplayName;
        } else if (locationEvent.cinemaIsPlatform) {
            locationName = locationEvent.locationName;
        } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
            locationName = locationEvent.locationName;
        } else {
            locationName = locationEvent.cinemaName + ' ' + locationEvent.locationName;
        }

        // ...

I would like to avoid using `let` in this case and `do` expression is great for this:

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                locationEvent.locationDisplayName;
            } else if (locationEvent.cinemaIsPlatform) {
                locationEvent.locationName;
            } else if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                locationEvent.locationName;
            } else {
                locationEvent.cinemaName + ' ' + locationEvent.locationName;
            }
        };

        // ...

However, I do not like at all that `do` expression returns value of the last statement. I would much rather prefer to have `return` to be able to control return of the value within `do` expression, e.g.

    _.map(groupedEvents, (locationEvents) => {
        let locationName;

        const locationEvent = locationEvents[0];

        const locationName = do {
            if (locationEvent.locationDisplayName) {
                return locationEvent.locationDisplayName;
            }

            if (locationEvent.cinemaIsPlatform) {
                return locationEvent.locationName;
            }

            if (isCinemaNamePartOfLocationName(locationEvent.locationName, locationEvent.cinemaName)) {
                return locationEvent.locationName;
            }

            return locationEvent.cinemaName + ' ' + locationEvent.locationName;
        };

        // ...

Has this discussion been moved to some other medium?

No messages have been exchanged since 2014. In the mean time, transpilers such as Babel have implemented the proposal (http://babeljs.io/docs/plugins/transform-do-expressions/) and are "promoting" its use in the form of the original proposal.