A look at the J language: the fine line between genius and insanity (2012)
scottlocklin.wordpress.com
scottlocklin.wordpress.com
Kerf was a tough slog, but Kevin and I landed on our feet. We'll do something with the code one of these days.
Glad to hear y'all found something after Kerf. I would've guessed there would be some market for a tsdb cheaper than kdb+ (what I assume y'all were trying to do). Your blog post mentioning overhyped tech really gave me a chuckle. In college I started to focus on nanotechnology before going to a career fair and talking to some companies. Thousands of students getting degrees focused on that and there are only a handful of startups hiring researchers and only so many grad-student type jobs. I had a physics professor tell me a niche field comes up like that every decade which gets a lot of funding, but essentially under delivers and dies out. I think there is some benefit to nano materials like high strength cables, but not the miracle sauce that is getting preached everywhere.
If someone is serious about array programming/APL and wants to make a lucrative career in it, study KDB+/Q/K. There's a small but active community around them.
Just to relate an anecdote: I used to be a fairly active KDB+ programmer in finance but left both finance and programming ~8 years ago. Just yesterday, I got an email from my friend who's building a statarb fund around cryptocurrencies. They were going to use KDB+ and offered me a job for "300-500k base with incentives"...
My friends clearly don't know that I now work in sales & marketing :D
Aside: Roger Hui, the creator of J, is a programming sibling of Arthur Whitney, the creator of K/Q and the founder of www.kx.com
Did you think finance programming industry (specifically around the KDB+/Q/K niche) fostered a "bro" culture (think wolf of wall street)? It always seemed like an interesting field, but every once in a while I hear discouraging stories. Curious about your experience with it.
One guy in London who worked in kdb was a huge arse, the tens of others I've encountered have all been lovely. It's an insane little language, though I'm only a basic user.
Looking at this "C" code, it's pretty clear that he was destined to be an APL-style programmer :)
Also related is range-based programming. https://wiki.dlang.org/Component_programming_with_ranges
return
// Start by generating all dates for the given year
datesInYear(year)
// Group them by month
.byMonth()
// Group the months into horizontal rows
.chunks(monthsPerRow)
// Format each row
.map!(r =>
// By formatting each month
r.formatMonths()
// Storing each month's formatting in a row buffer
.array()
// Horizontally pasting each respective month's lines together
.pasteBlocks(colSpacing)
.join("\n"))
// Insert a blank line between each row
.join("\n\n");
Much more readable than something like "(~R∊R∘.×R)/R←1↓ιR". require 'dates general/misc/format'
4 3$ calendar 2018
4 3$ just re$hapes it from a big as line to a 4x3 calendar. If you wanted to print it to a file you'd want to convert it to a string of course so: ": 4 3$calendar 2018Wouldn't adding 8 lines of comments help newcomers to APL, too? This seems like a rather unfair contest.
Familiarity counts for a lot. 25 years ago when my primary language was 6502 assembly, I would have said 20 pages of assembly code look more readable than either of these.
In the long run, though, in every field I've worked in, being able to turn 20 lines of code into 20 characters has turned out to be a huge benefit. Once you familiarize yourself with the vocabulary, you can operate at a higher level. Nobody fears concise names and symbols when it's in a context they understand. I think even the most APL-phobic would admit that "a←b+c" is more readable than "assign(a,sum(b,c))".
The piece of code |/0(0|+)\ (all 9 characters of it) efficiently computes the maximum subarray sum[0] of an array using Kadane's algorithm. You'll either have to learn K or trust me on that.
While it is possible to break it down to multiple parts and document each, it is idiomatic to just use it and document the whole line. Or not document it at all, because experienced K people know that already. Why call a function "average" (7 chars) when an implementation (+/x)%#x is only 6? Furthermore, you know from reading it what the average of a zero length list is (NaN). Do you know what a function called "average" would return in this case?
I would say the answer to your question is that K is very different than other programming languages, and requires a different mindset. Somehow, attempts to give it a more mainstream face (e.g. article author's "Kerf" project) do not seem to take off.
Edit: Just saw beagle3's comment after posting mine. Some interesting points there. Still wonder about the non-tech factors though, as listed in above part of my comment.
They're more likely offering 500k for someone who has a lot of experience managing financial tick data in a KDB environment.
The catch will be that not everyone who has read the KDB for Dummies book (OK, I made that up) will be able to walk into a stat arb hedge fund and add 500k of value.
cat 1.q
\c 2000 200
k)-23!t:select from .:`:t.kdb
k).Q.fs[{`t insert +:`url`title`user`item!("SSSS";",")0:x }] `:hn.csv
k)-23!t:?:select from t
`:t.kdb set t
\\
As for how to get hn.csv, I use shell scripts to download all the pages of HN html (in accordance with robots.txt specified delay). Then I use a simple lexer (made with flex) to transform the html to hn.csv with the above selected columns.After some years, the file hn.csv can grow quite large, larger than available memory.
To read and select articles from t.kdb, I use less(1) and some small shell scripts.
This lists all the articles, starting after a given offset, or zero by default:
echo -e '\\c 2000 2000\nk)select i,title from .:`:t.kdb where i>'${1-0}'\n' \
|exec q > 1;
exec less 1;
Then, to select and read an article or its comments I use the ":!cmd" feature in less(1) to invoke an appropriate shell script (actually, an execline script). Quit, and I am returned to less.Have seen lots of systems for reading HN made by HN readers, using various databases I guess. This is mine, using kdb+.
I encourage you to give this language a shot - it's got some really cool ideas.
[1] http://doc.sccode.org/Guides/J-concepts-in-SC.html
[2] https://github.com/Engid/superfun/blob/master/first-impressi...
However, in case I ever felt like learning one of these, I'd always wanted to know: the syntax crazyness, "a la brainfuck", is it a feature? a bug? Is it really needed? Can't they make an APL "look like Python" but using the same concepts, etc? Or is it "a thing" / something ultra-core to these languages, to be extremely terse / cryptic and intensely dense (each line packs a ton of punch!)?
e.g. just read http://www.jsoftware.com/help/dictionary/didot.htm and some of the stuff in there can be translated quite well:
i. 5 --> list(range(0, 5))
i. _5 --> list(range(0, 5))[::-1] or list(range(4, -1, -1))
i. 2 _5 --> [list(0 + j, 5 + j)[::-1] for j in range(0, 10, 5)]
P.S. any pointers to content / books about the philosophy and ideas behind these programming languages are welcome! :D
Perl 6 has some APLish array-oriented features in something arguably closer to what is common syntactically. Of course, it's not an APL with alternative syntax, but an extremely multiparadigm language with that as one of many influences.
Thank you for the brief mention -- I've been perusing his website and writings and am enamored. There's something about niche, obscure tools (and their authors) that give me some profound joy.
...really?
Look, I like APL and J much more than the next guy, but I can't find a single angle from which that is a reasonable argument.
also NumPy, and Nd4j via scala bindings
of course NumPy and Nd4j are libaries
i strongly recommend Julia as an array-oriented programming language
particularly because it has quite a few other features to recommend it
Julia follows the Matlab syntax conventions more closely than NumPy (or R) which i think was a good design choice
APL uses arrays for everything though. I just wish it had taken off more on the scientific front instead of the financial side as the linear algebra stuff isn't nearly as fleshed out as Matlab/Numpy/Mathematica.
i suspect that, to capture the full value of J, one needs to already know the array-oriented paradigm (or at least have a strong motivation to learn the two in parallel)
knowing the AOP paradigm also helps understand the programming patterns as well as the syntax
still, the dense syntax has extraordinary power
for instance, n-queens in J (from Rosetta Code) is just 4 short lines:
perm =: ! A.&i. ]
comb2 =: (, #: I.@,@(</)&i.)~
mask =: [ */@:~:&(|@-/) {
queenst=: comb2 (] #"1~ mask)&.|: perm
a fundamental AOP patterns is evidenced here:line 1: create the 2D array (n x n chessboard)
line 2: populate the array with candidate solutions
line 3: eliminate invalid solutions ('mask' them)
Yes, that's the power that's specific to J. Having a library of functions like anagram index, nub, antibase, matrix inverse, etc. can be done in pretty much any language. So can using really short names for everything (have a look at the J implementation). What J has that isn't so easy to export is the way first-order functions work on arbitrarily high-rank arguments, and even a lot of APLs don't let you mix argument ranks in the way that J does (e.g., vector-matrix addition). Without the inherently rank-polymorphic function application semantics, it would just be an idiosyncratic pointfree programming syntax for people who don't want to use anything higher than second-order functions (and maybe have a grudge against static parsing).
Many APL idioms, when translated to Haskell, are related to applicative functors. A smidget of dependent types is needed as well, to express the dimensions of vectors, arrays, and the like.