$ npm install cleanlang -g
$ clean hello.cl
Will compile and run hello.cl
$ clean --help
For more options
include node-core
main = putLine 'Hello World!'
Define function main
. It is called at the start of your program. putLine
is an asynchronous
function.
include node-core
factorial 1 = 1
factorial n = n * factorial (n - 1)
main = putLine (factorial 5)
You can use pattern matching (factorial 1 = 1)
in function definitions in clean
.
include node-core
express = require 'express'
app = express ()
do
req res <- IO (app.get '/')
res.send 'Hello World'
app.listen 3000
Use IO
to create your own Evented IO function. The argument to IO
is the IO
call you want to make minus the callback. (Notice that we don't provide a callback to app.get
).
There is no main
in our program above. main
is not mandatory. Since most of the IO you do is evented,
the events will get activated in the do
Here is a command line program that gets a user input number. The factorial of the number is calculated, and ascii art from an API, for the factorial is printed.
include node-core
request = require 'request'
fact 1 = 1
fact n = n * fact (n - 1)
computeFact = do
num <- getLine 'enter value for factorial: '
let val = fact (parseInt num)
putLine val
return (String val)
do
data <- computeFact
let link = 'http://artii.herokuapp.com/make?text=' ++ data
err res body <- IO (request link)
maybeErr err (putLine err)
putLine body
We define computeFact
to be an IO function that takes the user input and returns the
computed factorial as a string. Note the return statement. This is not the regular return
statement in JavaScript or similar languages. This return lifts
the string into an IO type.
All do blocks evaluate to Evented IO Types internally. We need the return
for this do block
because computeFact
will be used in the next do
block.
In the next do
block we bind computeFact
to a variable called data
. You can use let
statements in a do
block to create scoped variables. ++
is used for string concatenation.
Then we create an evented IO that uses request
. The created IO function is bound to err
,
res
and body
. maybeErr
will terminate the do if err
is an instance of JavaScript Error, and calls
putLine err
.
For the complete syntax, head over to the wiki