From bbd41a0f748aa0bdde811f98a1ba230448fc4904 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Tue, 4 Jun 2024 11:54:29 -0400 Subject: [PATCH] interpret forward-declared functions, allowing mutual recursion --- janet/interpreter.janet | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/janet/interpreter.janet b/janet/interpreter.janet index 15d1e77..1c7902f 100644 --- a/janet/interpreter.janet +++ b/janet/interpreter.janet @@ -362,7 +362,6 @@ (def the-fn @{:name name :^type :fn :body clauses :ctx ctx}) (set (ctx name) the-fn)) -# TODO (defn- is_placeholder [x] (= x :_)) (var call-fn nil) @@ -389,6 +388,8 @@ (print "Janet function") (break (the-fn ;args))) (def clauses (the-fn :body)) + (when (= :nothing clauses) + (error {:node the-fn :value args :msg "cannot call function before it is defined"})) (def len (length clauses)) (when (the-fn :match) (break ((the-fn :match) 0 args))) (defn match-fn [i args] @@ -552,15 +553,18 @@ # (when (has-errors? validated) (break (validated :errors))) # (def cleaned (get-in parsed [:ast :data 1])) # (pp cleaned) - (interpret (parsed :ast) @{:^parent b/ctx}) - # (try (interpret (parsed :ast) @{}) - # ([e] (print "Ludus panicked!: " - # (if (struct? e) (error (e :msg)) (error e))))) + # (interpret (parsed :ast) @{:^parent b/ctx}) + (try (interpret (parsed :ast) @{}) + ([e] (print "Ludus panicked!: " + (if (struct? e) (error (e :msg)) (error e))))) ) (do (set source ` -let #{:a ay, :b (:ok, bee), ...c} = #{:a 1, :b (:ok, 42), :c 3} +fn foo +fn bar () -> foo () +fn foo () -> :foo +bar () `) (def result (run)) # (b/show result)