Gluon is a small, statically-typed, functional programming language designed for application embedding into Rust code.
Gluon lang is a native Rust implementation and does not require any FFI interfacing to foreign C libraries, such as for guile.
Gluon lang provides a feature called “implicit arguments” that can be used to realize parametric polymorphism.
Just Gluon lang is a a bit picky regarding recursion and implicit arguments, for example using the Functor Show from module std.show.
The following document is helpful to understand the feature http://marwes.github.io/2018/06/19/gluon-0.8.html
The following is a short example demonstrating its usage.
Let’s have two file,
- the module maybe.glu exporting both symbols
Maybeandshow - and the application app.glu
// file: maybe.glu
let show @ { ? } = import! std.show
let { (<>) } = import! std.semigroup
// A `Maybe` represents a parameterized type for an optional value
type Maybe a =
| Just a
| Nothing
// Stringifying the `Maybe` value
let show ?d : [Show a] -> Show (Maybe a) =
let show o =
match o with
| Just x -> "Just (" <> d.show x <> ")"
| Nothing -> "Nothing"
{ show }
in
{ Maybe, show }
Now, the application app.glu imports both symbols, using the following expression
let maybe @ { Maybe , ? } = import! maybe
Here, the placeholder ? is important to import in the function shows as scoped symbol maybe.show to avoid ambiguity with symbol show.show.
// file: app.glu
let prelude = import! std.prelude
let { Show, show } = import! std.show
let io @ { ? } = import! std.io
let string @ { ? } = import! std.string
let maybe @ { Maybe , ? } = import! maybe
let val : maybe.Maybe String = Just "foo"
in
io.println (show val)
Execution in console will be as follows
$ gluon app.glu
Just ("foo")