Ceylon (programming language)
Ceylon is an object-oriented, strongly statically typed programming language with an emphasis on immutability, created by Red Hat. Ceylon programs run on the Java virtual machine, and can be compiled to JavaScript.
The language design focuses on source code readability, predictability, toolability, modularity, and metaprogrammability.
Important features of Ceylon include:
- A type system enforcing null safety and list element existence at compile time
- Regular syntax and semantics, avoiding special cases and primitively-defined constructs in favor of syntactic sugar
- Support for generic programming and metaprogramming, with reified generics
- Modularity built into the language, based on JBoss modules, interoperable with OSGi and Maven
- powerful tools, including an Eclipse-based IDE
In August 2017, Ceylon was donated to the Eclipse Foundation.
Language features
Ceylon is heavily influenced by Java's syntax, but adds many new features.Type system
One of the most novel aspects of Ceylon compared to Java is its type system. Ceylon foregoes Java's primitive types and boxing in favor of a type system composed entirely of first-class objects. While this may cause boxing overhead in some situations, it makes the type system more uniform.Ceylon allows for union and intersection types, in a similar fashion to TypeScript, Whiley and Flow.
Union types, written
A|B
, allow a variable to have more than one type. The following example shows a Ceylon function which may take either an integer or a string:shared void integerOrString
Intersection types, written
A&B
, are the theoretical foundation of flow-sensitive typing:shared void integerOrString
The condition
is Integer input
narrows the type of input
to <Integer|String> & Integer
,which distributes to
Integer&Integer | String&Integer
,which, as
String
and Integer
are disjoint types, is equivalent to Integer&Integer | Nothing
,which simplifies to just
Integer
.Null safety
Union and intersection types are used to provide null safety.The top type of the Ceylon type hierarchy is the class
Anything
,which has two subclasses:
Object
, the superclass of all normal classes and all interfaces, and Null
, with the only instance null
.Since
Object
and Null
are disjoint types, most regular types like Integer
or List<String>
are not nullable;a nullable type is the union
Integer|Null
, abbreviated Integer?
.Intersection types can be used to get a non-optional type out of a possibly-optional type, such as a type parameter. For example, the signature of a function that removes
null
elements from a stream of values could be:Iterable
When
removeNulls
is called with a stream of Integer|Null
elements, the result will be a stream of <Integer|Null> & Object
elements, which simplifies to Integer
.Functions
Similarly to many modern languages, Ceylon supports first class functions and higher order functions, including function types and anonymous functions// A top-level higher-order function using block syntax
String process
// A top-level function calling String.reverse in expression form.
String reverse => text.reversed;
// A function reference to String.reversed but mostly equivalent to the function above.
String reverseFunctionReference = String.reversed;
// An example where the top-level function above is provided as an argument to the higher-order function above
String reversed1 = process;
// Any example where an anonymous function - => text+text - is provided to the higher-order function above.
String reversed2 = process;
Enumerated types
Similar to Java and many other languages, and with a similar mechanism as algebraic types, Ceylon supports enumerated types, otherwise known as enums. This is implemented in Ceylon with a pattern of limiting the instances of an abstract class at declaration to a limited set of objects. Another way to implement this pattern is with the new constructor feature in Ceylon 1.2 where the objects are implemented as different named constructor declarations.// Traditional syntax for enumerated type, in this case, limiting the instances to three objects
abstract class Vehicle of plane | train | automobile
object plane extends Vehicle
object train extends Vehicle
object automobile extends Vehicle
// Compile error: type is not a subtype of any case of enumerated supertype: 'boat' inherits 'Vehicle'
//object boat extends Vehicle
// New constructor-based syntax
class Vehicle of plane | train | automobile
Type inference
Ceylon is strongly and statically typed, but also has support for type inference.The
value
keyword is used to infer the type of a variable,and the
function
keyword is used to infer the type of a function.The following two definition pairs are each equivalent:
Integer i = 3;
value i = 3;
Integer add
function add
However, to make single-pass type inference possible, type inference is only allowed for non-toplevel and unshared declarations.
Entry point with names
By default the starter runs the shared run function of a module:/* The classic Hello World program */
shared void run
but any other shared function without parameters can be used as main calling the program with the --run parameter, like this:
ceylon run --compile=force --run hello default
Versions
Versions of Ceylon released:- M1 0.1 "Newton"
- M2 0.2 "Minitel"
- M3 0.3 "V2000"
- M3.1 0.3.1 "V2000"
- M4 0.4 "Analytical Engine"
- M5 0.5 "Nesa Pong"
- M6 0.6 "Virtual Boy"
- 1.0 beta "Virtual Boy"
- 1.0.0 "No More Mr Nice Guy"
- 1.1.0 "Ultimate Ship The Second"
- 1.2.0 "A Series of Unlikely Explanations"
- 1.2.1 "Irregular Apocalypse"
- 1.2.2 "Charming But Irrational"
- 1.3.0 "Total Internal Reflection"
- 1.3.1 "Now We Try It My Way"
- 1.3.2 "Smile Tolerantly"
- 1.3.3 "Contents May Differ"
License