4 ms·
I have played with both Nile and APL now for a bit, and I have been thinking about how to combine them. I believe if we took Nile's operator overloading, tick s
by vchak1 7y ago
I have played with both Nile and APL now for a bit, and I have been thinking about how to combine them. I believe if we took Nile's operator overloading, tick syntax (s' is the previous value of s), and recursion being expressed via streams (<< operator), and combined it with some of the higher order adverbs of apl, it might be very interesting. In APL complex structures (say a point, or a bezier curve) need to be broken up into constituent equal length arrays for processing, but I believe one could just overload basic operations like +, - , etc.
- chenglou 7y agoDo you have an easy way to set up Nile and get it running? And did you run Frank too?
- vchak1 7y agoNo I ran it mainly from from Bret Victors viz directory. Did not run Frank. Would be interesting to build a Nile runtime in go or elixir (maps well to [processes), with a simple compiler in Ocaml.
- chenglou 7y agoBy viz directory did you mean https://github.com/damelang/nile/tree/master/viz/NileViewer https://github.com/damelang/nile/tree/master/viz/NileViewer And yeah, it'd interesting to build one. Is there enough info on it to build such compiler though? That NileVM.js is helpful. I've posted a list of resources in another comment below, but maybe I've missed a few
- vchak1 7y agoThe Nile compilers directory has a bunch of stuff in JavaScript, Smalltalk as well as in Maru (which is in itself pretty interesting, and is a self hosted lisp)
- bakul 7y agoI am more familiar with k so will use it as an example. If we were to extend it, the equivalent of some functions in compositor.nl would be something like this: compositeSrc:{x} // output first arg compositeDst:{y} // output second arg compositeInvert:{+(1-x[;0];1-x[;1];1-x[;2];x[;3])} // take a column, invert r, g, b columns and transpose where x[i;0 1 2 3] == ith (r,g,b,a) of x. No need for "∀ (A, B) >>". This is implicit as k/APL work on whole collections. Basic operations are already overloaded. There would need to be a way to define tuples. "x[i;2]" to refer to ith blue value is a bit cryptic. You can define verb "blue x[i]" to do the same but may be some language syntax would help. I can't grasp enough of Nile through the examples I've seen so far but seems doable.
- vchak1 7y agoIf you take a look at things like converting beziers into sub-beziers of specific flatness, you could express it pretty easily as a // convergence as in k, or a power operator in apl, but it would be really nice to have the notion of an algebra of points. So if the distance between two points is b - a, then +/ eachprior {y-x} would give us the total length of a polyline.
- bakul 7y agoThis can get a bit tricky. You can do something like this today: d:{_sqrt+/(y-x)^2} ls: 2 10 # 20 _draw 0 // a list of 10 random points +/d':ls // total length Now if x, y above are vectors of points (as opposed to vectors of pairs), and if points have their own - verb, total length becomes "+/{y-x}':ls". But to define such a - for point, you'd need conversion verbs (or enclose/disclose).