From 290de8ebcb7edc92877f2ccc333171214e5eae23 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Sun, 6 Feb 2022 03:15:39 -0400 Subject: Finishing the meta-compiler [Part 1] --- stdlib/source/program/aedifex/command/build.lux | 86 ++++++++++++------------ stdlib/source/program/aedifex/command/deps.lux | 2 +- stdlib/source/program/aedifex/format.lux | 51 +++++++++------ stdlib/source/program/aedifex/parser.lux | 79 +++++++++++++--------- stdlib/source/program/aedifex/profile.lux | 87 ++++++++++++++----------- stdlib/source/program/compositor.lux | 2 +- 6 files changed, 173 insertions(+), 134 deletions(-) (limited to 'stdlib/source/program') diff --git a/stdlib/source/program/aedifex/command/build.lux b/stdlib/source/program/aedifex/command/build.lux index ba461d461..8570207be 100644 --- a/stdlib/source/program/aedifex/command/build.lux +++ b/stdlib/source/program/aedifex/command/build.lux @@ -1,6 +1,6 @@ (.using [library - [lux "*" + [lux {"-" Lux} ["[0]" ffi {"+" import:}] [abstract [order {"+" Order}] @@ -20,12 +20,13 @@ ["[0]" dictionary {"+" Dictionary}] ["[0]" set]]] [math - [number + [number {"+" hex} ["n" nat] ["i" int]]] [tool [compiler [meta + ["[0]" cli] ["[0]" packager ["[0]_[1]" ruby]]]]] [world @@ -68,17 +69,17 @@ Name )] - ["lux-jvm" jvm_compiler_name] - ["lux-js" js_compiler_name] - ["lux-python" python_compiler_name] - ["lux-lua" lua_compiler_name] - ["lux-ruby" ruby_compiler_name] + ["lux-jvm" jvm_lux_name] + ["lux-js" js_lux_name] + ["lux-python" python_lux_name] + ["lux-lua" lua_lux_name] + ["lux-ruby" ruby_lux_name] ) -(exception: .public no_available_compiler) +(exception: .public no_available_lux) (exception: .public no_specified_program) -(type: .public Compiler +(type: .public Lux (Variant {#JVM Dependency} {#JS Dependency} @@ -92,27 +93,27 @@ (list.only (|>> product.left (same? dependency) not)) (dictionary.of_list ///dependency.hash))) -(def: (compiler resolution compiler_dependency) - (-> Resolution Dependency (Try [Resolution Compiler])) - (let [[[compiler_group compiler_name compiler_version] compiler_type] compiler_dependency] - (case (..dependency_finder compiler_group compiler_name resolution) +(def: (lux resolution lux_dependency) + (-> Resolution Dependency (Try [Resolution Lux])) + (let [[[lux_group lux_name lux_version] lux_type] lux_dependency] + (case (..dependency_finder lux_group lux_name resolution) {.#Some dependency} - (case compiler_name + (case lux_name (^template [ ] [(^ (static )) {try.#Success [(..remove_dependency dependency resolution) { dependency}]}]) - ([#JVM ..jvm_compiler_name] - [#JS ..js_compiler_name] - [#Python ..python_compiler_name] - [#Lua ..lua_compiler_name] - [#Ruby ..ruby_compiler_name]) + ([#JVM ..jvm_lux_name] + [#JS ..js_lux_name] + [#Python ..python_lux_name] + [#Lua ..lua_lux_name] + [#Ruby ..ruby_lux_name]) _ - (exception.except ..no_available_compiler [])) + (exception.except ..no_available_lux [])) _ - (exception.except ..no_available_compiler [])))) + (exception.except ..no_available_lux [])))) (def: (path fs home dependency) (All (_ !) (-> (file.System !) Path Dependency Path)) @@ -266,7 +267,7 @@ runtime))) (def: .public (do! console program fs shell resolution) - (-> (Console Async) (Program Async) (file.System Async) (Shell Async) Resolution (Command [Exit Compiler Path])) + (-> (Console Async) (Program Async) (file.System Async) (Shell Async) Resolution (Command [Exit Lux Path])) (function (_ profile) (let [target (value@ ///.#target profile)] (case (value@ ///.#program profile) @@ -279,32 +280,33 @@ .let [home (# program home) working_directory (# program directory)]] (do ///action.monad - [[resolution compiler] (async#in (..compiler resolution (value@ ///.#compiler profile))) + [[resolution lux] (async#in (..lux resolution (value@ ///.#lux profile))) .let [host_dependencies (..host_dependencies fs home resolution) - [[command compiler_params] output] (case compiler - {#JVM dependency} - [(|> (value@ ///.#java profile) - (with@ ///runtime.#parameters (list "program._")) - (with_jvm_class_path {.#Item (..path fs home dependency) host_dependencies})) - "program.jar"] - - (^template [ ] - [{ dependency} - [(|> dependency - (..path fs home) - (///runtime.for (value@ profile))) - ]]) - ([#JS ///.#js "program.js"] - [#Python ///.#java "program.py"] - [#Lua ///.#java "program.lua"] - [#Ruby ///.#java (file.rooted fs "program" ruby_packager.main_file)])) + [[command lux_params] output] (case lux + {#JVM dependency} + [(|> (value@ ///.#java profile) + (with@ ///runtime.#parameters (list "program._")) + (with_jvm_class_path {.#Item (..path fs home dependency) host_dependencies})) + "program.jar"] + + (^template [ ] + [{ dependency} + [(|> dependency + (..path fs home) + (///runtime.for (value@ profile))) + ]]) + ([#JS ///.#js "program.js"] + [#Python ///.#java "program.py"] + [#Lua ///.#java "program.lua"] + [#Ruby ///.#java (file.rooted fs "program" ruby_packager.main_file)])) / (# fs separator) cache_directory (format working_directory / target)] _ (console.write_line ..start console) - .let [full_parameters (list.together (list compiler_params + .let [full_parameters (list.together (list lux_params (list "build") (..plural "--library" (..libraries fs home resolution)) (..plural "--host_dependency" host_dependencies) + (..plural "--compiler" (list#each cli.compiler_format (value@ ///.#compilers profile))) (..plural "--source" (set.list (value@ ///.#sources profile))) (..singular "--target" cache_directory) (..singular "--module" program_module)))] @@ -320,5 +322,5 @@ ..failure) console)] (in [exit - compiler + lux (format cache_directory / output)]))))))) diff --git a/stdlib/source/program/aedifex/command/deps.lux b/stdlib/source/program/aedifex/command/deps.lux index 4e32a73b1..85c6fbb57 100644 --- a/stdlib/source/program/aedifex/command/deps.lux +++ b/stdlib/source/program/aedifex/command/deps.lux @@ -42,7 +42,7 @@ (do async.monad [.let [dependencies (|> (value@ ///.#dependencies profile) set.list - {.#Item (value@ ///.#compiler profile)})] + {.#Item (value@ ///.#lux profile)})] [local_successes local_failures cache] (///dependency/resolution.all console (list local) new_repository diff --git a/stdlib/source/program/aedifex/format.lux b/stdlib/source/program/aedifex/format.lux index 8f3e63706..54e1ed57f 100644 --- a/stdlib/source/program/aedifex/format.lux +++ b/stdlib/source/program/aedifex/format.lux @@ -1,22 +1,26 @@ (.using - [library - [lux "*" - [data - ["[0]" text ("[1]#[0]" equivalence)] - [collection - ["[0]" dictionary {"+" Dictionary}] - ["[0]" list ("[1]#[0]" monad)] - ["[0]" set {"+" Set}]]] - [macro - ["[0]" code] - ["[0]" template]]]] - ["[0]" // "_" - ["/" profile] - ["[1][0]" runtime {"+" Runtime}] - ["[1][0]" project {"+" Project}] - ["[1][0]" dependency {"+" Dependency}] - ["[1][0]" artifact {"+" Artifact} - ["[1]/[0]" type]]]) + [library + [lux "*" + [data + ["[0]" text ("[1]#[0]" equivalence)] + [collection + ["[0]" dictionary {"+" Dictionary}] + ["[0]" list ("[1]#[0]" monad)] + ["[0]" set {"+" Set}]]] + [macro + ["[0]" code] + ["[0]" template]] + [tool + [compiler + [meta + [cli {"+" Compiler}]]]]]] + ["[0]" // "_" + ["/" profile] + ["[1][0]" runtime {"+" Runtime}] + ["[1][0]" project {"+" Project}] + ["[1][0]" dependency {"+" Dependency}] + ["[1][0]" artifact {"+" Artifact} + ["[1]/[0]" type]]]) (type: .public (Format a) (-> a Code)) @@ -141,6 +145,14 @@ (` [(~ (code.text program)) (~+ (list#each code.text parameters))])) +(def: (compiler [definition parameters]) + (Format Compiler) + (` [(~ (code.symbol definition)) + (~+ (list#each code.text parameters))])) + +(def: .public lux_compiler_label + "lux") + (def: (profile value) (Format /.Profile) (`` (|> ..empty @@ -149,7 +161,8 @@ (..on_maybe "info" (value@ /.#info value) ..info) (..on_set "repositories" (value@ /.#repositories value) code.text) (..on_set "dependencies" (value@ /.#dependencies value) ..dependency) - (dictionary.has "compiler" (..dependency (value@ /.#compiler value))) + (dictionary.has ..lux_compiler_label (..dependency (value@ /.#lux value))) + (..on_list "compilers" (value@ /.#compilers value) ..compiler) (..on_set "sources" (value@ /.#sources value) code.text) (dictionary.has "target" (code.text (value@ /.#target value))) (..on_maybe "program" (value@ /.#program value) code.text) diff --git a/stdlib/source/program/aedifex/parser.lux b/stdlib/source/program/aedifex/parser.lux index 44c16133f..52a9a292c 100644 --- a/stdlib/source/program/aedifex/parser.lux +++ b/stdlib/source/program/aedifex/parser.lux @@ -1,32 +1,35 @@ (.using - [library - [lux {"-" Module type} - [abstract - [monad {"+" do}]] - [control - ["<>" parser - ["<[0]>" code {"+" Parser}]]] - [data - ["[0]" text] - [collection - ["[0]" dictionary {"+" Dictionary}] - ["[0]" set {"+" Set}]]] - [tool - [compiler - [meta - [archive - [descriptor {"+" Module}]]]]] - [world - [net {"+" URL}]]]] - ["[0]" // "_" - ["/" profile] - ["[1][0]" runtime {"+" Runtime}] - ["[1][0]" project {"+" Project}] - ["[1][0]" dependency] - ["[1][0]" repository "_" - ["[1]" remote]] - ["[1][0]" artifact {"+" Artifact} - ["[1]/[0]" type]]]) + [library + [lux {"-" Module type} + [abstract + [monad {"+" do}]] + [control + ["<>" parser + ["<[0]>" code {"+" Parser}]]] + [data + ["[0]" text] + [collection + ["[0]" dictionary {"+" Dictionary}] + ["[0]" set {"+" Set}]]] + [tool + [compiler + [meta + [cli {"+" Compiler}] + [archive + [module + [descriptor {"+" Module}]]]]]] + [world + [net {"+" URL}]]]] + ["[0]" // "_" + ["/" profile] + ["[1][0]" runtime {"+" Runtime}] + ["[1][0]" project {"+" Project}] + ["[1][0]" dependency] + ["[1][0]" format] + ["[1][0]" repository "_" + ["[1]" remote]] + ["[1][0]" artifact {"+" Artifact} + ["[1]/[0]" type]]]) (def: (as_input input) (-> (Maybe Code) (List Code)) @@ -155,6 +158,14 @@ (<>.else //artifact/type.lux_library ..type) ))) +(def: compiler + (Parser Compiler) + (.tuple + ($_ <>.and + .global_symbol + (<>.some .text) + ))) + (def: source (Parser /.Source) .text) @@ -203,9 +214,12 @@ (|> (..plural input "dependencies" ..dependency) (# ! each (set.of_list //dependency.hash)) (<>.else (set.empty //dependency.hash)))) - ^compiler (|> ..dependency - (..singular input "compiler") - (<>.else /.default_compiler)) + ^lux (|> ..dependency + (..singular input //format.lux_compiler_label) + (<>.else /.default_compiler)) + ^compilers (|> ..compiler + (..plural input "compilers") + (<>.else (list))) ^sources (: (Parser (Set /.Source)) (|> (..plural input "sources" ..source) (# ! each (set.of_list text.hash)) @@ -245,7 +259,8 @@ ^info ^repositories ^dependencies - ^compiler + ^lux + ^compilers ^sources ^target ^program diff --git a/stdlib/source/program/aedifex/profile.lux b/stdlib/source/program/aedifex/profile.lux index cdcfd3af5..eeabf5f82 100644 --- a/stdlib/source/program/aedifex/profile.lux +++ b/stdlib/source/program/aedifex/profile.lux @@ -1,40 +1,44 @@ (.using - [library - [lux {"-" Info Source Module} - [abstract - [monoid {"+" Monoid}] - [equivalence {"+" Equivalence}]] - [control - ["[0]" maybe ("[1]#[0]" monoid)] - ["[0]" exception {"+" exception:}]] - [data - ["[0]" product] - ["[0]" text ("[1]#[0]" equivalence)] - [collection - ["[0]" dictionary {"+" Dictionary}] - ["[0]" list ("[1]#[0]" monoid)] - ["[0]" set {"+" Set}]]] - [macro - ["[0]" template]] - [world - [net {"+" URL}] - [file {"+" Path}]] - [tool - [compiler - [meta - [archive - [descriptor {"+" Module}]]]]]]] - [// - ["[0]" runtime {"+" Runtime} ("[1]#[0]" equivalence)] - ["[0]" dependency {"+" Dependency} ("[1]#[0]" equivalence)] - ["[0]" artifact {"+" Artifact} - ["[0]" type]] - [repository - [remote {"+" Address}]]]) + [library + [lux {"-" Info Source Module} + [abstract + [monoid {"+" Monoid}] + [equivalence {"+" Equivalence}]] + [control + ["[0]" maybe ("[1]#[0]" monoid)] + ["[0]" exception {"+" exception:}]] + [data + ["[0]" product] + ["[0]" text ("[1]#[0]" equivalence)] + [collection + ["[0]" dictionary {"+" Dictionary}] + ["[0]" list ("[1]#[0]" monoid)] + ["[0]" set {"+" Set}]]] + [macro + ["[0]" template]] + [meta + ["[0]" symbol]] + [world + [net {"+" URL}] + [file {"+" Path}]] + [tool + [compiler + [meta + ["[0]" cli {"+" Compiler}] + [archive + [module + [descriptor {"+" Module}]]]]]]]] + [// + ["[0]" runtime {"+" Runtime} ("[1]#[0]" equivalence)] + ["[0]" dependency {"+" Dependency} ("[1]#[0]" equivalence)] + ["[0]" artifact {"+" Artifact} + ["[0]" type]] + [repository + [remote {"+" Address}]]]) (def: .public default_compiler Dependency - [dependency.#artifact ["com.github.luxlang" "lux-jvm" "0.6.0"] + [dependency.#artifact ["com.github.luxlang" "lux-jvm" "0.6.5"] dependency.#type type.jvm_library]) (type: .public Distribution @@ -162,7 +166,8 @@ #info (Maybe Info) #repositories (Set Address) #dependencies (Set Dependency) - #compiler Dependency + #lux Dependency + #compilers (List Compiler) #sources (Set Source) #target Target #program (Maybe Module) @@ -187,8 +192,10 @@ set.equivalence ... #dependencies set.equivalence - ... #compiler + ... #lux dependency.equivalence + ... #compilers + (list.equivalence cli.compiler_equivalence) ... #sources set.equivalence ... #target @@ -219,7 +226,8 @@ #info {.#None} #repositories (set.empty text.hash) #dependencies (set.empty dependency.hash) - #compiler default_compiler + #lux default_compiler + #compilers (list) #sources (set.empty text.hash) #target ..default_target #program {.#None} @@ -241,9 +249,10 @@ #info (maybe#composite (value@ #info override) (value@ #info baseline)) #repositories (set.union (value@ #repositories baseline) (value@ #repositories override)) #dependencies (set.union (value@ #dependencies baseline) (value@ #dependencies override)) - #compiler (if (dependency#= ..default_compiler (value@ #compiler override)) - (value@ #compiler baseline) - (value@ #compiler override)) + #lux (if (dependency#= ..default_compiler (value@ #lux override)) + (value@ #lux baseline) + (value@ #lux override)) + #compilers (list#composite (value@ #compilers baseline) (value@ #compilers override)) #sources (set.union (value@ #sources baseline) (value@ #sources override)) #target (if (text#= ..default_target (value@ #target baseline)) (value@ #target override) diff --git a/stdlib/source/program/compositor.lux b/stdlib/source/program/compositor.lux index 0d90a15dc..b2a5f4d15 100644 --- a/stdlib/source/program/compositor.lux +++ b/stdlib/source/program/compositor.lux @@ -152,7 +152,7 @@ (<| (or_crash! "Compilation failed:") ..timed (do (try.with async.monad) - [.let [[compilation_sources compilation_host_dependencies compilation_libraries compilation_target compilation_module] compilation] + [.let [[compilation_host_dependencies compilation_libraries compilation_compilers compilation_sources compilation_target compilation_module] compilation] import (/import.import (value@ platform.#&file_system platform) compilation_libraries) [state archive phase_wrapper] (:sharing [] (Platform ) -- cgit v1.2.3