4 ms·
Determining an Election in K
- RodgerTheGreat 7y agoA nice demonstration of how the K REPL can be used as a calculator and exploratory tool. The concise syntax particularly shines in interactive cases.
- DaiPlusPlus 7y ago> The concise syntax particularly shines in interactive cases If you can tolerate the learning-curve though. For comparison, I do appreciate that many (most?) Linux shell utilities and command-line programs in general have adopted standard conventions for arguments (-f for short, --full for verbose) which make it easier for people new to a program to take a cryptic command-line and look-up the full-versions of the abbreviated commands to see what's going on - PowerShell does the same thing with its strict aliasing of cmdlets. Unfortunately I can't see that K (or many other programming languages really) do the same thing, where a a short, cryptic program can be syntactically expanded to one using verbose syntax with no changes in program semantics (unless you count VB.NET vs C# equivalence, heh). Is there any automated explainer tools for the K language for beginners?
- smabie 7y ago> Is there any automated explainer tools for the K language for beginners? I think q is a better starting out point than k. Most functions in q have readable names (each in q vs ' in k, for example). Also it comes with a richer library of functions.
- nprescott 7y agoNot long ago there was a post about using English language instead of the J symbology[0] but the end result isn't meaningfully easier to understand because of all the prerequisite knowledge of how evaluation works etc., once you've worked that out most of the "line noise" has already sunk in. I think that's a big sticking point against creating a second "inflatable" notation - though there is always Nial[1] Not entirely an answer to your question, but J provides introspection/help in a pretty direct way via two distinct means, the first is ;: ("words") which will show you the parse of a J phrase (here, a pretty direct translation of the algorithm in the article): ;:'+/s>(s,#v)$/:\:,/v&%"0 (0.5+i.s)' ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬──┬──┬─┬─┬─┬─┬─┬─┬─┬─┬───┬─┬──┬─┬─┐ │+│/│s│>│(│s│,│#│v│)│$│/:│\:│,│/│v│&│%│"│0│(│0.5│+│i.│s│)│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴─┴─┴─┴─┴─┴─┴─┴─┴───┴─┴──┴─┴─┘ Which shows the tokens of the phrase, which can be helpful if you are unsure of where a symbol or diacritic is being used. Inside the J IDE you can get context sensitive help by pressing Ctrl-F1 on a symbol, if you were interested in /: for example, you are directly linked here[2]. I am unaware of a similar tool in K, which should not be taken to mean it doesn't or can't exist. One of the reasons I'm interested in J has been the tooling and documentation available. [0]: https://wjmn.github.io/posts/j-can-look-like-apl/ https://wjmn.github.io/posts/j-can-look-like-apl/ [1]: https://tangentstorm.github.io/nial/intro.ndf.html https://tangentstorm.github.io/nial/intro.ndf.html [2]: https://code.jsoftware.com/wiki/Vocabulary/slashco https://code.jsoftware.com/wiki/Vocabulary/slashco
- rgoulter 7y ago> The concise syntax particularly shines in interactive cases. I think this is a good point. In an interactive environment: you can iteratively build the expression up, and you have the right chunks of context in working memory as you do it. You'd still need to learn what the different functions/operations are; but in a one-line REPL the use of symbols would allow you to fit more on a line than using more traditional identifiers. That avoids many of the things I'd be concerned about for writing code like this if I had to come back and read or modify it months later.
- notafraudster 7y agoThis is concise in a sort of code golf way, but not substantially faster to write than equivalent R code -- I chose R because math operations are natively vectorized and the basic data type is a vector, and because the language has a user-friendly REPL -- would be, and certainly less readable. I read the linked K documentation and it seems like much of K's syntax was motivated by wanting to get away from "the programmer way of doing things", but the lack of readability would seem to get in the way of that. Still neat as a toy exercise using what seems like a fun little micro-language.
- haolez 7y agoK is being used in the financial market for at least 25 years, having been dominant through most of this time. It's certainly not a toy language. Although I'm not a K programmer (I've done some J in the past), the point that K programmers make is that the code IS readable once you get used to it. One of the benefits commonly mentioned is that you can keep the whole program in your mind at once. I can't do that with my own Go and Python programs :)
- magicalhippo 7y agoBut with proper code, you shouldn't need to keep the whole program in your mind at once. You need the high-level overview, but the pieces shouldn't require you to know the details about "far away" code.
- smabie 7y agoAnd yet, they do. We as developers are so bad at building and maintaining abstractions that maybe we should just do away with most of them. I'm not convinced that layers upon layers of abstractions even help at all; K's approach of destroying abstractions is probably a better way to program. I think we've hit an inflection point in the last 10 or 20 years where the stack is so complex that absolutely no one can understand it. This is a natural consequence of abstraction: it never stops and is self-justifying. It's possible that we just need to stop creating "elegant" class hierarchies or free monad or whatever and just write some compact, blazing fast, and unabstracted code. k/q is interesting because it doesn't even really have the tools to create abstractions, so you're forced to actually solve the problem at hand from the get-go. And when you do solve said problem, you realize it's 10x shorter than the abstracted program, all fits on one screen, and is even easier to understand. Once you reach that point, you start to question whether current development practices are just cargo-culting.
- nprescott 7y agoAlways a pleasant surprise to find niche or mundane uses of array languages. I really appreciate the explication because it made it possible for me to follow along in J - there's vanishingly little material to patiently explain bits like the "grade-up grade-down to return rank" that permeates so much APL-style code. I'm similarly pleased to have found a correspondence from K's ' (also present in Klong) to J, where it ends up being "0 in this instance. r=. v&%"0 (0.5+i. s) +/s>($r)$/:\:,/r
- chrispsn 7y agoAnother approach to the 'highest averages' method, using a k9 dict: v: 10400 3400 6200 s: 15 quotients: ,/v%\.5+!s labels: s/!s*#v / list of 15x 0, 1, 2. arbitrary; could instead be party names top: s#>labels!quotients / k dicts can have duplicate keys; can sort items by key(^) or val(<>) seats: `freq@!top / count appearances of dict's keys The ability to transform a dict's values while keeping the labels (keys) unchanged - sort, arithmetic, etc - is really powerful. This answer is longer when minified, but it's faster in 2020.03.27: \t:100000 +/s>(#v)^<>,/v%/.5+!s ⇒ 1494 \t:100000 `freq@!s#>(s/!s*#v)!,/v%\.5+!s ⇒ 691
- chrispsn 7y agoCorrection: I think the above can be a bit faster and shorter if we skip the dict, and just index into the keys. Compare: \t:100000 `freq@!s#>(s/!s*#v)!,/v%\.5+!s 941 \t:100000 `freq(s/!s*#v)s#>,/v%\.5+!s 901
- maest 7y agoThough I would miss the daily K post, but here it is!
- cabalamat 7y agoI suspect the Python or Haskell equivalent of _q+(s-+/_q)><>q-_q:s*v%+/v would be longer, but it would also probably be more readable.
- ulucs 7y agoThe only difference is a matter of alphabets. Is English more readable than Japanese because the words aren't as condensed?
- qubex 7y agoK definitely meets my criteria for being a Write-Only Language. I remember a quote about APL (a precursor to K) being “indistinguishable from line noise”. https://en.wikipedia.org/wiki/Write-only_language https://en.wikipedia.org/wiki/Write-only_language