aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/ffi/export.py.lux
blob: fb3b6a503af72bdbe214c05d73edce8edb2adb0d (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
(.using
 [library
  [lux "*"
   [extension (.only directive:)]
   ["[0]" meta]
   ["[0]" static]
   [abstract
    ["[0]" monad (.only do)]]
   [control
    ["<>" parser
     ["<[0]>" code]]]
   [data
    [text
     ["%" format]]
    [collection
     ["[0]" list ("[1]#[0]" monad mix)]
     ["[0]" set]]]
   ["[0]" macro
    [syntax (.only syntax:)]
    ["[0]" code]]
   [math
    ["[0]" random]]
   [target
    ["/" python]]
   [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))

(with_expansions [<extension> (static.random (|>> %.nat (%.format "python 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 [code (/.set (list (/.item (/.string name) /.globals/0)) term)]
             _ (generation.execute! code)
             _ (generation.save! @self {.#None} code)]
            (generation.log! (%.format "Export " (%.text name)))))]
      (in directive.no_requirements)))

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