diff --git a/janet/validate.janet b/janet/validate.janet index 96097e5..14b159d 100644 --- a/janet/validate.janet +++ b/janet/validate.janet @@ -370,18 +370,29 @@ Deferred until a later iteration of Ludus: # (set (args :tail-call) true)) (defn- check-arity [validator] + (print "CHECKING ARITY") (def ast (validator :ast)) # (when (ast :partial) (break validator)) (def ctx (validator :ctx)) (def data (ast :data)) (def fn-word (first data)) + (pp fn-word) (def the-fn (resolve-name ctx (fn-word :data))) + (print "the called function: " the-fn) + (pp the-fn) (when (not the-fn) (break validator)) + (print "the function is not nil") + (print "the function type is " (type the-fn)) (when (= :function (type the-fn)) (break validator)) - (when (= :cfunction (type the-fn) (break validator))) + (when (= :cfunction (type the-fn)) (break validator)) + (print "the function is not a janet fn") + (print "fn type: " (the-fn :type)) (when (not= :fn (the-fn :type)) (break validator)) (print "fn name: " (the-fn :name)) (def arities (the-fn :arities)) + # when there aren't arities yet, break, since that means we're making a recursive function call + # TODO: enahnce this so that we can determine arities *before* all function bodies; this ensures arity-checking for self-recursive calls + (when (not arities) (break validator)) (print "arities: ") (pp arities) (def args (get data 1)) @@ -389,6 +400,9 @@ Deferred until a later iteration of Ludus: (print "called with #args " num-args) (pp (get (validator :ctx) "bar")) (when (has-key? arities num-args) (break validator)) + (print "arities: ") + (pp arities) + (when (not arities) (break validator)) (def rest-arities (keys (arities :rest))) (when (empty? rest-arities) (array/push (validator :errors) @@ -724,10 +738,11 @@ Deferred until a later iteration of Ludus: (do # (comment (def source ` -let foo = 1 -pkg Foo {foo} -pkg Baz {Foo, foo} -Baz :Foo :bar +fn foo { + () -> foo (:foo) +} + +foo () `) (def scanned (s/scan source)) (def parsed (p/parse scanned))