News for hackers. Stuff that matters.
Re:JavaScript right on the hardware by Tichy on Wednesday August 14, 2013 @07:11PM (#6215056)
It's extremely simple - basically everything is a hash. It has full lambda, not just crippled lambda like Python. It's very fast (I think it is the fastest scripting language except for Lua, and getting faster because of the browser wars).

It usually doesn't require a lot of boilerplate code.

What is not to like?

The one thing I worry about is the limited range of integers.

Re:JavaScript right on the hardware by anonymoushn on Wednesday August 14, 2013 @08:26PM (#6215406)
Non-string values are not valid hash keys. Operations that should be type errors fail silently and return nonsense. The prototype system is less powerful than the OO system of basically every other scripting language. The language will never have continuations, so people who want real control flow are stuck using preprocessors to generate callback spaghetti. Encoding a particularly rigid mix of dynamic and lexical scope into the language specification, such that everyone must be exposed to dynamic scoping much of the time, is one of the worst ideas I can imagine.
Re:JavaScript right on the hardware by jeswin on Wednesday August 14, 2013 @09:00PM (#6215531)
Non-string values are not valid hash keys. - ES6 Maps

The prototype system is less powerful .. - No. Just different.

The language will never have continuations.. - Generators help here. We use them with node --harmony

Scoping. - Fat arrows and block scoping coming in ES6.

These features can be used today in node, by enabling the harmony flag. Otherwise wait until next year.

Re:JavaScript right on the hardware by anonymoushn on Thursday August 15, 2013 @02:07AM (#6216396)
> Non-string values are not valid hash keys. - ES6 Maps

Yes, this is a good thing :)

> The prototype system is less powerful .. - No. Just different

Javascript let you use prototypes to cause map lookups for absent keys to fall back to a different map. Lua lets you use prototypes to override every operator, make the object callable, override map lookups for absent keys, and override assignment of new keys. All of these operations can be made to call into arbitrary functions the user provides. Python, an OO scripting language, provides all of the same features.

It seems to me that among these three languages there is a greater difference between the more powerful systems and the less powerful system than between the prototypal systems and the OO system.

> The language will never have continuations.. - Generators help here. We use them with node --harmony

Python also has generators, but you still need greenlet or stackless if you want to use coroutines. The inability to suspend from a subroutine is a deal breaker. Generators are probably nice for writing generators. For writing control flow, Continuation.js seems like a better choice.

> Scoping. - Fat arrows and block scoping coming in ES6.

=> lets you use a lexically scoped this, which is likely a dynamically scoped this from an enclosing lexical scope. This sounds useful, but it doesn't really make things less messy.

Re:JavaScript right on the hardware by Tichy on Thursday August 15, 2013 @06:59AM (#6217088)
Sure if you prefer static typing then JS is not for you.

Continuations seem to be rare among other languages you could choose. Personally I have only seem them in LISP, what else is out there?

I would love to use LISP, but the libraries simply aren't there. Last time I tried Racket, there wasn't even a library for JSON.

Re:JavaScript right on the hardware by anonymoushn on Thursday August 15, 2013 @09:13AM (#6217535)
> Sure if you prefer static typing then JS is not for you.

I did not say anything about static typing. Most dynamic languages are not forced by their specs to coerce disparate types into utter garbage. I invite you to type the examples in the Wat talk into a REPL for any other dynamic language and see how many of them produce exceptions.

> Continuations seem to be rare among other languages you could choose. Personally I have only seem them in LISP, what else is out there?

Before answering, I will point out that coroutines are equivalent to one-shot continuations, and coroutines that can be copied are equivalent to multi-shot continuations. Then, I am familiar with continuation implementations in the following languages: Python [1][2], Scala with any JVM runtime[3], Any JVM language with a particular runtime[4], C[5], Lua[6], Julia[7], and C++[8]. Of these, the ones for the JVM, C/C++, and Lua[9] are multi-shot continuations or equivalent to them, while Julia and Python are a bit more limited. I am not familiar with many languages, so I'm sure I've missed a lot of instances of this sort of feature.

> I would love to use LISP, but the libraries simply aren't there. Last time I tried Racket, there wasn't even a library for JSON.

I can't really speak to this because I haven't spent time trying to build real software using lisp.

[1] https://pypi.python.org/pypi/greenlet

[2] http://www.stackless.com/

[3] http://jim-mcbeath.blogspot.com/2010/08/delimited-continuati...

[4] http://oss.readytalk.com/avian/javadoc/avian/Continuations.h...

[5] http://en.wikipedia.org/wiki/Setcontext

[6] http://lua-users.org/wiki/CoroutinesTutorial

[7] http://docs.julialang.org/en/latest/manual/control-flow/

[8] http://www.boost.org/doc/libs/1_51_0/libs/context/doc/html/c...

[9] http://lua-users.org/lists/lua-l/2006-01/msg00652.html

Re:JavaScript right on the hardware by takikawa on Saturday August 17, 2013 @12:39AM (#6228174)
> Last time I tried Racket, there wasn't even a library for JSON.

That's changed since then: http://docs.racket-lang.org/json/index.html

Re:JavaScript right on the hardware by dkuntz2 on Wednesday August 14, 2013 @07:19PM (#6215109)
I personally don't like that everything's a hash. It's nifty, and it means you don't really need objects, but I kinda like objects, even if I don't use them frequently in Python.

Your preference makes sense, it's just not the same one I have. More on topic for this thread, I'm still not convinced that it's a good thing for an embedded system.

Re:JavaScript right on the hardware by Tichy on Wednesday August 14, 2013 @07:27PM (#6215147)
You can use objects in JS if you want to - but fair enough, different tastes and preferences.
Re:JavaScript right on the hardware by dkuntz2 on Wednesday August 14, 2013 @07:35PM (#6215194)
I didn't say you couldn't, I just skimmed over them. The prototype stuff is funky to me, I'd rather just have a straightforward syntax with objects.
Re:JavaScript right on the hardware by DonPellegrino on Wednesday August 14, 2013 @10:33PM (#6215852)
It takes less than an hour to learn and get used to it if you know the standard Java-style OOP already. It's worth it and it'll give you a whole new opinion on what OOP means.

I made this a while ago, see if you can figure out how it works: http://jsfiddle.net/AXTdj/

Re:JavaScript right on the hardware by dkuntz2 on Wednesday August 14, 2013 @11:28PM (#6215996)
I know how it works, I just find it worse, by far. There's a whole lot more overhead to getting it working, specifically all of the foo.prototype stuff, and it doesn't require that everything be together.

Sure, it's kinda nice that you're able to extends objects later on, but I'd rather have everything neatly declared in one place.

It definitely does not "give me a whole new opinion on what OOP means", it furthers my opinion that I'm not a fan of JavaScript.

Re:JavaScript right on the hardware by PommeDeTerre on Thursday August 15, 2013 @08:00AM (#6217267)
It's very good to see more and more people openly admitting that JavaScript's prototype-based OO approach just isn't practical.

For far too long now we've had to hear JavaScript advocates go on and on about how good JavaScript's approach is. Yet over and over we see developers being forced to fake a limited subset of class-based OO one way or another, just to get their work done effectively.

Of course, there are multiple ways of faking class-based OO in JavaScript, with varying degrees of compatibility with one another. In any sizable JavaScript code base, especially if third-party libraries are used, these incompatibilities can become a very real issue, very quickly.

This is one of the things that the JavaScript community should have addressed years ago.

Re:JavaScript right on the hardware by nilliams on Thursday August 15, 2013 @09:45AM (#6217686)
>> In any sizable JavaScript code base, especially if third-party libraries are used, these incompatibilities can become a very real issue, very quickly.

Whether you use constructor functions, object literals, or the module pattern to structure your code in an OO-like manner, they all result in 'functions hung off objects' which can be called in the same way: object.foo(), I don't see the very real compatibility issue you're talking about.

>> It's very good to see more and more people openly admitting that JavaScript's prototype-based OO approach just isn't practical.

It's plenty practical, I will welcome ES6's class keyword for the clearer semantics, but this is simply vague FUD.

Re:JavaScript right on the hardware by esailija on Thursday August 15, 2013 @08:57AM (#6217468)
Your entire complaint is very superficial and easy to fix with any convention you like. For example: http://jsfiddle.net/AXTdj/3/ I included "overhead" calculations.
Re:JavaScript right on the hardware by Tichy on Thursday August 15, 2013 @04:06AM (#6216655)
You know that you can just do

foo.prototype = { dothis: function(){}, dothat: function(){}

}

In the beginning I wrote it more like

foo.prototype.dothat = function(){} foo.prototype.dothis = function(){}

Which was a lot more ugly.