Dragons in the Algorithm
Adventures in Programming
by Michael Chermside

Beginning Ceylon

Cylon

So, this is the second time that I have taken a look at the programming language Ceylon. Ceylon is a language which is currently being sponsored by Red Hat. It fits into the space of languages in the same family with Java, but attempting to build a mondern strongly-typed language within that family; Scala is the best-known language that falls into the same category. Of course, Scala has a 10 year head-start on Ceylon, but so far I am really QUITE impressed with Ceylon as a language.

The first time I looked at Ceylon, I simply read through their excellent tutorial (which I strongly recommend) and I came away with the impression that the language was really VERY well-designed. The second time I came back to it and had exactly the same impression. So I decided to play around and try it out some. The program below is my first attempt at building anything (even a toy) in Ceylon. Because there seemed to be very little available in the way of sample Ceylon code posted online, I thought I would post it here.

File: source/com/mcherm/example/module.ceylon

native("jvm")
module com.mcherm.example "1.0.0" {
	import java.base "8";
	import ceylon.net "1.2.1";
	import ceylon.regex "1.2.1";
}

File: source/com/mcherm/example/package.ceylon

shared package com.mcherm.example;

File: source/com/mcherm/example/run.ceylon

import ceylon.net.uri {parseURI = parse}
import ceylon.regex {regex, MatchResult}



String? loadContentFromCeylonDownloadsWebsite() {
	value uri = parseURI("http://ceylon-lang.org/download-archive/");
	value response = uri.get().execute();
	if (response.status == 200) {
		return response.contents;
	} else {
		return null;
	}
}


/*
 * A good HTML parser would be the BEST way to handle this,
 * but for this example we'll just use a regex to find what
 * we need. That works, but it is a bit fragile if the page
 * ever changes.
 */
String? getFirstVersionFromCeylonDownloadsPage(String pageHtml) {
	value h3TagRegex = regex("<h3 id=\"(.+)\">");
	MatchResult? match = h3TagRegex.find(pageHtml);
	if (!exists match) {
		return null;
	}
	return match.groups.first;
}



"This is the main method that runs the whole program."
shared void main() {
    String? pageHtml = loadContentFromCeylonDownloadsWebsite();
    if (!exists pageHtml) {
        print("Could not access website.");
        return;
    } else {
        String? version = getFirstVersionFromCeylonDownloadsPage(pageHtml);
        if (!exists version) {
            print("Could not get the version from the page.");
        } else {
            print("The latest released version of Ceylon is ``version``.");
        }
    }
}

Posted Sat 27 February 2016 by mcherm in Programming