From 1eb34989d46bfe93cbb0b105ce904046d8748433 Mon Sep 17 00:00:00 2001 From: Michael Camilleri Date: Fri, 21 Jan 2022 13:07:11 +0900 Subject: [PATCH] Support looking up missing symbols during compilation --- src/boot/boot.janet | 2 ++ src/core/util.c | 10 ++++++++-- test/suite0011.janet | 13 +++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/boot/boot.janet b/src/boot/boot.janet index 7da63078..566d3dad 100644 --- a/src/boot/boot.janet +++ b/src/boot/boot.janet @@ -2746,6 +2746,8 @@ (and as (string as "/")) prefix (string (last (string/split "/" path)) "/"))) + (unless (zero? (length prefix)) + (put-in env [:modules prefix] newenv)) (merge-module env newenv prefix ep)) (defmacro import diff --git a/src/core/util.c b/src/core/util.c index 8a1fcad6..3f5b9a90 100644 --- a/src/core/util.c +++ b/src/core/util.c @@ -607,8 +607,14 @@ JanetBinding janet_resolve_ext(JanetTable *env, const uint8_t *sym) { }; /* Check environment for entry */ - if (!janet_checktype(entry, JANET_TABLE)) - return binding; + if (!janet_checktype(entry, JANET_TABLE)) { + Janet fn_entry = janet_table_get(env, janet_ckeywordv("missing-symbol")); + if (janet_checktype(fn_entry, JANET_FUNCTION)) { + Janet args[2] = { janet_wrap_symbol(sym), janet_wrap_table(env) }; + entry = janet_call(janet_unwrap_function(fn_entry), 2, args); + } + if (!janet_checktype(entry, JANET_TABLE)) return binding; + } entry_table = janet_unwrap_table(entry); /* deprecation check */ diff --git a/test/suite0011.janet b/test/suite0011.janet index 6e6d1a23..a67ac787 100644 --- a/test/suite0011.janet +++ b/test/suite0011.janet @@ -26,5 +26,18 @@ (assert (< 11899423.08 (math/gamma 11.5) 11899423.085) "math/gamma") (assert (< 2605.1158 (math/log-gamma 500) 2605.1159) "math/log-gamma") +# missing symbols + +(def replacement 10) +(defn lookup-symbol [sym env] (dyn 'replacement)) + +(setdyn :missing-symbol lookup-symbol) + +(assert (= (eval-string "(+ a 5)") 15) "lookup missing symbol") + +(setdyn :missing-symbol nil) + +(assert-error "compile error" (eval-string "(+ a 5)")) + (end-suite)