Jump to content
 







Main menu
   


Navigation  



Main page
Contents
Current events
Random article
About Wikipedia
Contact us
Donate
 




Contribute  



Help
Learn to edit
Community portal
Recent changes
Upload file
 








Search  

































Create account

Log in
 









Create account
 Log in
 




Pages for logged out editors learn more  



Contributions
Talk
 



















Contents

   



(Top)
 


1 Language features  



1.1  Type system  



1.1.1  Null safety  





1.1.2  Functions  





1.1.3  Enumerated types  





1.1.4  Type inference  







1.2  Entry point with names  







2 Versions  





3 License  





4 See also  





5 References  





6 External links  














Ceylon (programming language)






Català
Čeština
Deutsch
Español
فارسی
Français
Italiano
עברית

Polski
Ripoarisch
Русский
Slovenčina
ி

Türkçe
Українська
 

Edit links
 









Article
Talk
 

















Read
Edit
View history
 








Tools
   


Actions  



Read
Edit
View history
 




General  



What links here
Related changes
Upload file
Special pages
Permanent link
Page information
Cite this page
Get shortened URL
Download QR code
Wikidata item
 




Print/export  



Download as PDF
Printable version
 
















Appearance
   

 






From Wikipedia, the free encyclopedia
 


Ceylon
ParadigmObject-oriented
Designed byGavin King
DeveloperEclipse Foundation
First appeared2011; 13 years ago (2011)
Stable release

1.3.3 / August 21, 2017; 6 years ago (2017-08-21)

Typing disciplineStatic, strong, safe
PlatformJava virtual machine, JavaScript
LicenseApache License 2.0
Filename extensions.ceylon[1]
Websiteceylon-lang.org
Influenced by
Java,[2] Scala, Smalltalk, ML,[3] Lisp,[4] Whiley[5]

Ceylon was 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 (JVM), and could be compiled to JavaScript.[6][7] The language design focuses on source code readability, predictability, toolability, modularity, and metaprogrammability.[8]

Important features of Ceylon include:[9]

The name "Ceylon" is an oblique reference to Java, in that Java and Sri Lanka, formerly known as Ceylon, are islands known for growth and export of coffee and tea.

In August 2017, Ceylon was donated to the Eclipse Foundation. Development slowed down and finally stopped in 2020.[13] In April 2023, Eclipse Foundation declared the termination of the transition.[14]

Language features[edit]

Ceylon is heavily influenced by Java's syntax, but adds many new features.

Type system[edit]

One of the most novel aspects of Ceylon compared to Java is its type system. Ceylon foregoes Java's primitive types[15] 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, which in fact, took the idea from Ceylon.

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(Integer|String input) {
    if (is Integer input) {
        print("Got the integer ``input``");
    } else {
        print("Got the string '``input``'");
    }
}

Intersection types, written A&B, are the theoretical foundation of flow-sensitive typing:

shared void integerOrString(Integer|String input) {
    Integer added = input + 6; // illegal; the + operator is not defined on Integer|String

    if (is Integer input) {
        Integer added = input + 6; // legal; input is now known to be an Integer
        print("Got the integer ``input``");
    } else {
        print("Got the string '``input``'");
    }
}

The condition is Integer input narrows the type of inputto<Integer|String> & Integer, which distributestoInteger&Integer | String&Integer, which, as String and Integer are disjoint types, is equivalent to Integer&Integer | Nothing (Nothing is the empty bottom type), which simplifies to just Integer.

Null safety[edit]

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 IntegerorList<String> are not nullable; a nullable type is the union Integer|Null, abbreviated Integer?.[16]

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<Element&Object> removeNulls<Element>(Iterable<Element> stream);

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[edit]

Similarly to many modern languages, Ceylon supports first class functions and higher order functions, including function types and anonymous functions[17]

// A top-level higher-order function using block syntax (not associated with any user-created classes)
String process(String text, String transformString(String toChange)) {
    return transformString(text);
}

// A top-level function calling String.reverse in expression form.
String reverse(String text) => text.reversed;

