123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #comment -[
- This module contains general purpose operations that are frequently
- used in the language.
- Copyright (C) 2007-2010 Dennis Furey]-
- #import nat
- #library+
- #export+
- #import cor
- characters = -<& %cI*~ upto 8
- letters = -- (take/26)^~(skip/97,skip/65) characters
- digits = '0123456789'
- gpl = # takes a version number as a character string
- -[This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version -[.~&?\'3'! ~&iNC]-.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA]-
- #optimize+
- command_line :: files _file%L options _option%L
- file :: stamp %sbU path %sL preamble %sL contents %sLxU
- option :: position %n longform %b keyword %s parameters %sL
- invocation :: command _command_line environs %sm
- # first order
- choices = ^(iota@r,~&l); leql@a^& ~&al?\&! ~&arh2fabt2RDfalrtPXPRT
- closure = ^= ^Ts\~& *=iiD ^D/~&rl @rlX ~&r*+ ~| ~&lrPrlPE
- cross = -**=+ *-
- cuts = @rlX ~&al^?\~&arrNCNCB ^|Darl2falrrPXPRDSL/~& ^|D/predecessor @NiXNC ~&hr->txtlxPrXS ~&hrhPlCrtPXPiC
- enum = ~&ddvDlrdPErvPrNCQSL2Vo+ %-U:-0+ %-u*
- eql = ~&alParPfabt2RBarZPq
- gcp = ~&al^&~&arPalhPrhPEPalh2fabt2RCBB
- indexable = ~&l&&~&all2alr2fallPrXPRfalrPrXPRBarPfabl2RBQalr2arPfabr2RBalPQq
- intersecting = ~&ar^& ~&arhPlw!| ~&falrtPXPR
- iol = ~&NiX; ~&r->lx ^\~&rt ~&l; :^\~& ~&i&& successor+ ~&h
- leql = ~&alZ^!~&arPfabt2RB
- lleq = ~&alParPallPrlPEPfabr2Rfabl2RQNQNNXq
- num = ^p\~& iol
- permutations = ~&itB^?a\~&aNC @ahPfatPRD *= refer ^C/~&a ~&ar&& ~&arh2falrtPXPRD
- powerset = -<&+ ~&rFlSPS+ zipp0^*D/~& iota+ ~&NSNNXNCT
- singly_branched = ~&aalParPNfalPRQfarPRQNNXq
- skip = ~&alrB^?\~&ar ^R/~&f ^/~&ahPatPNatPCBNNXfatPRCq+~&al ~&art
- subset = *-; all -=
- substring = ^!~&arPfalrtPXPRB [=+ ~&a
- suffix = [=+~&bx
- take = ~&alrB^& :^/~&arh ^R/~&f ^\~&art ~&ahPatPNatPCBNNXfatPRCq+ ~&al
- upto = ~&\<<0>>; ~&l->xrLPO ^/~&ahPatPNatPCBNNXfatPRCq+~&l ^lLPrC\~&r cross*rrxPp
- zip = ~&alrB^?/~&abh2fabt2RC ~&alrY&& <'bad zip'>!%
- zipt = ~&alrB^&~&abh2fabt2RC
- # second order
- all = ~&a^?\&!+ &&~&fatPR+ ~&ah;
- all_same = ~&aatPBZ^!~&ahthPEPfatPRB++ *
- any = ~&a^&+ !|~&fatPR+ ~&ah;
- arc = choice+ !*
- associate_left = ~&i&&+ ~&t?\~&h+ ~&x;+ <:~&ahPatt2fatPRath2QX+ ~&rlX;
- border = +^|(~&,*)=>+ (^CihNCT\~&+ @h)*+ (*)|\x+ 0!!*+ iota
- both = ~&B++ ~~
- case = gcase ==
- cases = gcase -=
- choice = ^H\~&+ mtwist..u_enum++ !
- dot = "s". "f". * file$[stamp: &!,path: ~&iNC+ --(:/`. "s")+ ~&n,contents: "f"+ ~&m]
- either = ~&Y++ ~~
- fused = +^/~& ~&iNH; //~&; //+ ~&al^?\~&arlrY ~&fallPrbl2XlrPrbr2XXPW+ ~&falPbrlYPalrGPOXJ # record constructor
- gang = (^)=>0!
- gdif = ~&rlD;+ ~&r*++ *~+ not+ ~&rlD;+ any
- gint = ~&rlD;+ ~&r*++ *~+ ~&rlD;+ any
- gldif "r" = ~&al^& ~&alPfarPRT^J/~&f ~&a; ~&ar^?\~&alhPNCltPrXX "r"?abh/~&Nabt2X ~&rlPrrl2lrrr2CXXarh2falrtPXPRXO
- glimit = "f". ~&iNC; ~&htwZ->h ^("f"+ ~&h,~&); :^/~&l ^(weight+~&l,~&r); ~| nleq^\~&l weight+ ~&r
- glint "r" = ~&al^& ~&alPfarPRT^J/~&f ~&a; ~&ar^?\~&NaltPrXPX "r"?abh/~&alhPNCbtPX ~&rlPrrl2lrrr2CXXarh2falrtPXPRXO
- lesser = "r". "r"?/~&l ~&r
- mat = ~&i&&+ ~&t++ *=+ //:
- neither = ~&lNrZQ++ ~~
- not = ~&\&!+ ~&\0!
- ordered = ~&aatPBZ^!+ &&~&fatPR+ ~&ahthPX;
- pad = "p". ~&i&& ~&rSS+ zipp"p"^*D\~& leql$^
- psort = ~&?\~&! -<+ ~&at^?\~&ah +^(~&rlrE?\~&rl+ ~&l;+ ~&fatPR,^/~&+ ~&irlXX;+ ~~+ ~&ah)
- rlc = ~&a^&+ ~&at?\~&aNC+ ~&ahthPX;; \/? ~&/~&lrhPCrtPCahPfatPRXO ~&ahPNCfatPRC
- sep = ~&a^?\&!+ \/?=ah ~&/~&NfatPRC ~&lrhPCrtPCahPfatPRXO
- skipwhile = ->~&t+ ~&i&&+ ~&h;
- stochasm = ^H\~&+ mtwist..w_enum++ !+ * ^/~&m ~&n; %nI?\~& math..strtod+ ~&h+ %nP
- takewhile = ~&a^&+ &&~&ahPfatPRC+ ~&ah;
- words = "n". "a". ~&rlrK0liNCSPQ=>0 "a"!* iota"n"
- zipp = "p". ~&al^?(~&ar?/~&abh2fabt2RC *-"p"+ ~&al,~&ar&& "p"-*+ ~&ar)
- block =
- iota7?<(
- iota; ~&t?\~&iNCS! ~&a!*; ~&NiC|\; ^?^/-&&- ~&\~&aaNCB+ ^^(gang+ .\*&h,recur/&f+ ~&z),
- ~&a^&+ ~&alPfarPRC^J/~&f+ ~&a;+ //~&alrBPlrlPCrrPXarh2fabt2RXONarPXq+ 0!*+ iota)
- rep "n" =
- nleq$-+ <.
- "f". -++- "f"!* iota "n",
- "f". ~&/(0!* iota "n"); ~&l->r ^|\"f" ~<,
- "f". ~&/"n"; ~&l->r ^|\"f" ~&ahPatPNatPCBNNXfatPRCq>
- swin = # takes a number n to a function enumerating all length n sublists of a list
- iota8?< ~&\("n". ~&r->lx~&lht2rhPNCTlCrtPX+ ~&lNrXX/"n"; ~&lrrPB->rlxPNCrX ^|/~&ahPatPNatPCBNNXfatPRCq ~&rhPlCrtPX) -+
- +^(~&xSNX;+ ~&K7x++ ~+ --<0,0>+ ~&all2arlrPXPNfalrPrXPRXqNX*arPNfarPRXaNXqSxp,~&NiX;+ ~+ ~&=>&l+ ~&NiXS),
- ~&NNXiX; ~&r->lxt ^|/~&NhCiC ~&ahPatPNatPCBNNXfatPRCq+-
- next =
- ~&?(
- ~&ahPatPNatPCBNNXfatPRCq; "n". "f". "x". ~&x (rep"n" :^\~& "f"+ ~&h) <"x">,
- ! "f". "x". ~&wZ->tx(:^/"f"+~&h ~&) <"x">)
- lsm = # takes a set to its logarithmic-time membership predicate
- ~&?\0!! ^w/~&+ @NiX (leql/8+ length)^?ar\!@ar (&&^|\~& ~)=>^lrNCT(~&alryPlj,?^/~@alrz ~&fallrTPrGPW)^|J/~& -+
- ^(^|/~&l ~&a^& :/&+ ~&l?a/~&falPRiNXS ~&farPRNiXS,^H\~&lr !=+ ~@r),
- ^/~& @r (nleq+ weight~~)$-+ ^HZ(all_same+ ~@r,~&l)~|^/~& @alrBPfabbIPWNqK21 ~&a^?\<&>! ~&WliNXSPrNiXSPT+-
- # higher order
- gcase = # generalized case statement, takes a recognizing predicate to a case statement constructor
- ~&lZrB?^(
- ~&al^?\~&ar++ ?^\^(~&alhr,~&faltPrXPR)++ ~&alhl;++ !;++ ///+ ^;+ //+,
- ^\~&;+ ;;+ ;+ ~&al^?\-+~&r;,~&ar+-+ ?^\^(~&r;+ ~&alhr,~&faltPrXPR)+ ~&alhl;+ !;+ ~&/~&l;+ ^;+ //+)
|