<span class="hljs-meta">#!/usr/bin/env hy</span>
(<span class="hljs-name"><span class="hljs-built_in">import</span></span> os.path)
(<span class="hljs-name"><span class="hljs-built_in">import</span></span> hy.compiler)
(<span class="hljs-name"><span class="hljs-built_in">import</span></span> hy.core)
<span class="hljs-comment">;; absolute path for Hy core</span>
(<span class="hljs-name"><span class="hljs-built_in">setv</span></span> *core-path* (<span class="hljs-name">os.path.dirname</span> hy.core.--file--))
(<span class="hljs-name"><span class="hljs-built_in">defn</span></span> collect-macros [collected-names opened-file]
(<span class="hljs-name"><span class="hljs-built_in">while</span></span> <span class="hljs-literal">True</span>
(<span class="hljs-name"><span class="hljs-built_in">try</span></span>
(<span class="hljs-name"><span class="hljs-built_in">let</span></span> [data (<span class="hljs-name"><span class="hljs-built_in">read</span></span> opened-file)]
(<span class="hljs-name"><span class="hljs-built_in">if</span></span> (<span class="hljs-name"><span class="hljs-built_in">and</span></span> (<span class="hljs-name"><span class="hljs-built_in">in</span></span> (<span class="hljs-name"><span class="hljs-built_in">first</span></span> data)
'(<span class="hljs-name"><span class="hljs-built_in">defmacro</span></span> defmacro/g! defn))
(<span class="hljs-name"><span class="hljs-built_in">not</span></span> (<span class="hljs-name">.startswith</span> (<span class="hljs-name"><span class="hljs-built_in">second</span></span> data) <span class="hljs-string">"_"</span>)))
(<span class="hljs-name">.add</span> collected-names (<span class="hljs-name"><span class="hljs-built_in">second</span></span> data))))
(<span class="hljs-name"><span class="hljs-built_in">except</span></span> [e EOFError] (<span class="hljs-name"><span class="hljs-built_in">break</span></span>)))))
(<span class="hljs-name"><span class="hljs-built_in">defmacro</span></span> core-file [filename]
`(<span class="hljs-name"><span class="hljs-built_in">open</span></span> (<span class="hljs-name">os.path.join</span> *core-path* ~filename)))
(<span class="hljs-name"><span class="hljs-built_in">defmacro</span></span> contrib-file [filename]
`(<span class="hljs-name"><span class="hljs-built_in">open</span></span> (<span class="hljs-name">os.path.join</span> *core-path* <span class="hljs-string">".."</span> <span class="hljs-string">"contrib"</span> ~filename)))
(<span class="hljs-name"><span class="hljs-built_in">defn</span></span> collect-core-names []
(<span class="hljs-name"><span class="hljs-built_in">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">"macros.hy"</span>))
(<span class="hljs-name">collect-macros</span> (<span class="hljs-name">core-file</span> <span class="hljs-string">"bootstrap.hy"</span>))))