diff options
Diffstat (limited to '')
| -rw-r--r-- | stdlib/source/lux/target/common-lisp.lux | 45 | ||||
| -rw-r--r-- | stdlib/source/lux/tool/compiler/phase/generation/common-lisp/case.lux | 38 | 
2 files changed, 33 insertions, 50 deletions
| diff --git a/stdlib/source/lux/target/common-lisp.lux b/stdlib/source/lux/target/common-lisp.lux index eb7e78d01..ad3d9be8f 100644 --- a/stdlib/source/lux/target/common-lisp.lux +++ b/stdlib/source/lux/target/common-lisp.lux @@ -50,7 +50,7 @@         (`` (abstract: #export <brand> {} Any))         (`` (type: #export <type> (<super> <brand>))))] -    [Tag Code] +    [Label Code]      [Literal Expression]      [Var/1 Var]      [Var/* Input] @@ -64,10 +64,18 @@      Literal      (:abstraction "()")) +  (template [<prefix> <name>] +    [(def: #export <name> +       (-> Text Literal) +       (|>> (format <prefix>) :abstraction))] +     +    ["'" symbol] +    [":" keyword]) +    (def: #export bool      (-> Bit Literal)      (|>> (case> #0 ..nil -                #1 (:abstraction "t")))) +                #1 (..symbol "t"))))    (def: #export int      (-> Int Literal) @@ -129,14 +137,6 @@           (text.enclose' text.double-quote)           :abstraction)) -  (template [<name> <prefix>] -    [(def: #export <name> -       (-> Text Literal) -       (|>> (format <prefix>) :abstraction))] - -    [symbol "'"] -    [keyword ":"]) -    (def: #export var      (-> Text Var/1)      (|>> :abstraction)) @@ -401,24 +401,17 @@      [conditional+ "#+"]      [conditional- "#-"]) -  (def: #export tag -    (-> Text Tag) +  (def: #export label +    (-> Text Label)      (|>> :abstraction)) -  (def: #export (go tag) -    (-> Tag (Expression Any)) -    (..form (list (..var "go") (:transmutation tag)))) - -  (def: #export (tagbody main tagged) -    (-> (Expression Any) -        (List [Tag (Expression Any)]) -        (Computation Any)) -    (|> tagged -        (list@map (function (_ [tag then]) -                    (list (:transmutation tag) then))) -        list@join -        (list& (..var "tagbody") main) -        ..form)) +  (def: #export (block name body) +    (-> Label (Expression Any) (Computation Any)) +    (..form (list (..var "block") (:transmutation name) body))) + +  (def: #export (return-from target value) +    (-> Label (Expression Any) (Computation Any)) +    (..form (list (..var "return-from") (:transmutation target) value)))    (def: #export (cond clauses else)      (-> (List [(Expression Any) (Expression Any)]) (Expression Any) (Computation Any)) diff --git a/stdlib/source/lux/tool/compiler/phase/generation/common-lisp/case.lux b/stdlib/source/lux/tool/compiler/phase/generation/common-lisp/case.lux index 144c0236e..dd5b89e38 100644 --- a/stdlib/source/lux/tool/compiler/phase/generation/common-lisp/case.lux +++ b/stdlib/source/lux/tool/compiler/phase/generation/common-lisp/case.lux @@ -69,7 +69,6 @@  (def: @cursor (_.var "lux_pm_cursor"))  (def: @temp (_.var "lux_pm_temp"))  (def: @variant (_.var "lux_pm_variant")) -(def: @return (_.var "lux_pm_return"))  (def: (push! value)    (-> (Expression Any) (Expression Any)) @@ -93,11 +92,10 @@        (_.setq @cursor (_.car/1 @savepoint))        (_.setq @savepoint (_.cdr/1 @savepoint)))) -(def: fail-tag (_.tag "lux_pm_fail")) -(def: done-tag (_.tag "lux_pm_done")) +(def: @fail (_.label "lux_pm_fail")) +(def: @done (_.label "lux_pm_done")) -(def: fail! (_.go ..fail-tag)) -(def: return! (_.go ..done-tag)) +(def: fail! (_.return-from ..@fail _.nil))  (exception: #export unrecognized-path) @@ -126,23 +124,18 @@  (def: (alternation pre! post!)    (-> (Expression Any) (Expression Any) (Expression Any)) -  (_.tagbody ($_ _.progn -                 ..save! -                 pre!) -             (list [fail-tag -                    ($_ _.progn -                        ..restore! -                        post!)]))) +  (_.progn (<| (_.block ..@fail) +               (_.progn ..save!) +               pre!) +           ($_ _.progn +               ..restore! +               post!)))  (def: (pattern-matching' generate pathP)    (-> Phase Path (Operation (Expression Any)))    (.case pathP      (^ (/////synthesis.path/then bodyS)) -    (do ////.monad -      [bodyG (generate bodyS)] -      (wrap ($_ _.progn -                (_.setq @return bodyG) -                ..return!))) +    (:: ////.monad map (_.return-from ..@done) (generate bodyS))      #/////synthesis.Pop      (////@wrap ..pop!) @@ -204,13 +197,10 @@    (-> Phase Path (Operation (Expression Any)))    (do ////.monad      [pattern-matching! (pattern-matching' generate pathP)] -    (wrap ($_ _.progn -              (_.tagbody pattern-matching! -                         (list [..fail-tag -                                (_.error/1 (_.string "Invalid expression for pattern-matching."))] -                               [..done-tag -                                _.nil])) -              @return)))) +    (wrap (_.block ..@done +                   (_.progn (_.block ..@fail +                                     pattern-matching!) +                            (_.error/1 (_.string case.pattern-matching-error)))))))  (def: #export (case generate [valueS pathP])    (-> Phase [Synthesis Path] (Operation (Expression Any))) | 
