Comment by vchak1

7 years 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.

I 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.

  • If 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.

    • This 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).

Do you have an easy way to set up Nile and get it running? And did you run Frank too?