top | item 924128

Wherein Javascript borrows a language feature from Arc

23 points| youngnh | 16 years ago |twoguysarguing.wordpress.com

20 comments

order

WilliamLP|16 years ago

> geolocator.getLatLng("Forest Park, St. Louis, MO", function(center) {

> displayMapAt(center, 14);

> });

To my eyes, that solution is just fine. I don't think I'll ever be swayed to believe that adding on layers of indirection to JavaScript code for the sake of "syntactic goodness" is rationally motivated by leading to more practical power for actually solving problems.

ynniv|16 years ago

Agreed. If you're writing something in a web browser, use sane JavaScript. Every time I have done something "fancy" with a language, there has been a large hidden cost later on, be that complicated debugging sessions, new hire training, or unintended side effects. Terrible syntax/rewriting hacks in Rails are probably what convinced me that I do not like ruby. If you truly care about programmer efficiency, you probably want to look into cross compilers like Objective-J or parenscript.

mikeryan|16 years ago

agree - imagine inheriting this code and then having to figure out what the underscore is doing. ugh.

Sometimes brevity isn't the right solution.

tlrobinson|16 years ago

You should probably assign an object to the underscore, otherwise any argument which is undefined will match:

    js> var _
    js> _ == undefined
    true
Just doing "var _ = {}" should be sufficient.

edit: however, this conflicts with Underscore.js (http://documentcloud.github.com/underscore/), but if you put an "if (typeof _ === "undefined")" around the assignment you should be ok

youngnh|16 years ago

I actually did a === check for just that reason, since if you define _ = {}, then passing in a real object that is {} will also return true for _ == {}

ubernostrum|16 years ago

It also conflicts with gettext libraries. The name '_' should be considered reserved for that purpose.

scott_s|16 years ago

Can someone explain why this:

  geolocator.getLatLng("Forest Park, St. Louis, MO", displayMapAt);
Is better than this?

  displayMapAt(geolocator.getLatLng("Forest Park, St. Louis, MO"));
That is, why is it more sensible for getLatLng to accept a callback function that will accept its result, when one can just pass its result to a function?

abecedarius|16 years ago

I expect the call to geolocator requires a network round-trip, with displayMapAt getting scheduled to be called when the result appears; meanwhile your code can do other things. (I'm not familiar with this API, though; I could be wrong.)

Another way to do this sort of thing, that might feel more composable: have geolocator.getLatLng() return a 'promise' object that will be asynchronously resolved.

mdemare|16 years ago

Clojure has #(+ % 10) for Arc's [+ _ 10]. Does anyone know if Arc inspired Clojure, or whether there's prior art for this syntax?

jimbokun|16 years ago

I think Clojure copied Arc on this.

Zak|16 years ago

Goo appears to have something similar in its op (partial evaluation) function.

tomjen2|16 years ago

At least the _ part is used in both Haskell and Prolog.