Generalizing JSX: Delivering on the Dream of Curried Named Parameters
tolmasky.com
tolmasky.com
1. Unifying default parameters with curried named parameters: https://tonicdev.com/tolmasky/default-parameters-with-generi...
2. Using generic JSX to declaratively specify JavaScript ASTs: https://tonicdev.com/tolmasky/generic-jsx-for-babel-javascri...
I think my only criticism of the current approach in the linked GitHub repo [1] is the use of `eval`, as that could make it tough to utilize in low security/sandboxed environments such as mobile apps and CSP-controlled sites.
I'll save attempting an actual code exercise for later, but my first thought was maybe using JS implicit `this` to your advantage (even while trying to stray away from classes) and using `this[functionName]` to index into it. (You'd still have security concerns with `this` defaulting to `window` or `global`, but you'd avoid the need for `eval` and you can take advantage of the depth of abilities of constructor functions and ES2015 class syntax.)
<memoize(f) key = "value"/>
<compose(f,g) key = "value" />
If you look at the implementation in the repo, you'll see its actually a little more complex than just eval now (since JSX will pass the actual reference when the tag name starts with a capital letter), but again this was solely to provide something that people could use with their existing Babel implementations and a simple require. /* @jsx ((a,b)=>(eval(a)(b))) */
You would have /* @jsx ((a,b)=>(MyJSX[a](b))) */
And then just build your functions on top of the MyJSX object?I proposed the idea of using JSX as angular2 templates. They didn't like it and I think the React competition was an important factor for that.
Whenever I run a code example, I get 5 403 errors one after the other trying to make PUT requests to http://tonicdev.com/new
Sample request:
{"model":{"content":{"package":{"engines":{"node":"4.x.x"},"lastEvaluatedDependencies":{},"dependencies":{}},"title":"","cells":[{"_id":"cells/3f4e1137-79ee-4dbd-b201-ba404a056e0f","content":{"type":"source","text":"/* @jsx console.log */\n\n// Now this is the same as console.log(\"div\", { \"id\":\"my-element\"}, \"hi\");\n<div id = \"my-element\" >hi</div>"}},{"_id":"cells/fd8deede-cfeb-48df-ac0f-740397f61e47","content":{"type":"rich-text","text":"Created from: http://tolmasky.com/2016/03/24/generalizing-jsx/","tag":"p"}...},"evaluationCount":0},"fromNotebook":null,"fromLocation":"http://tolmasky.com/2016/03/24/generalizing-jsx/","embed":tr...}
And response:
{ "message": "CSRF token failure", "csrf": "4fa7f4dc-c906-4561-92dd-2489cc53c7f7" }
Safari on OSX, Chrome doesn't have the problem.
transform("<Foo id = 'my-element'>hi!</Foo>")
outputs Foo({id: "my-element"}, ["hi!"])I code in react without jsx and webpack. I recommend hyperx for your code. Hopefully new modules can be built out of this one.
E.g. `sumList = reduce(sum)`
It has a variety of drawbacks though, like being harder to inspect at runtime, and arguably harder to read.
http://hyegar.com/2016/03/22/simple-timeouts/
In it the timeout function only takes one arg for its timeout wrapped function, so how do we use functions with more than 1 arg? Via currying
api = new Api('http://my.cool.api')
api.get('/it')
api.post('/it')
// connect = rootUrl => method => endpoint
api = connect('http://my.cool.api')
get = api('GET')
post = api('POST')
get('/it')
post('/it')
Uncurried: \xs -> map (\x -> f (fst x)) xs
Now comparing this to js would just be unfair (edit: ES6 lambdas are probably ok).
> Any sufficiently complicated [Javascript] program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.
I like the idea of using the "from" function to rename applied parameters. But that and everything else would be equally possible and a lot less confusing if it didn't involve JSX, no?
The main thing here was that through thinking about JSX, I was able to reach these conclusions. If I had not had to work with this separate syntax, I may not have tried separating function application from function binding. It's kind of like how when you give something a word you can think about it clearer.
For example, one of the issues thats frustrated me in the past is wanting to fully-curry a function but still have it be callable. For example, if you have id = x => x, if you could curry it it would simply become an "always" function. So like, [...].map(<id x = {5}>) (this maps everything to 5 in our case). But with traditional currying, that would simply return 5. Again, you could achieve this curry(id, {x:5}), but I like the visual queue that JSX syntax gives you saying "This is a new FUNCTION with these parameters".