@@ -90,13 +90,38 @@ macro api(cmd::Symbol)
9090 end
9191end
9292
93- const _cmdadd = (:define_public , :define_develop , :public , :develop , :base )
93+ const _cmdadd = (:define_public , :define_develop , :public , :develop , :base , :maybe_public )
9494const _cmduse = (:use , :test , :extend , :export )
9595
9696@static V6_COMPAT && (const _ff = findfirst)
9797@static V6_COMPAT || (_ff (lst, val) = coalesce (findfirst (isequal (val), lst), 0 ))
9898
99+ _add_def! (deflst, explst, sym) = (push! (deflst, sym); push! (explst, esc (:(function $ sym end ))))
100+
101+ """ Conditionally define functions, or import from Base"""
102+ function _maybe_public (exprs)
103+ implst = Symbol[]
104+ deflst = Symbol[]
105+ explst = Expr[]
106+ for ex in exprs
107+ if isa (ex, Expr) && ex. head == :tuple
108+ for sym in ex. args
109+ isa (sym, Symbol) || error (" @api $grp : $sym not a Symbol" )
110+ isdefined (Base, sym) ? push! (implst, sym) : _add_def! (deflst, explst, sym)
111+ end
112+ elseif isa (ex, Symbol)
113+ isdefined (Base, ex) ? push! (implst, ex) : _add_def! (deflst, explst, ex)
114+ else
115+ error (" @api $grp : syntax error $ex " )
116+ end
117+ end
118+ lst = _add_symbols (:base , implst)
119+ isempty (deflst) && return lst
120+ Expr (:toplevel , lst, explst... , esc (:( append! (__tmp_api__. public, $ deflst))))
121+ end
122+
99123function _add_symbols (grp, exprs)
124+ grp == :maybe_public && return _maybe_public (exprs)
100125 symbols = Symbol[]
101126 for ex in exprs
102127 if isa (ex, Expr) && ex. head == :tuple
@@ -111,10 +136,9 @@ function _add_symbols(grp, exprs)
111136 syms = SymList (symbols)
112137 expr = " APITools._make_list($(QuoteNode (:import )) , $(QuoteNode (:Base )) , $syms )"
113138 parsed = Meta. parse (expr)
114- dump (parsed)
115139 Expr (:toplevel ,
116140 V6_COMPAT ? :(eval (current_module (), $ parsed)) : :(eval (@__MODULE__ , $ parsed)),
117- esc (:( append! (__tmp_api__.$ grp , $ symbols))))
141+ esc (:( append! (__tmp_api__. base , $ symbols))))
118142 else
119143 esc (:( append! (__tmp_api__.$ grp, $ symbols) ))
120144 end
@@ -126,7 +150,7 @@ function _make_modules(exprs)
126150 for ex in exprs
127151 if isa (ex, Expr) && ex. head == :tuple
128152 append! (modlst, ex. args)
129- for e in ex. args ; push! (uselst, :(using $ sym)) ; end
153+ for sym in ex. args ; push! (uselst, :(using $ sym)) ; end
130154 elseif isa (ex, Symbol)
131155 push! (modlst, ex)
132156 push! (uselst, :(using $ ex))
181205
182206function _make_exprs (cmd, mod, grp)
183207 from = QuoteNode (grp == :base ? :Base : mod)
184- x = :(eval ($ (Meta. parse (" APITools._make_list($(QuoteNode (cmd)) , $from , $mod .__api__.$grp )" ))))
185- println (" _make_exprs($cmd , $mod , $grp ) => $x " )
186- x
208+ :(eval ($ (Meta. parse (" APITools._make_list($(QuoteNode (cmd)) , $from , $mod .__api__.$grp )" ))))
187209end
188210
189211end # module APITools
0 commit comments