Once you understand the underlying data structure, a lot of k's design decisions make sense. I am using the k.h file from k4 as almost the sole guide to recreating a toy k5 (http://kparc.com/k.txt) interpreter in C.
Really? You can't understand a new language that's in the same general paradigm as one you know already? Because I can, and I'm no PL genius. I've been able to very quickly understand code written in Swift, Ceylon, Pyret, Rust, Nimrod, and various other new-to-me languages in the past few years.
But I can't make heads or tails of K. And that's clearly the way it's meant to be. It's the epitome of an esoteric language.
Can you read Prolog (assuming you're not fluent in it already)? It is a little farther along from Algol - it is generally verbose, but control flow is implicit (by failure, and negation IS failure), except where you make it explicit by saying '!' (read: "cut"), which means "never backtrack through this point". And there's no assignment, but unification plays a similar part - except it is much weirder (to the uninitiated).
K is of the APL / J mold, which is much farther away from Algol and Prolog. It's mostly functional. It takes orthogonality beyond where Haskell does. Examples that might make you look again:
"flatten" (convert recursively nested list/tree to one-level list with the same order as a DFS scan) is written ",//"
"decode run length decoding" is written ",/#/'" (courtesy of https://github.com/JohnEarnest/ok/blob/gh-pages/examples/run...
Now, these 3-char and 5-char examples are not predefined in any way; They emerge from composing the semantics of the individual characters that make them. Let that sink. Are you aware of any other language in which a straight concatenation of 3 primitives generates a "flatten" function? 5 primitives generates a "run length decoding" function? Something about K/APL/J is distinctly different. And if you believe that it looks different becuase it's "the way it's meant to be", you're missing out on a lot.
Does J count? ;)
A quick look here: http://rosettacode.org/wiki/Flatten_a_list seems to suggest that in most languages you need at least ~5 primitives (I'm counting for example pattern matching, 'rec' qualifier in OCaml, named let in Scheme etc. as single language primitives, maybe that's too restricted).
Here's your answer: new-to-you, yet very similar to whatever you knew before. Try Oz, Mercury, Lisp, Forth, Avail, Red/REBOL, Clean or J to see how little you actually know about programming languages.
I don't mean this as an insult, it's just that PL design and research is a HUGE field with people devoting all their academic careers to it; it's only natural to expect most of such a field be unfamiliar and inscrutable if you're not working in it.