blob: d96ea55d0a2dbb0c42565f2db8ea593ba94b0ce9 (
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
|
(.using
[library
[lux (.except)
[extension (.only directive)]
["[0]" meta]
["[0]" static]
[abstract
["[0]" monad (.only do)]]
[control
["<>" parser (.only)
["<[0]>" code]]]
[data
[text
["%" format]]
[collection
["[0]" list (.open: "[1]#[0]" monad mix)]
["[0]" set]]]
["[0]" macro (.only)
[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)))
(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)))))))))))
|