Skip to content

Pyrope Standard Library

This is a list of functionality that import prp should produce.

Basic operations

All the LNAST node have an associated function matching name to simplify the creation of operations: plus, minus, mult, div, mod, ror...

const prp = import("prp")
cassert(prp.plus(1,2,3) == 6)

Library code:

comb plus(...a:int) -> (r:int) {
  r = 0
  for e in a {
    r += e
  }
}

Array/Tuple operators

Size of length

Sample use:

const x = (1,2,23)

cassert(prp.len(x) == 3)

Library code:

comb len(x) -> (r) { r = x.[size] }

map

Sample use:

const x = (1,2,3)

cassert(x.map(_ + 1) == (2,3,4))

Library code:

comb map<T>(f, ...x:[]T) -> (r:[]) {
  r = ?
  for e in x {
    r ++= f(e)
  }
}

filter

Sample use:

cassert (1,2,3).filter(_ != 2) == (1,3)

Library code:

comb filter<T>(f, ...x:[]T) -> (r:[]) {
  r = ?
  for e in x {
    if not f(e) {
      r ++= e
    }
  }
}

reduce

Sample use:

cassert (1,2,3).reduce(prp.plus) == 6

Library code:

comb reduce<T>(op, ...x:[]T) -> (res:T) {
  if x.[size] <= 1 {
    res = x
    return
  }

  res = x[0]
  for i in x[1..] {
    res = op(res, i)
  }
}

TODO

It would be nice to have the same methods (and names) as the c++20 std::views adaptors so that it is easier for developers to get familiar. E.g: filter, transform, drop, join, split, reverse, common, counted...

https://en.cppreference.com/w/cpp/ranges