<span class="hljs-meta">#!/usr/bin/env hy</span>

(<span class="hljs-name"><span class="hljs-builtin-name">import</span></span> os.path)

(<span class="hljs-name"><span class="hljs-builtin-name">import</span></span> hy.compiler)
(<span class="hljs-name"><span class="hljs-builtin-name">import</span></span> hy.core)


<span class="hljs-comment">;; absolute path for Hy core</span>
(<span class="hljs-name"><span class="hljs-builtin-name">setv</span></span> *core-path* (<span class="hljs-name">os.path.dirname</span> hy.core.--file--))


(<span class="hljs-name"><span class="hljs-builtin-name">defn</span></span> collect-macros [collected-names opened-file]
  (<span class="hljs-name"><span class="hljs-builtin-name">while</span></span> <span class="hljs-literal">True</span>
    (<span class="hljs-name"><span class="hljs-builtin-name">try</span></span>
     (<span class="hljs-name"><span class="hljs-builtin-name">let</span></span> [data (<span class="hljs-name"><span class="hljs-builtin-name">read</span></span> opened-file)]
       (<span class="hljs-name"><span class="hljs-builtin-name">if</span></span> (<span class="hljs-name"><span class="hljs-builtin-name">and</span></span> (<span class="hljs-name"><span class="hljs-builtin-name">in</span></span> (<span class="hljs-name"><span class="hljs-builtin-name">first</span></span> data)
                    &#x27;(<span class="hljs-name"><span class="hljs-builtin-name">defmacro</span></span> defmacro/g! defn))
                (<span class="hljs-name"><span class="hljs-builtin-name">not</span></span> (<span class="hljs-name">.startswith</span> (<span class="hljs-name"><span class="hljs-builtin-name">second</span></span> data) <span class="hljs-string">&quot;_&quot;</span>)))
         (<span class="hljs-name">.add</span> collected-names (<span class="hljs-name"><span class="hljs-builtin-name">second</span></span> data))))
     (<span class="hljs-name"><span class="hljs-builtin-name">except</span></span> [e EOFError] (<span class="hljs-name"><span class="hljs-builtin-name">break</span></span>)))))


(<span class="hljs-name"><span class="hljs-builtin-name">defmacro</span></span> core-file [filename]
  `(<span class="hljs-name"><span class="hljs-builtin-name">open</span></span> (<span class="hljs-name">os.path.join</span> *core-path* ~filename)))


(<span class="hljs-name"><span class="hljs-builtin-name">defmacro</span></span> contrib-file [filename]
  `(<span class="hljs-name"><span class="hljs-builtin-name">open</span></span> (<span class="hljs-name">os.path.join</span> *core-path* <span class="hljs-string">&quot;..&quot;</span> <span class="hljs-string">&quot;contrib&quot;</span> ~filename)))


(<span class="hljs-name"><span class="hljs-builtin-name">defn</span></span> collect-core-names []
  (<span class="hljs-name"><span class="hljs-builtin-name">doto</span></span> (<span class="hljs-name">set</span>)
        (<span class="hljs-name">.update</span> hy.core.language.*exports*)
        (<span class="hljs-name">.update</span> hy.core.shadow.*exports*)
        (<span class="hljs-name">collect-macros</span> (<span class="hljs-name">core-file</span> <span class="hljs-string">&quot;macros.hy&quot;</span>))
        (<span class="hljs-name">collect-macros</span> (<span class="hljs-name">core-file</span> <span class="hljs-string">&quot;bootstrap.hy&quot;</span>))))