// A function reference to String.reversed but mostly equivalent to the function above.
String(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("one", reverse);

// An example where an anonymous function - (text) => text+text - is provided to the higher-order function above. 
String reversed2 = process("one", (text) => text+text);

Enumerated types[edit]

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 (in this case, singleton instances). 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.[18]

// Traditional syntax for enumerated type, in this case, limiting the instances to three objects(for this purpose: Singletons)
abstract class Vehicle(shared String name) of plane | train | automobile {}

object plane extends Vehicle("plane") {}
object train extends Vehicle("train") {}
object automobile extends Vehicle("automobile") {}
// Compile error: type is not a subtype of any case of enumerated supertype: 'boat' inherits 'Vehicle'
//object boat extends Vehicle("boat") {}

// New (as of Ceylon 1.2.0) constructor-based syntax
class Vehicle of plane | train | automobile {
    String name;

    abstract new named(String pName) {
        name = pName;
    }

    shared new plane extends named("plane") {}
    shared new train extends named("train") {}
    shared new automobile extends named("automobile") {}
    // Compile error: value constructor does not occur in of clause of non-abstract enumerated class: 'boat' is not listed in the of clause of 'Vehicle'
    //shared new boat extends named("boat") {}
}

Type inference[edit]

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(Integer i1, Integer i2) {
    return i1 + i2;
}
function add(Integer i1, Integer i2) {
    return i1 + i2;
}

However, to make single-pass type inference possible, type inference is only allowed for non-toplevel and unshared declarations.[19]

Entry point with names[edit]

By default the starter (ceylon run) runs the shared run() function of a module:

/* The classic Hello World program */
shared void run() {
    print("Hello, World!");
}

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[edit]

Versions of Ceylon released:[20]

License[edit]

All parts of Ceylon are available as free software, mostly the Apache License.[21] Part of the source code is licensed under LGPL.

See also[edit]

References[edit]

  1. ^ King, Gavin. "The Ceylon Language: §4.1 Compilation unit structure". Retrieved 2015-12-04. Acompilation unit is a text file, with the filename extension .ceylon.
  • ^ "Frequently Asked Questions: What is Ceylon?". Retrieved 2015-12-04. Ceylon is a new programming language that's deeply influenced by Java
  • ^ "ceylon/user - Gitter". Retrieved 2015-12-04.
  • ^ "ceylon/user - Gitter". Retrieved 2015-12-04.
  • ^ "Top 10 Ceylon language features Java wishes it had". Retrieved 2019-11-29.
  • ^ "Ceylon 1.0 beta". Retrieved 2013-09-26.
  • ^ "Project Ceylon – Red Hat builds Java replacement". The Register. 2011-04-13. Retrieved 2011-11-27.
  • ^ King, Gavin (2012-01-10). "Principles that guide this project". Retrieved 2015-12-04.
  • ^ "FAQ about language design: Goals". Retrieved 2015-12-04.
  • ^ Festal, David (2014-10-10). "Write in Ceylon, deploy as OSGI, use in Java EE". Retrieved 2015-12-04.
  • ^ "Maven repositories". Retrieved 2015-12-04.
  • ^ "Features of Ceylon IDE". Retrieved 2015-12-04.
  • ^ "ceylon / ceylon". GitHub, Inc. 2020-05-25. Archived from the original on 2023-10-03. Retrieved 2024-01-22.
  • ^ "Eclipse Ceylon™ Termination Review". Eclipse Foundation. 2023-04-05. Archived from the original on 2023-04-23. Retrieved 2023-04-23.
  • ^ King, Gavin. "Ceylon: Language Design FAQ".
  • ^ King, Gavin. "The Ceylon Language: §1.4.3 Compile-time safety for null values and flow-sensitive typing". Retrieved 2015-12-04.
  • ^ King, Gavin. "The Ceylon Language: 4.7 Functions". Retrieved 5 December 2015.
  • ^ King, Gavin. "The Ceylon Language: 4.5.8 Enumerated classes". Retrieved 6 December 2015.
  • ^ King, Gavin. "The Ceylon Language: §3.2.9 Type inference". Retrieved 2015-12-04.
  • ^ https://ceylon-lang.org/download-archive/ Ceylon: Download Previous Ceylon versions
  • ^ "Ceylon: Licenses". Retrieved 2015-12-04.
  • External links[edit]


    Retrieved from "https://en.wikipedia.org/w/index.php?title=Ceylon_(programming_language)&oldid=1227918048"

    Categories: 
    Java programming language family
    JVM programming languages
    Programming languages created in 2011
    Red Hat software
    Software using the Apache license
    2011 software
    High-level programming languages
    Source-to-source compilers
    Hidden categories: 
    Articles with short description
    Short description is different from Wikidata
    Articles lacking reliable references from January 2017
    All articles lacking reliable references
     



    This page was last edited on 8 June 2024, at 13:55 (UTC).

    Text is available under the Creative Commons Attribution-ShareAlike License 4.0; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.



    Privacy policy

    About Wikipedia

    Disclaimers

    Contact Wikipedia

    Code of Conduct

    Developers

    Statistics

    Cookie statement

    Mobile view



    Wikimedia Foundation
    Powered by MediaWiki