> On 13 Apr 2018, at 3:48 AM, Mike Samuel <mikesam...@gmail.com> wrote: > > This seems like it could be done with decorators per > https://github.com/tc39/proposal-decorators > <https://github.com/tc39/proposal-decorators> without introducing a new > keyword. > > @promises function sleep(...) { > ... > }
the problem with using decorators, object.defineproperty, and other meta-programming features in javascript, is that no one has carefully thought out how they can be easily debugged, especially in javascript’s quirky, non-blocking-design context. imagine google’s gwt, and removing most of its compile-time checks. that's essentially the direction es6/es7/es8/etc seems to be headed (and if that’s the case, how is it better than gwt?). is this what we want? a language with java's meta-programming power, but lacking most of its safety-features? how successful in getting shipped, do you think a java-project as complicated as a typical web-project would be without compile-time meta-programming checks? exactly ... and this is pretty much what the current state of the web-industry is like :`( to illustrate with code, npm has this particular meta-programming gem [1], which leads to this surprising behavior (and corresponding real-world scenario where this was encountered [2]): ```js /* * example1.js * * example usage: * $ npm install npm && node example1.js * * example output: * Error: Call npm.load(config, cb) before using this command. * See the README.md or bin/npm-cli.js for example usage. */ /*jslint node: true */ 'use strict'; var command, npm; npm = require('npm'); Object.keys(npm.commands).forEach(function (key) { // how many people would expect this to throw an error? command = npm.commands[key]; // rather than this? try { command(); } catch (ignore) { } }); console.log('caught all errors'); ``` here's the fix that was applied (and corresponding real-world solution [3]). but again, why should web-developers have to second-guess that arbitrary property-accesses might throw errors (and waste valuable engineering-time constantly guarding against them)? ```js /* * example2.js * * example usage: * $ npm install npm && node example2.js * * example output: * caught all errors */ /*jslint node: true */ 'use strict'; var command, npm, objectKeysSafe; npm = require('npm'); objectKeysSafe = function (dict) { /* * this function will return a list of the dict's keys, * that are safely accessible */ return Object.keys(dict).filter(function (key) { try { return dict[key] || true; } catch (ignore) { } }); }; objectKeysSafe(npm.commands).forEach(function (key) { // how many people would expect this to throw an error? command = npm.commands[key]; // rather than this? try { command(); } catch (ignore) { } }); console.log('caught all errors'); ``` [1] https://github.com/npm/npm/blob/v5.8.0/lib/npm.js#L112 <https://github.com/npm/npm/blob/v5.8.0/lib/npm.js#L112> - "npm/npm.js at v5.8.0 · npm/npm" [2] https://travis-ci.org/npmdoc/node-npmdoc-npm/builds/365262668#L1300 <https://travis-ci.org/npmdoc/node-npmdoc-npm/builds/365262668#L1300> - "Travis CI - Test and Deploy Your Code with Confidence" [3] https://github.com/kaizhu256/node-apidoc-lite/blob/2017.4.12/lib.apidoc.js#L1019 <https://github.com/kaizhu256/node-apidoc-lite/blob/2017.4.12/lib.apidoc.js#L1019> - “node-apidoc-lite/lib.apidoc.js at 2017.4.12"
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss