blob: 96230b5e0ff2e65d14c2f0ba146346617b236236 (
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
|
(.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
["/" js]]
[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 "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 [$module (/.var "module")
$exports (/.the "exports" $module)
definition (/.define (/.var name) term)
export (/.when (/.not (/.= (/.string "undefined") (/.type_of $module)))
(/.set (/.the name $exports) (/.var name)))
code (all /.then
definition
export)]
_ (generation.execute! definition)
_ (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))))))))))
|