Untyped lambda calculus to Grass compiler
npm install @susisu/grasspilerGrass is an esoteric language based on the untyped lambda calculus, and its program is written by using only three characters: w, W, and v.
shell
npm i -g @susisu/grasspiler
`Usage
` shell
grasspile -o
`
For more information about the CLI, see grasspile -h.$3
The source language is (of course) based on the untyped lambda calculus, and has a simple ML-like syntax.The syntax is defined as below (though this is very informal and incomplete):
`
::= +
::= let + =
::= variable
application
λ+. lambda abstraction
let + = in local binding
`A lambda abstraction can be written in several kinds of notation, and also mixture of them.
` ml
( lambda calculus-like )
let S = λx y z. x z (y z)
( ML-like )
let S = fun x y z -> x z (y z)
( Haskell-like )
let S = \x y z -> x z (y z)
( mixture of something )
let S = fun x y z => x z (y z)
( Of course you can also write it like this )
let S x y z = x z (y z)
`The primitives
Out, Succ, w and In are exposed to the environment,
and the value defined at the end of the source program is called by the Grass VM with itself as an argument.$3
Here is a simple program, which takes a character as input, and output it repeatedly.
` ml
( fixed-point operator )
let fix = fun f ->
(fun x -> f (fun y -> x x y))
(fun x -> f (fun y -> x x y))( infinite loop )
let loop = fix (fun loop c ->
let _ = Out c in
loop c
)
let main _ = loop (In w)
`Save this source program as
resonance.ml (it is not an ML program, though) and compile it with grasspile.` shell
$ grasspile resonance.ml -o resonance.w
$ cat resonance.w
wwWWwwWwwvwwWWWwWWWwvwWWwWWWwwWwwvwwWWWWWWwWWWwwvWWwvwWWWWWWWWWWwwwwwwwwwWWWw
`Then you can run the compiled program with a Grass compiler/interpreter (for instance, Grass-JS).
` shell
$ grass resonance.w
A
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
``Stop it if you are satisfied.