Has there ever been discussion around a python-like "with" syntax?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Has there ever been discussion around a python-like "with" syntax?

Dan Aprahamian
Hello all! First time posting here. I was curious if there was ever talk about adding something similar to python's with syntax to JS. Obviously we already have a "with" keyword, but I figure we could probably use "use" as the keyword instead. I was thinking something like

// Some user defined resource that can be "entered" and "exited"
class MyResource {
  // Function called when entered
  async [Symbol.enter]() {
  }

  // Function called when exited
  [Symbol.exit]() {
  }
}

const resource = new MyResource();

async function useResource() {
  use myResource {
    // Inside here, resource has had "acquire" called on it

    await doSomethingAsync();
    // Once this block is finished executing (including async)
    // release is called
  }
  // Release has been called now
}

Use would effectively be the equivalent of:

async function use(resource, body) {
  await resource[Symbol.enter]();
  try {
    await body();
  } finally {
    await resource[Symbol.exit]();
  }
}

Has something like this been considered before?

Thanks,
Dan

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Has there ever been discussion around a python-like "with" syntax?

Till Schneidereit-2
Ron Buckton has a proposal that's quite similar to what you're talking about: https://github.com/tc39/proposal-using-statement

On Mon, Oct 15, 2018 at 11:40 AM Dan Aprahamian <[hidden email]> wrote:
Hello all! First time posting here. I was curious if there was ever talk about adding something similar to python's with syntax to JS. Obviously we already have a "with" keyword, but I figure we could probably use "use" as the keyword instead. I was thinking something like

// Some user defined resource that can be "entered" and "exited"
class MyResource {
  // Function called when entered
  async [Symbol.enter]() {
  }

  // Function called when exited
  [Symbol.exit]() {
  }
}

const resource = new MyResource();

async function useResource() {
  use myResource {
    // Inside here, resource has had "acquire" called on it

    await doSomethingAsync();
    // Once this block is finished executing (including async)
    // release is called
  }
  // Release has been called now
}

Use would effectively be the equivalent of:

async function use(resource, body) {
  await resource[Symbol.enter]();
  try {
    await body();
  } finally {
    await resource[Symbol.exit]();
  }
}

Has something like this been considered before?

Thanks,
Dan
_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
Reply | Threaded
Open this post in threaded view
|

Re: Has there ever been discussion around a python-like "with" syntax?

Michael J. Ryan
I was going to mention C#'s using statement as well... though I do like the use of a symbol over Ron's proposal, I think using might be a better approach.


On Mon, Oct 15, 2018 at 11:50 AM Till Schneidereit <[hidden email]> wrote:
Ron Buckton has a proposal that's quite similar to what you're talking about: https://github.com/tc39/proposal-using-statement

On Mon, Oct 15, 2018 at 11:40 AM Dan Aprahamian <[hidden email]> wrote:
Hello all! First time posting here. I was curious if there was ever talk about adding something similar to python's with syntax to JS. Obviously we already have a "with" keyword, but I figure we could probably use "use" as the keyword instead. I was thinking something like

// Some user defined resource that can be "entered" and "exited"
class MyResource {
  // Function called when entered
  async [Symbol.enter]() {
  }

  // Function called when exited
  [Symbol.exit]() {
  }
}

const resource = new MyResource();

async function useResource() {
  use myResource {
    // Inside here, resource has had "acquire" called on it

    await doSomethingAsync();
    // Once this block is finished executing (including async)
    // release is called
  }
  // Release has been called now
}

Use would effectively be the equivalent of:

async function use(resource, body) {
  await resource[Symbol.enter]();
  try {
    await body();
  } finally {
    await resource[Symbol.exit]();
  }
}

Has something like this been considered before?

Thanks,
Dan
_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[hidden email]
https://mail.mozilla.org/listinfo/es-discuss