oters_lang 0.1.3

Language definitions and interpreter for the oters programming language
Documentation
use std::Stream
use std::Option

let head = fn (hd << tl) -> hd 
let tail = fn (hd << tl) -> tl 

let const = fn #val -> val << @(const val)
let const_box = fn val -> !#val << @(const_box val)

let map = fn f (x << xs) -> (!#f x) << @(map f !@xs)

let zip = fn (a << as) (b << bs) -> (a, b) << @(zip !@as !@bs)

let fold = fn f #acc (x << xs) -> {
  let acc' = !#f acc x;
  acc' << @(fold f acc' !@xs)
}

let unfold = fn f x -> x << @(unfold f (!#f x))

let filter = fn pred (x << xs) -> {
  let hd = if !#pred x then
      Option::Some(x)
    else 
      Option::None;
  hd << @(filter pred !@xs)
}

let shift = fn init (x << xs) -> init << @(shift x !@xs)

let integral_diffs = fn #acc (t << ts) (a << as) -> {
  let acc' = acc + t * a;
  acc' << @(integral_diffs acc' !@ts !@as)
}

let integral = fn #acc ts as -> {
  let ts' = fold #(fn prev_t curr_t -> curr_t - prev_t) 0 ts;
  integral_diffs acc ts' as 
}