(.module: lux (lux (control [monad #+ do] ["ex" exception #+ exception:] ["p" parser]) (data ["e" error] [text] text/format [number] (coll [list "list/" Functor] (dictionary ["dict" unordered #+ Dict]))) [macro #+ with-gensyms] (macro [code] ["s" syntax #+ syntax:]) [host]) (luxc ["&" lang] (lang ["la" analysis] ["ls" synthesis] (host ["_" php #+ Expression Statement]))) [///] (/// [".T" runtime] [".T" case] [".T" function] [".T" loop])) ## [Types] (type: #export Translator (-> ls.Synthesis (Meta Expression))) (type: #export Proc (-> Translator (List ls.Synthesis) (Meta Expression))) (type: #export Bundle (Dict Text Proc)) (syntax: (Vector {size s.nat} elemT) (wrap (list (` [(~+ (list.repeat size elemT))])))) (type: #export Nullary (-> (Vector +0 Expression) Expression)) (type: #export Unary (-> (Vector +1 Expression) Expression)) (type: #export Binary (-> (Vector +2 Expression) Expression)) (type: #export Trinary (-> (Vector +3 Expression) Expression)) (type: #export Variadic (-> (List Expression) Expression)) ## [Utils] (def: #export (install name unnamed) (-> Text (-> Text Proc) (-> Bundle Bundle)) (dict.put name (unnamed name))) (def: #export (prefix prefix bundle) (-> Text Bundle Bundle) (|> bundle dict.entries (list/map (function (_ [key val]) [(format prefix " " key) val])) (dict.from-list text.Hash))) (def: (wrong-arity proc expected actual) (-> Text Nat Nat Text) (format "Wrong number of arguments for " (%t proc) "\n" "Expected: " (|> expected nat-to-int %i) "\n" " Actual: " (|> actual nat-to-int %i))) (syntax: (arity: {name s.local-symbol} {arity s.nat}) (with-gensyms [g!_ g!proc g!name g!translate g!inputs] (do @ [g!input+ (monad.seq @ (list.repeat arity (macro.gensym "input")))] (wrap (list (` (def: #export ((~ (code.local-symbol name)) (~ g!proc)) (-> (-> (..Vector (~ (code.nat arity)) Expression) Expression) (-> Text ..Proc)) (function ((~ g!_) (~ g!name)) (function ((~ g!_) (~ g!translate) (~ g!inputs)) (case (~ g!inputs) (^ (list (~+ g!input+))) (do macro.Monad [(~+ (|> g!input+ (list/map (function (_ g!input) (list g!input (` ((~ g!translate) (~ g!input)))))) list.concat))] ((~' wrap) ((~ g!proc) [(~+ g!input+)]))) (~' _) (macro.fail (wrong-arity (~ g!name) +1 (list.size (~ g!inputs)))))))))))))) (arity: nullary +0) (arity: unary +1) (arity: binary +2) (arity: trinary +3) (def: #export (variadic proc) (-> Variadic (-> Text Proc)) (function (_ proc-name) (function (_ translate inputsS) (do macro.Monad [inputsI (monad.map @ translate inputsS)] (wrap (proc inputsI)))))) ## [Procedures] ## ## [[Lux]] ## (def: (lux//is [leftO rightO]) ## Binary ## (_.is leftO rightO)) ## (def: (lux//if [testO thenO elseO]) ## Trinary ## (caseT.translate-if testO thenO elseO)) ## (def: (lux//try riskyO) ## Unary ## (runtimeT.lux//try riskyO)) ## (def: (lux//noop valueO) ## Unary ## valueO) ## (exception: #export (Wrong-Syntax {message Text}) ## message) ## (def: #export (wrong-syntax procedure args) ## (-> Text (List ls.Synthesis) Text) ## (format "Procedure: " procedure "\n" ## "Arguments: " (%code (code.tuple args)))) ## (def: lux//loop ## (-> Text Proc) ## (function (_ proc-name) ## (function (_ translate inputsS) ## (case (s.run inputsS ($_ p.seq s.nat (s.tuple (p.many s.any)) s.any)) ## (#e.Success [offset initsS+ bodyS]) ## (loopT.translate-loop translate offset initsS+ bodyS) ## (#e.Error error) ## (&.throw Wrong-Syntax (wrong-syntax proc-name inputsS))) ## ))) ## (def: lux//recur ## (-> Text Proc) ## (function (_ proc-name) ## (function (_ translate inputsS) ## (loopT.translate-recur translate inputsS)))) ## (def: lux-procs ## Bundle ## (|> (dict.new text.Hash) ## (install "noop" (unary lux//noop)) ## (install "is" (binary lux//is)) ## (install "try" (unary lux//try)) ## (install "if" (trinary lux//if)) ## (install "loop" lux//loop) ## (install "recur" lux//recur) ## )) ## ## [[Bits]] ## (do-template [ ] ## [(def: ( [subjectO paramO]) ## Binary ## ( paramO subjectO))] ## [bit//and _.bit-and] ## [bit//or _.bit-or] ## [bit//xor _.bit-xor] ## ) ## (def: (bit//shift-left [subjectO paramO]) ## Binary ## (|> (_.bit-shl paramO subjectO) ## runtimeT.bit//64)) ## (do-template [ ] ## [(def: ( [subjectO paramO]) ## Binary ## ( paramO subjectO))] ## [bit//shift-right _.bit-shr] ## [bit//unsigned-shift-right runtimeT.bit//shift-right] ## ) ## (def: bit-procs ## Bundle ## (<| (prefix "bit") ## (|> (dict.new text.Hash) ## (install "count" (unary runtimeT.bit//count)) ## (install "and" (binary bit//and)) ## (install "or" (binary bit//or)) ## (install "xor" (binary bit//xor)) ## (install "shift-left" (binary bit//shift-left)) ## (install "unsigned-shift-right" (binary bit//unsigned-shift-right)) ## (install "shift-right" (binary bit//shift-right)) ## ))) ## ## [[Arrays]] ## (def: (array//new sizeO) ## Unary ## (|> _.none ## list _.list ## (_.* sizeO))) ## (def: (array//get [arrayO idxO]) ## Binary ## (runtimeT.array//get arrayO idxO)) ## (def: (array//put [arrayO idxO elemO]) ## Trinary ## (runtimeT.array//put arrayO idxO elemO)) ## (def: (array//remove [arrayO idxO]) ## Binary ## (runtimeT.array//put arrayO idxO _.none)) ## (def: array-procs ## Bundle ## (<| (prefix "array") ## (|> (dict.new text.Hash) ## (install "new" (unary array//new)) ## (install "get" (binary array//get)) ## (install "put" (trinary array//put)) ## (install "remove" (binary array//remove)) ## (install "size" (unary _.length)) ## ))) ## ## [[Numbers]] ## (host.import java/lang/Double ## (#static MIN_VALUE Double) ## (#static MAX_VALUE Double)) ## (do-template [ ] ## [(def: ( _) ## Nullary ## ( ))] ## [frac//smallest Double::MIN_VALUE _.float] ## [frac//min (f/* -1.0 Double::MAX_VALUE) _.float] ## [frac//max Double::MAX_VALUE _.float] ## ) (do-template [ ] [(def: ( _) Nullary )] [int//min (|> (_.int -2) (_.** (_.int 63)))] [int//max (|> (_.int 2) (_.** (_.int 63)) (_.- (_.int 1)))] ) ## (do-template [