Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/rgrannell1/visp

Toy vau-calculus language with non-sexpr syntax
https://github.com/rgrannell1/visp

functional-programming lambda-calculus toy-language vau-calculus

Last synced: 7 days ago
JSON representation

Toy vau-calculus language with non-sexpr syntax

Awesome Lists containing this project

README

        

# visp

[![Build Status](https://travis-ci.org/rgrannell1/visp.svg?branch=master)](https://travis-ci.org/rgrannell1/visp)

> Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary

Visp is a toy-language built for a few purposes:

- I'd like to build a language from scratch
- I want to experiment with non-sexpr languages with metaprogramming support
- I want to implement `vau-calculus`
- I want to implement a language with lenses as the sole path management method
- If this works out, I'd like to switch to this language from Node.js

> Why on earth would you want a half-baked pseudoscheme with f-expressions, which are evil?

:woman_shrugging:

I'm unconvinced you need s-expression syntax to metaprogram, and I think macros are poor substitutions for f-expressions. I often want code to inspect other code when working with JS for documentation and versioning, which is easily done with vau-calculus. Being able to *really* define new syntax is a bonus too!

So far, I've implemented:

- a parser
- an evaluator
- a standard library (WiP)
- ~~node library wrappers~~

It looks like this.

```js

sym <- symbol("some js symbol")
val <- hash*(
("a" 1)
("b" 2)
(sym hash*(
("c" 3)
("d" 4))))

accessor <- at-key(sym)

test <- $fn((x y)
show("hello!")
$define!(z, 3)
sum*(x y z))

show(test(1 2))

show(lens-get(accessor val))
```

## Standard Library

```
sum
sum*
product
product*
plus
minus
times
over
```