aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/ffi/export.lua.lux
blob: 66b98998ded837b3bf0a518ddaa5f3731bbc94f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
(.require
 [library
  [lux (.except)
   [extension (.only directive)]
   ["[0]" meta]
   ["[0]" static]
   [abstract
    ["[0]" monad (.only do)]]
   [control
    ["<>" parser]]
   [data
    [text
     ["%" \\format]]
    [collection
     ["[0]" list (.use "[1]#[0]" monad mix)]
     ["[0]" set]]]
   ["[0]" macro (.only)
    [syntax (.only syntax)]
    ["[0]" code (.only)
     ["<[1]>" \\parser]]]
   [math
    ["[0]" random]]
   [target
    ["/" lua]]
   [tool
    [compiler
     ["[0]" phase]
     [meta
      [cache
       ["[0]" dependency
        ["[1]" artifact]]]]
     [language
      [lux
       ["[0]" generation]
       ["[0]" directive]
       [analysis
        ["[0]" type]]]]]]]])

(def definition
  (-> Code (Meta [Text Code]))
  (|>> (list)
       (<code>.result (<| <code>.form
                          (<>.after (<code>.this_text "lux def"))
                          (<>.before <code>.any)
                          (all <>.and
                               <code>.local
                               <code>.any)))
       meta.lifted))

... [15.2 – Privacy](https://www.lua.org/pil/15.2.html)
... [15.3 – Packages and Files](https://www.lua.org/pil/15.3.html)
... [15.4 – Using the Global Table](https://www.lua.org/pil/15.4.html)

(with_expansions [<extension> (static.random (|>> %.nat (%.format "lua export ") code.text)
                                             random.nat)]
  (directive (<extension> self phase archive [name <code>.text
                                              term <code>.any])
    (do [! phase.monad]
      [next directive.analysis
       [_ term] (<| directive.lifted_analysis
                    type.inferring
                    (next archive term))

       next directive.synthesis
       term (directive.lifted_synthesis
             (next archive term))

       dependencies (directive.lifted_generation
                     (dependency.dependencies archive term))

       next directive.generation
       [interim_artifacts term] (directive.lifted_generation
                                 (generation.with_interim_artifacts archive
                                   (next archive term)))

       _ (directive.lifted_generation
          (do !
            [@self (generation.learn_custom name (list#mix set.has dependencies interim_artifacts))
             .let [$exports (/.var "_REQUIREDNAME")
                   $global (/.var "_G")
                   exporting? (/.not (/.= /.nil $exports))
                   no_exports? (/.= /.nil (/.item $exports $global))
                   initialize_exports! (/.set (list (/.item $exports $global)) (/.table (list)))
                   export_definition! (/.set (|> $global
                                                 (/.item $exports)
                                                 (/.item (/.string name))
                                                 (list))
                                             (/.var name))
                   export! (/.when exporting?
                                   (all /.then
                                        (/.when no_exports?
                                                initialize_exports!)
                                        export_definition!
                                        ))]
             _ (generation.execute! (all /.then
                                         (/.set (list (/.var name)) term)
                                         export!))
             _ (generation.save! @self {.#None} (all /.then
                                                     (/.local/1 (/.var name) term)
                                                     export!))]
            (generation.log! (%.format "Export " (%.text name)))))]
      (in directive.no_requirements)))

  (def .public export
    (syntax (_ [exports (<>.many <code>.any)])
      (let [! meta.monad]
        (|> exports
            (monad.each ! macro.expansion)
            (at ! each (|>> list#conjoint
                            (monad.each ! ..definition)))
            (at ! conjoint)
            (at ! each (list#each (function (_ [name term])
                                    (` (<extension> (~ (code.text name)) (~ term)))))))))))