aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/control/function/inline.lux
blob: 80674c8ebb8e6d63437e51b150110eadd5f68740 (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
(.using
 [library
  [lux "*"
   ["[0]" meta]
   [abstract
    ["[0]" monad {"+" do}]]
   [control
    ["<>" parser
     ["<[0]>" code {"+" Parser}]]]
   [data
    [collection
     ["[0]" list ("[1]#[0]" monad)]]]
   ["[0]" macro
    ["[0]" code]
    [syntax {"+" syntax:}
     ["|[0]|" export]]]]])

(def: declaration
  (Parser [Text (List Code)])
  (<code>.form (<>.and <code>.local (<>.some <code>.any))))

(def: inline
  (Parser [Code [Text (List Code)] Code Code])
  (|export|.parser
   ($_ <>.and
       ..declaration
       <code>.any
       <code>.any
       )))

(syntax: .public (inline: [[privacy [name parameters] type term] ..inline])
  (do [! meta.monad]
    [@ meta.current_module_name
     g!parameters (|> (macro.symbol "parameter")
                      (list.repeated (list.size parameters))
                      (monad.all !))
     .let [inlined (` (("lux in-module"
                        (~ (code.text @))
                        (.is (~ type)
                             (.function ((~ (code.local name)) (~+ parameters))
                               (~ term))))
                       (~+ (list#each (function (_ g!parameter)
                                        (` ((~' ~) (~ g!parameter))))
                                      g!parameters))))
           g!parameters (|> g!parameters
                            (list#each (function (_ parameter)
                                         (list parameter (` (~! <code>.any)))))
                            list#conjoint)]]
    (in (list (` ((~! syntax:) (~ privacy) ((~ (code.local name)) [(~+ g!parameters)])
                  (.# (~! meta.monad) (~' in) (.list (.`' (~ inlined))))))))))