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
Maybe
andshow
- 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")