Home. Work-in-progress documentation for Goal. Last update: 2024-09-17.

3 Help

This chapter replicates the REPL help system contents, also found in the repository in docs/help.txt. It is the practical reference for the language. More in-depth explanations of specific topics can be found in the FAQ chapter.

TOPICS HELP
Type help TOPIC or h TOPIC where TOPIC is one of:

"s"     syntax
"t"     value types
"v"     verbs (like +*-%,)
"nv"    named verbs (like in, sign)
"a"     adverbs (/\')
"tm"    time handling
"rt"    runtime system
"io"    IO verbs (like say, open, read)
op      where op is a builtin's name (like "+" or "in")

Notations:
        i (integer) n (number) s (string) r (regexp)
        d (dict) t (dict S!Y) h (handle) e (error)
        f (function) F (dyadic function)
        x,y,z (any other) I,N,S,X,Y,A (arrays)

SYNTAX HELP
numbers         1     1.5     0b0110     1.7e-3     0xab     0n     0w     3h2m
strings         "text\x2c\u00FF\n"     "\""     "\u65e5"     "interpolated $var"
                qq/$var\n or ${var}/   qq#text#  (delimiters :+-*%!&|=~,^#_?@`/)
raw strings     rq/anything until single slash/          rq#doubling ## escapes#
arrays          1 2 -3 4      1 "ab" -2 "cd"      (1 2;"a";3 "b";(4 2;"c");*)
regexps         rx/[a-z]/      (see https://pkg.go.dev/regexp/syntax for syntax)
dyadic verbs    : + - * % ! & | < > = ~ , ^ # _ $ ? @ .     (right-associative)
monadic verbs   :: +: -: abs uc error ...
adverbs         / \ ' (alone or after expr. with no space)    (left-associative)
expressions     2*3+414       1+|2 3 45 4 3        +/'(1 2 3;4 5 6) → 6 15
separator       ; or newline except when ignored after {[( and before )]}
variables       x  y.z  f  data  t1  π               (. only allowed in globals)
assign          x:2 (local within lambda, global otherwise)        x::2 (global)
op assign       x+:1 (sugar for x:x+1 or x::x+1)          x-:2 (sugar for x:x-2)
list assign     (x;y;z):e (where 2<#e)         (x;y):1 2;y2
eval. order     apply:f[e1;e2]   apply:e1 op e2                      (e2 before)
                list:(e1;e2)     seq: [e1;e2]     lambda:{e1;e2}     (e1 before)
sequence        [x:2;y:x+3;x*y] → 10        (bracket not following noun tightly)
index/apply     x[y] or x y is sugar for x@y; x[] ~ x[*] ~ x[!#x] ~ x (arrays)
index deep      x[y;z;...] → x.(y;z;...)            (except for x in (?;and;or))
index assign    x[y]:zx:@[x;y;:;z]                      (or . for x[y;...]:z)
index op assign x[y]op:zx:@[x;y;op;z]                         (for symbol op)
lambdas         {x+y-z}[3;5;7] → 1        {[a;b;c]a+b-c}[3;5;7] → 1
                {?[x>1;x*o x-1;1]}5120        (o is recursive self-reference)
projections     +[2;] 35               (2+) 35       (partial application)
compositions    ~0>{~0>x}      -+{- x+y}      *|:{*|x}
index at field  x..a → x["a"]       (.. binds identifiers tightly, interpolable)
field expr.     ..a+b → {x["a"]+x["b"]} (field names without . and not in x,y,z)
                ..p.a+b+q.c → {[p0;x]p0+x["b"]+c}[a;]   (p. projects; q. quotes)
field expr. at  x.. a+b → {x["a"]+x["b"]}[x]                  (same as (..a+b)x)
dict fields     ..[a:e1;b:e2;c] → "a""b""c"!(e1;e2;c)
amend fields    x..[a:e1;b:e2] → @[x;"a""b";:;x..(e1;e2)]
cond            ?[1;2;3] → 2      ?[0;2;3] → 3     ?[0;2;"";3;4] → 4
and/or          and[1;2] → 2    and[1;0;3] → 0    or[0;2] → 2      or[0;0;0] → 0
return          [1;:2;3] → 2                        (a : at start of expression)
try             'x is sugar for ?["e"~@x;:x;x]         (return if it's an error)
log             \x logs a string representation of x        (debug/display tool)
discard         `x discards well-formed x during parsing     (ignore expression)
comments        from line with a single / until line with a single \
                or from / (after space or start of line) to end of line

TYPES HELP
atom    array   name            examples
i       I       integer         0         -2        !5          4 3 -2 5 0i
n       N       number          0.0       1.5       0.0+!5      1.2 3 0n 1e+10
s       S       string          "abc"     "d"       "a" "b" "c"
r               regexp          rx/[a-z]/           rx/\s+/
d               dictionary      "a""b"!1 2          keys!values
f               function        +         {x-1}     2*          %[;2]
h               handle          open"/path/to/file"    "w"open"/path/to/file"
e               error           error"msg"
/               file system     dirfs"/path/to/dir"
        A       generic array   ("a" 1;"b" 2;"c" 3)     (+;-;*;"any")

VERBS HELP
:x  identity    :[42] → 42  (recall that : is also syntax for return and assign)
x:y right       2:33                        "a":"b""b"
+d  swap k/v    +"a""b"!0 10 1!"a" "b"
+x  flip        +(1 2;3 4) → (1 3;2 4)         +42,,42
n+n add         2+35                        2+3 45 6
s+s concat      "a"+"b""ab"                 "a" "b"+"c""ac" "bc"
-n  negate      - 2 3-2 -3                  -(1 2.5;3 4) → (-1.0 -2.5;-3 -4)
-s  rtrim space -"a\tb \r\n" " c d \n""a\tb" " c d"   (Unicode's White Space)
n-n subtract    5-32                        5 4-32 1
s-s trim suffix "file.txt"-".txt""file"
*x  first       *7 8 97                     *"ab""ab"           *(+;*) → +
n*n multiply    2*36                        1 2 3*33 6 9
s*i repeat      "a"*3 2 1 0"aaa" "aa" "a" ""
%X  classify    %7 8 9 7 8 90 1 2 0 1 2     %"a" "b" "a"0 1 0
n%n divide      3%21.5                      3 4%21.5 2.0
s%s glob match  "*.csv"%"data.csv" "code.goal" "dir/data.csv"1 0 0
!i  enum        !50 1 2 3 4                 !-5-5 -4 -3 -2 -1
!s  fields      !"a b\tc\nd \u00a0e""a""b""c""d""e"   (Unicode's White Space)
!I  odometer    !2 3 → (0 0 0 1 1 1;0 1 2 0 1 2)
!d  keys        !"a""b"!1 2"a" "b"
i!n mod/div     3!9 8 70 2 1            -3!9 8 73 2 2
i!s pad fields  3!"a""a  "              -3!"1" "23" "456""  1" " 23" "456"
s!s fields      ",;"!"a,b;c""a""b""c" (fields cut on any of ",;"; ""!s is !s)
X!Y dict        d:"a""b"!1 2; d"a"1             (same as d:..[a:1;b:2]; d..a)
&s  byte-count  &"abc"3                      &"π"2              &"αβγ"6
&I  where       &0 0 1 0 0 0 12 6            &2 30 0 1 1 1
&d  keys where  &"a""b""c""d"!0 1 1 0"b" "c"
x&y min/and     2&32          4&33         "b"&"a""a"           0&10
|X  reverse     |!54 3 2 1 0
x|y max/or      2|33          4|34         "b"|"a""b"           0|11
<d  sort up     <"a""b""c"!2 3 1"c""a""b"!1 2 3
<X  ascend      <3 5 40 2 1           (index permutation for ascending order)
x<y less        2<31          "c"<"a"0                       7 8<6 90 1
>d  sort down   >"a""b""c"!2 3 1"b""a""c"!3 2 1
>X  descend     >3 5 41 2 0          (index permutation for descending order)
x>y more        2>30          "c">"a"1                       7 8>6 91 0
=s  lines       ="ab\ncd\r\nef gh""ab" "cd" "ef gh"
=I  index-count =1 0 0 2 2 3 -1 2 1 1 12 4 3 1
=d  group keys  ="a""b""c"!0 1 0 → ("a" "c";,"b")           ="a""b"!0 -1,,"a"
f=Y group by    (2!)=!10 → (0 2 4 6 8;1 3 5 7 9)
x=y equal       2 3 4=30 1 0                          "ab" = "ba"0
~x  not         ~0 1 21 0 0                           ~"a" "" "0"0 1 0
x~y match       3~31            2 3~3 20           ("a";%)~'("b";%) → 0 1
,x  enlist      ,1,1            #,2 31             (list with one element)
d,d merge       ("a""b"!1 2),"b""c"!3 4"a""b""c"!1 3 4
x,y join        1,21 2                       "ab" "c","d""ab" "c" "d"
^d  sort keys   ^"c""a""b"!1 2 3"a""b""c"!2 3 1
^X  sort        ^3 5 00 3 5                  ^"ca" "ab" "bc""ab" "bc" "ca"
i^s windows     2^"abcde""abcd" "bcde"
i^Y windows     2^!4 → (0 1 2;1 2 3)                   -2^!4 → (0 1;1 2;2 3)
s^s trim        " #"^"  #a ## b#  ""a ## b"         ""^" \na\t b\t""a\t b"
f^y weed out    {0 1 1 0}^4 1 5 34 3                (0<)^2 -3 1,-3
X^t w/o keys &  (,"b";1 0)^..[a:6 7;b:8 9] → (,"a")!,,7
                (0;..a>1;..b<0)^..[a:1 2 3;b:4 -5 6] → "a""b"!(,1;,4)
X^d w/o keys    (,"b")^"a""b""c"!0 1 2"a""c"!0 2
X^Y w/o values  2 3^1 1 2 3 3 41 1 4                          (like in[;X]^Y)
#x  length      #7 8 93        #"ab" "cd"2       #421      #"ab"1
i#y take/repeat 2#6 7 86 7     5#6 7 86 7 8 6 7               3#11 1 1
s#s count       "ab"#"cabdab" "cd" "deab"2 0 1                   ""#"αβγ"4
f#y replicate   {0 1 2 0}#4 1 5 31 5 5              (0<)#2 -3 12 1
X#t w/ keys &   (,"a";0 1)#..[a:6 7;b:8 9] → (,"a")!,,7
                (1;..a>1;..b>0)#..[a:1 2 3;b:4 -5 6] → "a""b"!(,3;,6)
X#d with keys   "a""c""e"#"a""b""c""a"!2 3 4 5"a""c""a"!2 4 5
X#Y with values 2 3#1 1 2 3 3 42 3 3                          (like in[;X]#Y)
_n  floor       _2.32.0                  _1.5 3.71.0 3.0
_s  to lower    _"ABC""abc"              _"AB" "CD" "Π""ab" "cd" "π"
i_s drop bytes  2_"abcde""cde"           -2_"abcde""abc"
i_Y drop        2_3 4 5 65 6             -2_3 4 5 63 4
s_s trim prefix "pfx-"_"pfx-name" "pfx2-name""name" "pfx2-name"
f_Y cut where   {0=3!x}_!10 → (0 1 2;3 4 5;6 7 8;,9)          (same as (&f Y)_Y)
I_s cut string  1 3_"abcdef""bc" "def"                          (I ascending)
I_Y cut         2 5_!10 → (2 3 4;5 6 7 8 9)                        (I ascending)
$x  string      $2 3"2 3"      $"text""\"text\""
i$s cut shape   3$"abcdefghijk""abc" "defg" "hijk"
i$Y cut shape   3$!6 → (0 1;2 3;4 5)             -3$!6 → (0 1 2;3 4 5)
s$y strings     "s"$(1;"c";+) → "1""c""+"
s$s chars/bytes "c"$"aπ"97 960                "b"$"aπ"97 207 128
s$i to string   "c"$97 960"aπ"                "b"$97 207 128"aπ"
s$n cast        "i"$2.32                      @"n"$42"n"
s$s parse i/n   "i"$"42" "0b100"42 4          "n"$"2.5" "1e+20"2.5 1e+20
s$s parse value "v"$qq/(2 3;"a")/ → (2 3;"a")   ($x inverse for types in "inrs")
s$y format      "%.2g"$1 4%3"0.33" "1.3"      "%s=%03d"$"a" 42"a=042"
X$y binsearch   2 3 5 7$8 2 7 5 5.5 3 04 1 4 3 3 2 0            (X ascending)
?i  uniform     ?20.6046602879796196 0.9405090880450124     (between 0 and 1)
?i  normal      ?-2-1.233758177597947 -0.12634751070237293    (mean 0, dev 1)
?X  distinct    ?2 2 4 3 2 32 4 3                   (keeps first occurrences)
i?i roll        5?10010 51 21 51 37
i?Y roll array  5?"a" "b" "c""c" "a" "c" "c" "b"
i?i deal        -5?10019 26 0 73 94                         (always distinct)
i?Y deal array  -3?"a""b""c""a""c""b"     (0i?Y is (-#Y)?Y) (always distinct)
s?r rindex      "abcde"?rx/b../1 3                            (offset;length)
s?s index       "a = a + 1"?"=" "+"2 6
d?y find key    ("a""b"!3 4)?4"b"                    ("a" "b"!3 4)?5""
X?y find        9 8 7?81                              9 8 7?63
@x  type        @2"i"    @1.5"n"    @"ab""s"    @2 3"I"   @(+) → "f"
i@y take/pad    2@6 7 86 7     4@6 7 86 7 8 0      -4@6 7 80 6 7 8
s@i substr      "abcdef"@2"cdef"                                 (s[offset])
r@s match       rx/^[a-z]+$/"abc"1                    rx/\s/"abc"0
r@s find group  rx/([a-z])(.)/"&a+c""a+" "a" "+"      (whole match, group(s))
f@y apply at    (|)@1 22 1            (like |[1 2] → 2 1 or |1 2 or (|).,1 2)
d@y at key      ..[a:6 7;b:8 9]"a"6 7                 (1 2!"a""b")2"b"
t@i at row      ..[a:6 7;b:8 9]0"a""b"!6 8
X@i at          7 8 9@29             7 8 9[2 0] → 9 7            7 8 9@-28
.s  get global  a:3;."a"3
.e  get error   .error"msg""msg"
.d  values      ."a""b"!1 21 2
.X  self-dict   ."a""b""a""b"!"a""b"          .!30 1 2!0 1 2
s.I substr      "abcdef"[2;3] → "cde"                         (s[offset;length])
r.y findN       rx/[a-z]/["abc";2] → "a""b"      rx/[a-z]/["abc";-1] → "a""b""c"
r.y findN group rx/[a-z](.)/["abcdef";2] → ("ab" "b";"cd" "d")
f.y apply       (+).2 35                      +[2;3] → 5
d.y deep at     ..[a:6 7;b:8 9]["a";1] → 7
t.y at row;key  ..[a:6 7;b:8 9][1;"a"] → (,"a")!,7
X.y deep at     (6 7;8 9)[0;1] → 7               (6 7;8 9)[;1] → 7 9
«X  shift       «8 99 0     «"a" "b""b" ""        (ASCII keyword: shift x)
x«Y shift       "a" "b"«1 2 33 "a" "b"
»X  rshift      »8 90 8     »"a" "b""" "a"       (ASCII keyword: rshift x)
x»Y rshift      "a" "b"»1 2 3"a" "b" 1

::[s;y]     set global  ::["a";3];a → 3  (brackets needed because :: is monadic)
@[d;y;f]    amend       @["a""b""c"!7 8 9;"a""b""b";10+] → "a""b""c"!17 28 9
@[X;i;f]    amend       @[7 8 9;0 1 1;10+] → 17 28 9
@[d;y;F;z]  amend       @["a""b""c"!7 8 9;"a";:;42] → "a""b""c"!42 8 9
@[X;i;F;z]  amend       @[7 8 9;1 2 0;+;10 20 -10] → -3 18 29
@[f;y;f]    try at      @[2+;"a";:] → "i+y : bad type \"s\" in y"   (panic case)
                        @[2+;3;:] → 5                            (no-panic case)
.[X;y;f]    deep amend  .[(6 7;8 9);0 1;-] → (6 -7;8 9)
.[X;y;F;z]  deep amend  .[(6 7;8 9);(0 1 0;1);+;10] → (6 27;8 19)
                        .[(6 7;8 9);(*;1);:;42] → (6 42;8 42)
.[f;y;f]    try         .[+;2 "a";:] → "i+y : bad type \"s\" in y"  (panic case)
                        .[+;2 3;:] → 5                           (no-panic case)

NAMED VERBS HELP
abs n      abs value    abs -3.0 -1.5 2.03.0 1.5 2.0
csv s      csv read     csv"a,b\n1,2" → ("a" "1";"b" "2")
csv A      csv write    csv("a" "b";1 2) → "a,1\nb,2\n"
error x    error        r:error"msg"; (@r;.r) → "e" "msg"
eval s     comp/run     a:5;eval"a+2"7           (unrestricted variant of .s)
firsts X   mark firsts  firsts 0 0 2 3 0 2 3 41 0 1 1 0 0 0 1    (same as ¿X)
json s     parse json   json rq`{"a":true,"b":"text"}`"a" "b"!0w "text"
nan n      isNaN        nan(0n;2;sqrt -1) → 1 0 1             nan 2 0i 30 1 0
ocount X   occur-count  ocount 3 4 5 3 4 4 70 0 0 1 1 2 0
panic s    panic        panic"msg"                (for fatal programming-errors)
rx s       comp. regex  rx"[a-z]"       (like rx/[a-z]/ but compiled at runtime)
sign n     sign         sign -3 -1 0 1.5 5-1 -1 0 1 1
uc x       upper/ceil   uc 1.52.0                             uc"abπ""ABΠ"

s csv s    csv read     " "csv"a b\n1 2" → ("a" "1";"b" "2")  (" " as separator)
s csv A    csv write    " "csv("a" "b";1 2) → "a 1\nb 2\n"    (" " as separator)
x in s     contained    "bc" "ac"in"abcd"1 0                    (same as x¿s)
x in Y     member of    2 3 in 8 2 41 0                         (same as x¿Y)
s json y   write json   ""json 1.5 2"[1.5,2]" (indent with s;disable with "")
S json y   write json   like s json y, but with (pfx;indent) for pretty-printing
n nan n    fill NaNs    42.0 nan(1.5;sqrt -1) → 1.5 42.0      42 nan 2 0i2 42
i rotate Y rotate       2 rotate 7 8 99 7 8           -2 rotate 7 8 98 9 7

sub[r;s]   regsub       sub[rx/[a-z]/;"Z"] "aBc""ZBZ"
sub[r;f]   regsub       sub[rx/[A-Z]/;_] "aBc""abc"
sub[s;s]   replace      sub["b";"B"] "abc""aBc"
sub[s;s;i] replaceN     sub["a";"b";2] "aaa""bba"        (stop after 2 times)
sub[S]     replaceS     sub["b" "d" "c" "e"] "abc""ade"
sub[S;S]   replaceS     sub["b" "c";"d" "e"] "abc""ade"

eval[s;loc;pfx]         like eval s, but provide loc as location (usually a
                        path), and prefix pfx+"." for globals; does not eval
                        same location more than once

utf8 s     is UTF-8     utf8 "aπc"1                          utf8 "a\xff"0
s utf8 s   to UTF-8     "b" utf8 "a\xff""ab"       (replace invalid with "b")

MATH: atan[n;n]; cos n; exp n; log n; round n; sin n; sqrt n

ADVERBS HELP
f'x    each      #'(4 5;6 7 8) → 2 3
x F'y  each      2 3#'4 5 → (4 4;5 5 5)      {(x;y;z)}'[1;2 3;4] → (1 2 4;1 3 4)
x I'y  case      (6 7 8 9)0 1 0 1'"a""b""c""d"6 "b" 8 "d"
I A'I  at each   m:3$!9;p:!2 2;(m').p → 0 1 3 4
x F`y  eachleft  1 2,`"a""b" → (1 "a" "b";2 "a" "b")           (same as F[;y]'x)
x F´y  eachright 1 2,´"a""b" → (1 2 "a";1 2 "b")               (same as F[x;]'y)
F/x    fold      +/!1045
F\x    scan      +\!100 1 3 6 10 15 21 28 36 45
x F/y  fold      5 6+/!411 12                     {x+y-z}/[5;4 3;2 1] → 9
x F\y  scan      5 6+\!4 → (5 6;6 7;8 9;11 12)       {x+y-z}\[5;4 3;2 1] → 7 9
i f/y  do        3(2*)/432
i f\y  dos       3(2*)\44 8 16 32
f f/y  while     (100>)(2*)/4128
f f\y  whiles    (100>)(2*)\44 8 16 32 64 128
f/x    converge  {1+1.0%x}/11.618033988749895     {-x}/1-1
f\x    converges (-2!)\1010 5 2 1 0               {-x}\11 -1
s/S    join      ","/"a" "b" "c""a,b,c"
s\s    split     ","\"a,b,c""a" "b" "c"           ""\"aπc""a" "π" "c"
r\s    split     rx/[,;]/\"a,b;c,d""a" "b" "c" "d"
i s\s  splitN    (2)","\"a,b,c""a" "b,c"
i r\s  splitN    (3)rx/[,;]/\"a,b;c,d""a" "b" "c,d"
I/x    decode    24 60 60/1 2 33723               2/1 1 06
I\x    encode    24 60 60\37231 2 3               2\61 1 0

TIME HELP
time cmd              time command with current time
cmd time t            time command with time t
time[cmd;t;fmt]       time command with time t in given format
time[cmd;t;fmt;loc]   time command with time t in given format and location

Time t should consist either of integers or strings in the given format ("unix"
is the default for integers and RFC3339 layout "2006-01-02T15:04:05Z07:00" is
the default for strings), with optional location (default is "UTC"). See
https://pkg.go.dev/time for information on layouts and locations, as Goal uses
the same conventions as Go's time package.  Supported values for cmd are as
follows:

    cmd (s)       result (type)                                 fmt
    -------       -------------                                 ---
    "clock"       hour, minute, second (I)
    "date"        year, month, day (I)                          yes
    "day"         day number (i)
    "hour"        0-23 hour (i)
    "minute"      0-59 minute (i)
    "month"       0-12 month (i)
    "second"      0-59 second (i)
    "unix"        unix epoch time (i)                           yes
    "unixmicro"   unix (microsecond version) (i)                yes
    "unixmilli"   unix (millisecond version) (i)                yes
    "unixnano"    unix (nanosecond version) (i)                 yes
    "week"        year, week (I)
    "weekday"     0-7 weekday starting from Sunday (i)
    "year"        year (i)
    "yearday"     1-365/6 year day (i)
    "zone"        name, offset in seconds east of UTC (s;i)
    format (s)    format time using given layout (s)            yes

RUNTIME HELP
rt.get s        returns various kinds of runtime information depending on s:
                "!"   names of globals (S)
                "g"   dict with copy of all globals (d)
                "f"   same but only globals containing functions (d)
                "v"   same but only non-function globals (d)
rt.get["@";x]   dict with internal info about x        (for debug purposes only)
rt.log x        like :[x] but logs string representation of x       (same as \x)
rt.seed i       set non-secure pseudo-rand seed to i        (used by the ? verb)
rt.time[s;i]    eval s for i times (default 1), return average time (ns)
rt.time[f;x;i]  call f. x for i times (default 1), return average time (ns)
rt.try[f;y;f]   same as .[f;y;f] but the handler receives an error dict
                ..[msg:s;err:s] where msg contains the whole error stack trace

IO/OS HELP
chdir s     change current working directory to s, or return an error
close h     flush any buffered data, then close handle h
dirfs s     return a read-only file system value, rooted at directory s, usable
            as left argument in glob, open, read, stat
env s       get environment variable s, or an error if unset
            return a dict representing the whole environment if s~""
flush h     flush any buffered data for handle h
glob s      return file names matching glob pattern s
import s    read/eval wrapper roughly equivalent to eval[read path;path;pfx]
            where 1) path~s or path~env["GOALLIB"]+s+".goal"
                  2) pfx is path's basename without extension
mkdir s     create new directory named s (parent must already exist)
open s      open path s for reading, returning a handle (h)
print s     print"Hello, world!\n"      (uses implicit $x for non-string values)
read h      read from handle h until EOF or an error occurs
read s      read file named s into string         lines:=-read"/path/to/file"
            or dict ..[dir:I;name:S] if s is a directory
remove s    remove the named file or empty directory
run s       run command s or S (with arguments)   run"pwd"          run"ls" "-l"
            inherits stdin and stderr, returns its standard output or an error
            dict ..[msg:s;code:i;out:s]
say s       same as print, but appends a newline                    say!5
shell s     same as run, but through "/bin/sh" (unix systems only)  shell"ls -l"
stat x      returns dict ..[dir:i;mtime:i;size:i]   (for filehandle h or path s)

x env s     set environment variable x to s, or return an error
x env 0     unset environment variable x, or clear environment if x~""
x import s  same as import s, but using prefix x for globals
x open s    open path s with mode x in "r" "w" "a"      (file read/write/append)
            or pipe from or to command s or S with "pr" "pw"   (pipe read/write)
            (synonymous modes: "<" ">" ">>" "-|" "|-")
x print s   print s to handle/name x               "/path/to/file"print"content"
i read h    read i bytes from reader h or until EOF, or an error occurs
s read h    read from reader h until 1-byte s, EOF, or an error occurs
x rename y  renames (moves) old path x (s) to new path y (s)
x run s     same as run s but with input string x as stdin
x say s     same as print, but appends a newline

ARGS        command-line arguments, starting with script name
STDIN       standard input filehandle (buffered)
STDOUT      standard output filehandle (buffered)
STDERR      standard error filehandle (buffered)