Not quite, the mechanism which does this in the spec is SetFunctionName (http://www.ecma-international.org/ecma-262/6.0/#sec-setfunctionname <http://www.ecma-international.org/ecma-262/6.0/#sec-setfunctionname>), and it only works for specific syntactic constructs (eg, `foo = function() {}` -> anonymous function is named “foo”, let x = () => {} -> anonymous arrow is named “x”, etc).
It does not apply to things like `compose(thingA, thingB)`, which is not an anonymous function definition.These function names aren’t set at runtime, it’s a parse-time operation, and depends on the productions that are parsed. > On Sep 16, 2015, at 9:35 PM, Jason Kuhrt <[email protected]> wrote: > > Also I disagree with your assessment that I should go talk to the vendors. > For example Axel R.’s recent post on Function names > http://www.2ality.com/2015/09/function-names-es6.html > <http://www.2ality.com/2015/09/function-names-es6.html> states in Section 2 > the case where there is no name. I clarified on Twitter with him just now > https://twitter.com/JasonKuhrt/status/644312567012323328 > <https://twitter.com/JasonKuhrt/status/644312567012323328> that indeed the > first ident assignment to an anon function will set its name. This is all > thanks to JS 2015 not vendors (of course we need their compliance next). > > So given the above in the future a compose function such as > > ``` > let compose = (b, a) => (...as) => b(a(...as)) > ``` > > that is used like so: > > ``` > const componentFactory = compose(React.createFactory, React.createClass) > ``` > > Should have great stack trace support e.g.: > > ``` > at componentFactory (/Users/jasonkuhrt/code/test/component-factory.js:1:36) > ``` > > So the reason I wrote this email is partially negated by Axel’s helpful > information. However I’m still curious in any other thoughts trotting around > for near or future about how to make the situation better around naming > functions? > > >> On Sep 16, 2015, at 9:19 PM, James Kyle <[email protected] >> <mailto:[email protected]>> wrote: >> >> Okay, let's break this down. Your example stack trace is really not a bad >> story. >> >> >> > Error: Invariant Violation: createClass(...): Class specification must >> > implement a `render` method. >> > at invariant >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/invariant.js:42:15) >> > at ReactClass.createClass >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/ReactClass.js:898:46) >> > >> > at /Users/jasonkuhrt/code/test/component-factory.js:4:41 >> > >> > at Object.<anonymous> (/Users/jasonkuhrt/code/test/test.js:4:1) >> > at Module._compile (module.js:434:26) >> > at normalLoader >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5) >> > at Object.require.extensions.(anonymous function) [as .js] >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7) >> > at Module.load (module.js:355:32) >> > at Function.Module._load (module.js:310:12) >> > at Function.Module.runMain (module.js:475:10) >> >> >> First off, you need to remove all the module loading-related stuff: >> >> >> > Error: Invariant Violation: createClass(...): Class specification must >> > implement a `render` method. >> > at invariant >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/invariant.js:42:15) >> > at ReactClass.createClass >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/ReactClass.js:898:46) >> > >> > at /Users/jasonkuhrt/code/test/component-factory.js:4:41 >> > >> > at Object.<anonymous> (/Users/jasonkuhrt/code/test/test.js:4:1) >> >> >> Now, You're left with test code and the internal stack trace of React. >> Remove the React stuff and you have: >> >> >> > Error: Invariant Violation: createClass(...): Class specification must >> > implement a `render` method. >> > at /Users/jasonkuhrt/code/test/component-factory.js:4:41 >> > >> > at Object.<anonymous> (/Users/jasonkuhrt/code/test/test.js:4:1) >> >> >> I'm assuming that 2nd item is just the test itself so let's kill that too. >> >> >> > Error: Invariant Violation: createClass(...): Class specification must >> > implement a `render` method. >> > at /Users/jasonkuhrt/code/test/component-factory.js:4:41 >> >> >> So your error is around line 4 of `/code/test/component-factory.js`, and the >> error is that you created a React class without a render method. >> >> I don't see what was bad about that, you certainly wouldn't want remove any >> of that stack trace as it's all real operations that might need debugging. >> >> I also don't see what this has to do with your FP example of: >> >> >> > ``` >> > let compose = (b, a) => (...as) => b(a(...as)) >> > ``` >> >> >> As that's clearly not the issue in your stack trace. >> >> Also, if you want these stack traces to be more meaningful, you should be >> talking to the JavaScript engine implementor. In your case v8 (since you're >> using Node). >> >> >> — >> This email brought to you by the letters T, J, and K. >> >> >> On Wed, Sep 16, 2015 at 5:16 PM, Jason Kuhrt <[email protected] >> <mailto:[email protected]>> wrote: >> >> For example, today, a stone from the bedrock of FP: >> >> > ``` >> > let compose = (b, a) => (...as) => b(a(...as)) >> > ``` >> >> will cause a JS Stack Trace to go from something useful (space around useful >> line) like: >> >> > ``` >> >> > Error: Invariant Violation: createClass(...): Class specification must >> > implement a `render` method. >> >> > at invariant >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/invariant.js:42:15) >> >> > at ReactClass.createClass >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/ReactClass.js:898:46) >> >> > >> >> > at componentFactory (/Users/jasonkuhrt/code/test/component-factory.js:1:36) >> >> > >> >> > at Object.<anonymous> (/Users/jasonkuhrt/code/test/test.js:4:1) >> > at Module._compile (module.js:460:26) >> > at normalLoader >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5) >> > at Object.require.extensions.(anonymous function) [as .js] >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7) >> > at Module.load (module.js:355:32) >> > at Function.Module._load (module.js:310:12) >> > at Function.Module.runMain (module.js:501:10) >> >> > ``` >> >> To something much less useful like this: >> >> > ``` >> >> > Error: Invariant Violation: createClass(...): Class specification must >> > implement a `render` method. >> > at invariant >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/invariant.js:42:15) >> > at ReactClass.createClass >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/ReactClass.js:898:46) >> > >> > at /Users/jasonkuhrt/code/test/component-factory.js:4:41 >> > >> > at Object.<anonymous> (/Users/jasonkuhrt/code/test/test.js:4:1) >> > at Module._compile (module.js:434:26) >> > at normalLoader >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5) >> > at Object.require.extensions.(anonymous function) [as .js] >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7) >> > at Module.load (module.js:355:32) >> > at Function.Module._load (module.js:310:12) >> > at Function.Module.runMain (module.js:475:10) >> >> > ``` >> >> And ultimately being in a real-life scenario/library/etc. (e.g. Ramda >> compose) leading to something almost useless: >> >> > ``` >> >> > Error: Invariant Violation: createClass(...): Class specification must >> > implement a `render` method. >> > at invariant >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/invariant.js:42:15) >> > at ReactClass.createClass >> > (/Users/jasonkuhrt/code/test/node_modules/react/lib/ReactClass.js:898:46) >> > >> > at /Users/jasonkuhrt/code/test/node_modules/ramda/dist/ramda.js:384:35 >> > at f1 (/Users/jasonkuhrt/code/test/node_modules/ramda/dist/ramda.js:156:27) >> > >> > at Object.<anonymous> (/Users/jasonkuhrt/code/test/test.js:4:1) >> > at Module._compile (module.js:434:26) >> > at normalLoader >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:199:5) >> > at Object.require.extensions.(anonymous function) [as .js] >> > (/usr/local/lib/node_modules/babel/node_modules/babel-core/lib/api/register/node.js:216:7) >> > at Module.load (module.js:355:32) >> > at Function.Module._load (module.js:310:12) >> >> > ``` >> _______________________________________________ >> es-discuss mailing list >> [email protected] <mailto:[email protected]> >> https://mail.mozilla.org/listinfo/es-discuss >> <https://mail.mozilla.org/listinfo/es-discuss> >> >> > > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss
signature.asc
Description: Message signed with OpenPGP using GPGMail
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

