How well does K do when measured against KW's feature-list?
Memory-Mangement 200 200 reference counting
Aggregates 200 200 vectors, lists, dictionaries (k4: tables, keyed tables)
First-Class-Data 200 200 f x for any x
Modules 200 100 K tree, scripts
Recursion 200 100 fixed stack size, stack error if too deep
8bit 100 200 text:0:, mmap binary:1:, copy binary:2:, bytes:6:
First-Class-Functions 100 200 + and {x+y} are first-class
Posix 100 50 only via c, java, 2:, or use 3: 4: (native ipc, system calls)
Objects 100 0 NA - variables have first-class attributes, triggers, dependencies
Separate-Compilation 200 200 interpreted, scripts
--
1600 1450
Strong-Typing 60 60 trapped execute, token/length/type/domain/&c. errors
Extensive-Library 50 25 powerful primitive set, critical libraries from kx, else from community
Standard 40 40 single implementation
Exceptions 60 60 signal and trap (k4: execute alternate)
Syntax 30 30 noun-verb-adverb + syntactic sugar, precedence-free
Local-Functions 20 20 f:{g:{x+y};g[x;y]}
Static-Typing 20 0 dynamic typing
Macros 40 30 no macros, but flexible control structures (if, do, while :[]) + adverbs
Exec 20 10 `3: `4:
FFI 10 10 2:
Pattern-Matching 50 40 _sm _ss _ssr pattern-matching, regexp via 2:
Numbers 10 10 int float (k4: bool byte short int long real float
char sym month date datetime minute second time enum)
--
410 335
Streams 5 0
Currying 9 9 f:{x-y};g:f[2];h:f[;3]
Coroutines 5 0
Type-Inference 4 0
Multiple-Value-Return 3 3 {(x+y;x-y)}[2;3] -> 5 -1
Circles 3 0
Continuations 3 0
Reflexivity 3 3 the K tree is a first-class dictionary
Persistance 3 3 (k4: files are variables)
GUI 1 1 native GUI (`show$ `hide$)
--
39 19
Have I been too generous in my point-assignments? I think not. For example, consider KW's grading of Python. Python has a fixed stack-size, so recursions have limited depth. But KW has awarded the full 200 points, whereas I give K only 100. Again, Python receives a perfect score for first-class functions, although even proponents of this language acknowledge that Python lambdas have limited functionality.
KW also considers properties of implementations:
Freely distributable? yes: eval version is object-size- and message-number-limited Interpreted implementation? yes Compiled implementation? no Dynamic loading for foreign functions? yes An interactive source-level debugger yes and no: use the console
Click here for a K implementation of KW's benchmark tasks. Test files are here.
Results* are:
| Benchmark | Program | Run Time (secs) | Space Used(K) | Space Allocated(K) | Compile Time (secs) | Source Size (K bytes) |
|---|---|---|---|---|---|---|
| tak | K | 0.031 | 1 | 0 | 0 | < 1 |
| fgrep | K | 0.015 | 10 | 1056 | 0 | < 1 |
| invert | K | 0.031 | 6768 | 21113 | 0 | < 1 |
*Pentium 4, cpu: 3 ghz, ram: 2 gb
NB: 7 = tak[18;12;6], words.txt has 24012 bytes, 220542 words, invert result has 1301 rows.