Skip to content

Commit

Permalink
Add create-ns, find-ns, remove-ns, the-ns
Browse files Browse the repository at this point in the history
  • Loading branch information
jeaye committed Nov 13, 2023
1 parent 16be24b commit f326199
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 2 deletions.
8 changes: 6 additions & 2 deletions include/cpp/jank/runtime/context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,15 @@ namespace jank::runtime
void dump() const;

ns_ptr intern_ns(obj::symbol_ptr const &);
option<ns_ptr> remove_ns(obj::symbol_ptr const &);
option<ns_ptr> find_ns(obj::symbol_ptr const &);

obj::symbol_ptr qualify_symbol(obj::symbol_ptr const &);
option<object_ptr> find_local(obj::symbol_ptr const &);

result<var_ptr, native_string> intern_var(obj::symbol_ptr const &);
result<var_ptr, native_string> intern_var(native_string const &ns, native_string const &name);
obj::symbol_ptr qualify_symbol(obj::symbol_ptr const &);
option<var_ptr> find_var(obj::symbol_ptr const &);
option<object_ptr> find_local(obj::symbol_ptr const &);

obj::keyword_ptr intern_keyword(obj::symbol const &sym, bool const resolved);
obj::keyword_ptr intern_keyword(native_string_view const &ns, native_string_view const &name, bool resolved);
Expand Down
22 changes: 22 additions & 0 deletions src/cpp/jank/runtime/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,28 @@ namespace jank::runtime
return result.first->second;
}

option<ns_ptr> context::remove_ns(obj::symbol_ptr const &sym)
{
auto locked_namespaces(namespaces.wlock());
auto const found(locked_namespaces->find(sym));
if(found != locked_namespaces->end())
{
auto const ret(found->second);
locked_namespaces->erase(found);
return ret;
}
return none;
}

option<ns_ptr> context::find_ns(obj::symbol_ptr const &sym)
{
auto locked_namespaces(namespaces.rlock());
auto const found(locked_namespaces->find(sym));
if(found != locked_namespaces->end())
{ return found->second; }
return none;
}

result<var_ptr, native_string> context::intern_var
(native_string const &ns, native_string const &name)
{ return intern_var(make_box<obj::symbol>(ns, name)); }
Expand Down
30 changes: 30 additions & 0 deletions src/jank/clojure/core.jank
Original file line number Diff line number Diff line change
Expand Up @@ -875,6 +875,33 @@
:unboxed-output? true}}})

; Namespaces (again).
(defn create-ns
[sym]
(assert (symbol? sym))
(native/raw "__value = __rt_ctx.intern_ns(expect_object<obj::symbol>(#{ sym }#));"))

(defn find-ns
[sym]
(assert (symbol? sym))
(native/raw "__value = __rt_ctx.find_ns(expect_object<obj::symbol>(#{ sym }#)).unwrap_or(nullptr);
if(!__value)
{ __value = obj::nil::nil_const(); }"))

(defn remove-ns
[sym]
(assert (symbol? sym))
(native/raw "__value = __rt_ctx.remove_ns(expect_object<obj::symbol>(#{ sym }#)).unwrap_or(nullptr);
if(!__value)
{ __value = obj::nil::nil_const(); }"))

(defn the-ns
[ns-or-sym]
(if (native/raw "__value = make_box(#{ ns-or-sym }#->type == object_type::ns);")
ns-or-sym
(let [found (find-ns ns-or-sym)]
(if (nil? found)
(native/raw "throw #{ (ex-info :not-an-ns-or-sym {:value ns-or-sym}) }#;")
found))))

; TODO: Handle multiple paths
; TODO: Handle relative paths
Expand All @@ -898,4 +925,7 @@
__rt_ctx.load_module(s).expect_ok() ;")
(recur (rest libs)))))

(defn alias [alias ns-sym]
"TODO")

(println "Bottom of clojure.core")

0 comments on commit f326199

Please sign in to comment.