Ver Fonte

add readme

txlyre há 3 meses atrás
pai
commit
27d5e96cc2
1 ficheiros alterados com 225 adições e 0 exclusões
  1. 225 0
      readme.md

+ 225 - 0
readme.md

@@ -0,0 +1,225 @@
+# jk
+jk is a recreational tacit array programming language inspired by J and K (so j + k = jk).  
+this is an implementation of the jk interpreter in C. Requires libgc (a.k.a. bdwgc) to build.
+
+# Quick reference (also available in the interpreter itself)
+
+```
+/ comment
+5+5 / also comment
+5+5/not comment (no whitespace before /)
+nil udf                   / special, nil and undefined
+'a'%2                     / = nan, nan used to denote illegal numeric operation
++1 2 3                    / = udf, attempt to transpose flat vector, udf/undefined used to denote illegal operation
+5 5.5 -5 42               / number (double-precision floats)
+nan inf                   /
+'a' 'b' 'g'               / chars (bytes)
+4t.0                      / 0 NUL byte
+(4t.0),:(4t.16),:(4t.22)  /
+1 2 3                     / numbers array
+'hello world!' 'bla''bla' / quote, array of chars
+,'a'                      / 1-char string
+,1                        / 1-elt array
+()                        / unit, empty array
+1,:(5+5),:1 2 3           / strand, mixed array literal
+-1                        / negative num literal
+- 1                       / application of - negate to 1
+-1 -2 -3                  / array of negative nums
+- 1 2 3                   / application of - negate to an array of nums
+5-5                       / array of numbers 5 and -5
+5- 5                      / 5 minus 5
++                         / verb
+5+5                       / dyadic expr
+#1 2 3                    / monadic expr (no left side)
++/ *;.                    / adverb
++;1 -;* +^:^.             / conjunction
+:x+y                      / function literal
+:1                        / function that always yields 1
+x:123                     / bind name
+sq:*;.                    /
+fac:*/1+!                 / bind function
+f:x+y                     /
+f:-x                      / overload function by arity
+f 5                       / = -5
+5 f 5                     / = 10
+*/!.                      / hook, fgx -> f(g(x)), xfgy -> f(g(x, y))
++/%#                      / fork, fghx -> g(f(x), h(x)), xfghy -> g(f(x), h(y))
+1+!                       / over, nfgx -> f(n, g(x)), xnfgy -> f(n, g(x, y))
+1+                        / bond, nfx -> f(n, x), xnfy -> f(n, f(x, y))
+
+:  monadic const         create a function that always yields x
+:  dyadic  bind          bind y to symbol x
+:: dyadic  obverse       insert inverse for x
++  monadic flip          transpose matrix
++  dyadic  plus          add numbers
++. monadic fibonacci     compute xth fibonacci number
++. dyadic  gcd           compute gcd(x, y)
++: monadic sin           compute sin(x)
++: dyadic  combine       combine digits of x and y, same as 10_.(10_:),(10_:)
+-  monadic negate        negate number
+-  dyadic  minus         subtract numbers
+*  monadic first         yield first element of x
+*  dyadic  times         multiply numbers
+*. monadic factorial     x!
+*. dyadic  lcm           compute lcm(x, y)
+*: monadic double        x * 2
+*: dyadic  replicate     repeat y x times
+%  monadic reciprocal    1 / x
+%  dyadic  divide        divide numbers
+%. monadic sqrt          compute square root of x
+%. dyadic  root          compute xth root of y
+%: monadic halve         x % 2
+%: dyadic  idivide       same as % divide, but result is always integer
+!  monadic enum          [0, x)
+!  dyadic  mod           modulo of numbers
+!. monadic iota          [1, x]
+!. dyadic  range         [x, y] (also works for chars and even if x > y)
+!: monadic odometer      !:10 10 is 0 0,:0 1,: ... 1 0,:1 1,: ... 9 8,:9 9
+!: dyadic  chunks        split y into x-sized chunks
+^  monadic exp           e^x
+^  dyadic  power         raise number to a power
+^. monadic nlog          ln(x)
+^. dyadic  log           log(y)/log(x)
+=  monadic permute       generate permutations of x
+=  dyadic  equals        test whether x and y are equal
+=. monadic occurences    count occurences of elts, =.'Hello World!' is 0 0 0 1 0 0 0 1 0 2 0 0
+=. dyadic  mask          mask one array in another, 'abxyzabayxxyabxyk'=.'xy' is 0 0 1 1 0 0 0 0 0 0 2 2 0 0 3 3 0
+=: monadic classify      assign unique index to each unique elt, =:'Hello World!' is 0 1 2 2 3 4 5 3 6 2 7 8
+=: dyadic  match         same as = equals, but rank 0, so compares x and y as whole
+~  monadic not           logical not, nil udf () 0 4t.0 are not truthy, everything else is truthy
+~  dyadic  notequals     test whether x and y are not equal
+~. monadic sign          sign of x, -1 for negative, 0 for 0, 1 for positive
+~. dyadic  insert        insert x between elts of y, 0~.1 2 3 is 1 0 2 0 3
+~: dyadic  notmatch      rank 0 version of ~ notequals
+<  monadic pred          x - 1
+<  dyadic  less          test whether x is lesser than y
+<. monadic floor         round x down
+<. dyadic  lesseq        test whether x is equal or lesser than y
+<: monadic gradedown     indices of array sorted descending
+<: dyadic  nudgeleft     shift elts of y to the left filling gap with x
+>  monadic succ          x + 1
+>  dyadic  greater       test whether x is greater than y
+>. monadic ceil          round x up
+>. dyadic  greatereq     test whether x is equal or greater than y
+>: monadic gradeup       indices of array sorted ascending
+>: dyadic  nudgeright    shift elts of y to the right filling gap with x
+,  monadic enlist        put x into 1-elt array
+,  dyadic  join          concat x and y
+,. monadic enfile        ame as , enlist but with infinite rank, ,.1 2 3 is (,1),:(,2),:(,3)
+#  monadic count         yield count of elts of x
+#  dyadic  take          take x first elts of y (or last if x < 0)
+#. monadic where         #.0 0 1 0 1 0 is 2 4
+#. dyadic  copy          repeat each elt of x by corresponding number in y, 5 2 3 3#.0 2 2 1 is 2 2 3 3 3
+#: monadic group         #:'mississippi' is (,0),:1 4 7 10,:2 3 5 6,:8 9
+#: dyadic  buckets       group elts of y into buckets according to x, e.g. 0 -1 -1 2 0#:a b c d e is (a,.e),:(),:(,d)
+_  monadic nub           mark all unique elts of x, e.g. _'abracadabra' yields 1 1 1 0 1 0 1 0 0 0 0
+_  dyadic  drop          remove first x elts of y (or last if x < 0)
+_. monadic unbits        _.1 0 1 is 5
+_. dyadic  unbase        10_.4 5 6 is 456
+_: monadic bits          _:5 is 1 0 1
+_: dyadic  base          10_:4242 is 4 2 4 2
+?  monadic unique        distinct elts of x, same as ]#._
+?  dyadic  find          find all indices of x in y
+&  monadic flatten       flatten an array, same as ,//.
+&  dyadic  minand        get min of two numbers (logical and for 0/1s)
+|  monadic reverse       reverse an array
+|  dyadic  maxor         get max of two numbers (for 0/1s is same as logical or)
+|. monadic round         round x
+|. dyadic  rotate        rotate array x times clockwise (-x for counterclockwise)
+|: monadic depth         find max depth of x, |:,,,y yields 3
+|: dyadic  windows       yields all contiguous x-sized subarrays of y
+@  monadic abs           |x|
+@  dyadic  at            pick elts from x by indices from y
+@. monadic shuffle       shuffle elts of x
+@. dyadicn member        check whether x is in y
+{  monadic head          first two elts of x, same as 2#
+{  dyadic  bin           bin search, e.g. 1 3 5 7 9{8 9 0 yields 3 4 -1
+{. monadic tail          last elt of x
+{: monadic prefixes      prefixes of x, same as |}.\.
+{: dyadic  shl           x << y
+}  monadic behead        all elts of x except first, same as 1_
+}  dyadic  xor           x ^ y
+}. monadic curtail       all elts of x except last, same as -1_
+}: monadic suffixes      suffixes of x, same as }.\.
+}: dyadic  shr           x >> y
+[  monadic factors       compute prime factors of x
+[  dyadic  left          yield x
+[. monadic bnot          ~x
+[. dyadic  bor           x | y
+[: monadic primes        find primes in range [2, x]
+[: dyadic  parts         split y into x parts
+]  monadic same          yield x (i.e. identity)
+]  dyadic  right         yield y (i.e. right argument)
+]. monadic sort          sort x ascending, shortcut for ]@>:
+]. dyadic  outof         the number of ways of picking x balls from a bag of y balls, e.g. 5].10 is 252
+]: monadic unsort        sort x descending, shortcut for ]@<:
+]: dyadic  explode       split y by delim x
+`. monadic symbol        cast x to a symbol
+`. dyadic  apply1        apply x to y
+`: monadic square        x ^ 2
+`: dyadic  apply2        apply x to y (y is 2-elt array of args)
+$  monadic shape         yield shape of x
+$  dyadic  reshape       reshape y to shape x
+$. monadic repr          yield string repr of x
+$. dyadic  format        format y by template x, e.g. '{0}+{1}*{-1}+_'$.1 2 3 4 is 1+2*4+1
+$: monadic eye           identity matrix of size x
+$: dyadic  implode       join y inserting x between
+
+p. monadic print         print x
+P. monadic println       print x and a \n
+f. monadic selfref1      monadic reference to current function or rhs of bind
+f. dyadic  selfref2      dyadic reference to current function or rhs of bind
+F. monadic read          read file (x=0 to read stdin)
+F. dyadic  write         write file (y=0 to write to stderr)
+t. monadic type          type of x, array=0, verb=1, symbol=2, number=3, char=4, nil=5, udf=6
+r. monadic deal          yield random elt of x
+r. dyadic  roll          roll xdy (note: y is 0-based, so >xr.y for 1-based)
+e. monadic eval          eval expression, yields udf on parse error
+i. monadic import        load and eval source file
+y. monadic system        exec system command (yields output)
+y. dyadic  system2       exec system command with input
+E. monadic exit          exit with exit code
+
+f"       each          >"1 2 3 yields 2 3 4
+xf"      merge         1 2 3,"a b c yields (1,.a),:(2,.b),:(3,.c)
+f".      eachprior     -".1 2 2 3 5 6 yields 1 0 1 2 1
+xf".     eachpriorwith 0-".1 2 2 3 5 6 yields 1 1 0 1 2 1
+f/       fold          +/1 2 3 yields 6
+xf/      foldwith      1+/1 2 3 yields 7
+f\       scan          +\1 2 3 yields 1 3 6
+xf\      scanwith      1+\1 2 3 yields 1 2 4 7
+f/.      converge      1;_/.1 2 3 yields ()
+f\.      converges     1;_\.1 2 3 yields 1 2 3,:2 3,:(,3),:()
+xf/.     eachright     1-/.1 2 3 yields 0 1 2
+xf\.     eachleft      1-\.1 2 3 yields 0 -1 -2
+f":      rank          #":1 2 3$1 yields 3 3, #":inf 2 3$1 yields 1 1 1,:1 1 1
+xf":     rank          1 2 3 *:":1 1 2 3 yields (,1),:2 2,:3 3 3
+n`       amend         'gw'0 3`'cross' yields 'grows'
+f&.      filter        >;0&.-2!.2 yields 1 2, basically shortcut for ]#.f
+f/:      span          =;' '/:'x y z' yields (,'x'),:(,'y'),:(,'z')
+xf/:     stencil       3+//:!10 yields 3 6 9 12 15 18 21 24, shortcut for f"x|:
+f;.      reflex        *;.5 yields 25, 5%;.2 yields 0.4
+
+f;g      bond      */;!.5 yields 120, +;1 5 yields 6, 5;- 1 yields 4
+f?.x     pick      >;5?.((2*),:<)"3 6 yields 6 5
+f?:F     while     <;5?:>0 yields 5
+n?:f     repeat    5?:*;2 1 yields 32
+f&:F     if        1+&:+2 yields 2
+f;:F     monaddyad -;:+5 yields -5, 1-;:+5 yields 6
+
+inverse of a function f is a function ~f that undoes the effect of f
+
+f::~f  obverse  define inverse ~f for f
+
+f-:x   inverse  ~fx
+xf-:y  inverse  (~fx)~f~fx
+f^:Fx  under    ~FfFx
+xf^:Fx under    ~F(Fx)f(Fx)
+```
+
+# Prebuilt binaries
+
+There is prebuilt ELF executables with statically linked libgc for x86-64 and aarch64 Linux:
+
+- [x86_64](https://files.txlyre.website/d/software/jk/latest_linux_x86_64/jk)
+- [aarch64](https://files.txlyre.website/d/software/jk/latest_linux_aarch64/jk)