5 ms·
Kay: > There are several modern APL-like languages today — such as J and K — but I would criticize them as being too much like the classic APL. It is possible t
by bakul 7y ago
Kay:
> There are several modern APL-like languages today — such as J and K — but I would criticize them as being too much like the classic APL. It is possible to extract what is really great from APL and use it in new language designs without being so tied to the past.
It would've been good to see specific criticism instead of being just like classic APL.
I think many of APL/k/j verbs/adverbs can be generalized to working on streams (dataflow programming). Perhaps Dan Amelang's very interesting work on "2.5D" graphics can be cast into such an extended version....
- vchak1 7y agoI 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).