- [ ] Emacs
- [ ] Vim
- [ ] Sublime Text
- [ ] Atom
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
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.
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”.
In Number it ignores leading/trailing whitespace, in Boolean and other custom types it does not.
Too many unlawful protocols, and too many protocols that could be split up into different things to be more useful.
Currently you can have:
match x { | a, b => # runtime error here }
Currently we can’t reason about name collisions in generated code