lambda2js: Untyped Lambda calculus to JavaScript compiler

[ compiler, gpl, program ] [ Propose Tags ]

Simple though savage untyped Lambda calculus to JavaScript compiler. I hope you will have same fun playing with it as I had writing it.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1, 0.1.0.1
Dependencies base (>=4.5 && <4.8), parsec (>=3) [details]
License GPL-3.0-only
Author Matej Kollar <208115@mail.muni.cz>
Maintainer 208115@mail.muni.cz
Category Compiler
Home page https://github.com/xkollar/lambda2js
Source repo head: git clone https://github.com/xkollar/lambda2js.git
this: git clone https://github.com/xkollar/lambda2js.git(tag lambda2js-0.1.0.1)
Uploaded by MatejKollar at 2015-09-27T20:07:01Z
Distributions
Reverse Dependencies 1 direct, 0 indirect [details]
Executables lambda2js
Downloads 1722 total (7 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
All reported builds failed as of 2016-12-01 [all 5 reports]

Readme for lambda2js-0.1.0.1

[back to package description]

Welcome to lambda2js

Before you get any further: lambda2js is mainly a fun project. So if you are not in the mood simply leave as it is not for you.

If you need something serious, try PureScript, Haste, elm, or Fay.

As you can guess just by looking at the name, lambda2js is compiler that takes simple syntactically sugared untyped lambda calculus and produces JavaScript code. Though this project is meant as fun, it actually works.

Lambda2js is open source (licensed under GPL-3) and patches are welcome.

Motivation

Have you ever found yourselves writing JavaScript code and thinking: "Oh my... How nice would it be to have this function with flipped arguments. And now I have to write wrapper function, or at least some anonymous function that will do what I need. In functional language I would simply use flip and that would be it!" Well, now it is your time as lambda2js was brought to light.

Example

In examples you can find simple example, that will get compiled into

K = function(x){return function(y){return x}}
S = function(f){return function(g){return function(x){return f(x)(g(x))}}}
I = S(K)(K)
Dot = function(f){return function(g){return function(x){return f(g(x))}}}
Flip = function(f){return function(x){return function(y){return f(y)(x)}}}
True = K
Not = Flip
False = Not(True)
If = I
Zero = function(s){return function(z){return z}}
Succ = function(n){return function(s){return function(z){return n(s)(s(z))}}}
IsZero = function(n){return n(K(False))(True)}
Add = function(m){return function(n){return function(s){return function(z){return m(s)(n(s)(z))}}}}
Mul = function(m){return function(n){return function(s){return function(z){return m(n(s))(z)}}}}
Pow = function(m){return function(n){return function(s){return function(z){return n(m)(s)(z)}}}}
One = Succ(Zero)
Two = Succ(One)
Three = Succ(Two)
Tup = function(x){return function(y){return function(p){return p(x)(y)}}}
Fst = function(t){return t(K)}
Snd = function(t){return t(Flip(K))}
Fac = function(n){return Snd(n(function(t){return t(function(x){return function(y){return Tup(Succ(x))(Mul(x)(y))}})})(Tup(One)(One)))}

which is fully functional (pun intended) JavaScript. It can be played with: combined with small helper library for seamless integration, one can compute (2+3)!.

alert(funToInt(Fac(Add(Two)(Three))))

Flipping arguments can be as simple as

alert(uncurry2(Flip(curry2(Math.pow)))(2,3))

...and much more.

Origin

I was playing with JavaScript the other day, pondering higher functions. Trying the usual stuff like Church numerals and other. I found myself under avalanche of JavaScript boilerplate. Just compare function(x){return x} and \ x . x.

And then it occurred to me: this can be easily automated! I can write code I like and get code I need. So I sat down to my console and in just couple of moments I came up with 10 commandm^W^Wthis little project. Enjoy.