loop is a little language for the jvm. it takes advanced functional features and makes them easy and fun to use!
see for yourself
hello world →
-
print('hi')
-
greet(name) -> print("hi, @{name}!")
-
[1, 3, 3, 4] # a list {3, 3, 4, 4} # a set => {3, 4}
-
# a hashmap { 'name' : 'Harry Potter', 'nemesis' : 'Voldemort' } # a tree => { 'l','o','o','p' } [ 'o' : 2, 'p' : 4 , 'l' : 1 , 'o' : 3 ].keySet()
-
# a map, with symbols { @name : 'Harry Potter', @nemesis : 'Voldemort' } # a set, similarly => false { @sprinkles, @syrup, @cherry }.contains(@fudge)
-
# transform list => [ 'STEVE', 'WOZ', 'RANDY' ] i.toUpperCase() for i in ['steve', 'woz', 'randy'] # filter list => [ 'ipod', 'ipad', 'iphone' ] ('i' + p) for p in ['mac', 'pod', 'pad', 'phone'] if p.startsWith('p')
-
# local variables, private to function minutes(num) -> "@{num * year} minutes in @{num} years" where hour: 60 day : 24 * hour week: 7 * day year: 52 * week
-
# reverses a list => [3, 14, 15, 268] reverse(ls) => [] : [] [x:xs] : reverse(xs) + [x] reverse([268, 15, 14, 3])
-
# pattern matching + guards => 'qi' show(host) => ('Stephen ' : sur) | sur == 'Fry' : @qi | sur == 'Colbert' : @report | else : @boo show('Stephen Fry')
-
# exceptions handled with pattern matching cleanup(file) except handler -> file.open().truncate() handler(e) => FileNotFoundException : "no harm, no file" IOException : "failed: @{e.message}"
-
# sorts a list => [3, 14, 15, 268] quicksort(ls) => [] : [] [x:xs] : (quicksort(i for i in xs if i > x) + [x] + quicksort(i for i in xs if i < x)) quicksort([15, 268, 3, 14])
-
# creates instance of Star with default age class Star -> name mass age : '4 billion years' new Star(name: 'Proxima Centauri' mass: 0.123)
-
# instance method => 'mostly' 'They mostly come at night, mostly'.substring(28) # static method => 133434532556 `java.lang.System`.currentTimeMillis() # constructor => Sun 15 Apr 2012 14:22:50 UTC new java.util.Date() # property => 1 (getTime) new java.util.Date(1).time
here I am "adding" a method to a simple java string
greet(name) -> "hi, @{name}!" 'Zaphod Beeblebrox'.~greet()~
loop produces clear, useful stack traces when things go wrong
java.lang.RuntimeException: i'm complaining at prelude.raise(prelude.loop:9) at myapp.func3(my_app.loop:3) at myapp.func2(my_app.loop:6) at myapp.func1(my_app.loop:9) at myapp.main(my_app.loop:13)
other fun stuff
- closures
- null-safety
- java interoperability
- built-in concurrency
- pattern matching + guards