JS++ 0.8.1 fixes two major bug fixes that appeared when we introduced generics (0.8.0) and introduces some very useful new features. If you come from a C++ background, you might appreciate some of the new syntax :-).
‘auto’ Keyword
With the introduction of generic programming in 0.8.0, we need a more concise syntax to instantiate generic classes. The auto
keyword solves this problem.
Now, instead of the following:
VeryLongClassName<string> foo = new VeryLongClassName<string>();
You can instead instantiate classes using auto
:
auto foo = new VeryLongClassName<string>();
auto
can be used for more than just generic classes though:
class Foo {} auto foo = new Foo();
The auto
keyword can only be used for variable declarations, and it reduces the redundancy of having to specify the type on the left-hand side only to repeat yourself on the right-hand side. This is known as local-variable type inference (to use the Java 10 terminology). For fans of C++, you may recognize this syntax.
Catch-all Clauses
This is another syntax that comes from C++.
Sometimes, you’ll want to catch an exception, but you don’t care to do anything with the exception object. In other cases, you may want to catch a specific type of exception but ignore all other exceptions. The “catch-all” clause can help you:
import System; try { throw new System.Exception(); } catch(System.Exception e) { Console.log(e.getMessage()); } catch(...) { Console.log("The catch-all clause provides no exception object but will catch all exceptions - whether the type of the exception is internal or external."); }
import Externals.JS; try { throw new ReferenceError(); } catch(...) { Console.log("Do nothing"); }
System.Time.TimeUnits
JS++ has an emphasis on readability. Have you ever seen code that looks like this?
setInterval(function() { /* ... */ }, 3600000);
The System.Time module has been introduced for dealing with time. Specifically, we’ve introduced a TimeUnits module to directly deal with the above case:
import System.Time; external setInterval; setInterval(void() { /* ... */ }, TimeUnits.hours(1));
Or, more succinctly:
import System.Time.TimeUnits; external setInterval; setInterval(void() { /* ... */ }, hours(1));
As always, we’ve had a focus on readable code. Here’s a preview of how well this composes:
import System; import System.Time.TimeUnits; Console.log(hours(1) + minutes(5));
Externals.Time
In JavaScript, functions such as setTimeout
and setInterval
are not part of the ECMAScript standard; they are provided by the host environment. Web browsers and Node.js ship with these functions, but it would not have been correct to add this to the Externals.JS
module. Therefore, we’ve introduced the Externals.Time external module so you can more clearly work with timers.
Bug Fixes
- Fixed methods with variadic parameters passing by reference
- Fixed implementing of generic interfaces from generic classes
- MAJOR BUG FIX: Fixed double calls being generated for getters
- MAJOR BUG FIX: Fix
this
binding in code generation