Skip to content

Latest commit

 

History

History
150 lines (142 loc) · 4.59 KB

ROADMAP.org

File metadata and controls

150 lines (142 loc) · 4.59 KB

0.1 ~ Munchkin

Compiler

Protocols don’t get properly merged on imports

Pattern matching should check the type tag as well

TCO directly-recursive functions

Ecosystem

Provide better utilities for handling failures

Github’s Linguist addition

Pygments lexer

Syntax-highlighting for major text editors/IDEs

  • [ ] Emacs
  • [ ] Vim
  • [ ] Sublime Text
  • [ ] Atom

Libraries

Remove Tuple:With: data structure

[0/3] Core

FFI

Protocols

Data

[0/14] Data

Boolean

Number

Maybe

Either

Validation

String

Char

Function

List

Vector

Set

Map

Record

Date

[0/1] Control

Monad

[0/2] Concurrency

Async

Timer

[0/1] Debug

Trace

[0/9] I/O

Plan

Plan.Combinators

Task

Console

FileSystem

Provide better types for Mode and Encoding
write:mode:encoding: should accept Strings/Buffers/Streams

Process

Shell

Zip

Crypto

[0/3] Web

HTTP

URI

Server

[0/3] Database

Driver.PostgreSQL

Driver.MySQL

Modelling

[0/4] Language

Parsing

JSON

HTML

SQL

[0/3] Test

QuickCheck

Spec

Benchmark

Documentation

Write tutorials for getting started with Purr

Document the language’s grammar

Document language’s semantics

Tooling

Allow defining load paths for compiler / REPL

Syntax

Semantics

Records should only accept functions

[#A] Protocol implementations should be late bound

Remove inline FFI

Make all names late-bound in Modules

Merge use and import

Inline example / quickcheck tests

Future

Contracts for module dependencies

Linting/Formatting tool

Track a binding’s history

The REPL allows one to overwrite bindings. It would be cool if these could be tracked, so:

$ bin/ipurr --run-io

> let foo => 1
# => (<function>) <function: foo>
> foo
# => (<number>) 1
> let foo => 2
# *** Note: Overwriting binding: foo
# => (<function>) <function: foo>
> foo
# => (<number>) 2
> foo history
# => (<#List:Purr.Core>) [<function: foo>, <function: foo>]
> foo history first map: source
# => (<#Maybe:Purr.Core>) Just(function $foo($_) { return 2; })
> foo history last map: source 
# => (<#Maybe:Purr.Core>) Just(function $foo($_) { return 1; })
> foo history last map: (foo rollback-to: _) |> _ get-or-else: (Task of: Unit)
# (This returns an Io.Task)
> foo
# => (<number>) 1

[#C] Store REPL results in ${1..9} variables

[#B] Provide different interpreters for the main function

This would allow someone to directly run a module that returns a webserver with something like: purr run-server Module –port 8080, whereas run would expect the type Task<Unit>.

We could also allow these different interpreters to be installed as modules/plugins, similar to Leiningen.

[#B] Give functions different tags based on their arity

This solves the problem with ambiguity in the use of parenthesis and the problem with enforcing proper arities, it also allows other things to be used as “blocks”.

[#C] Support predicate constraints in patterns

[#C] Allow named instances

[#A] Make from-string: work consistently

In Number it ignores leading/trailing whitespace, in Boolean and other custom types it does not.

Gradual typing

[#C] Revisit the core protocol hierarchy

Too many unlawful protocols, and too many protocols that could be split up into different things to be more useful.

[#A] Enforce consistent patterns

Currently you can have:

match x {
  | a, b => # runtime error here
}

Literate Purr dialect

[#A] Mirror-based reflection

Documentation generator

Handle generated variables properly

Currently we can’t reason about name collisions in generated code

[#C] Allow pattern matching inside do-notation

[#B] Multi-line strings shouldn’t consider indentation as part of the string