1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-17 22:24:49 +00:00

Make flychecker handle more kinds of defs.

This should help when redefining certain forms. Will also
not do functional arity checking against nil forms, as that
is the default value when a def doesn't evaluate.
This commit is contained in:
Calvin Rose 2020-02-21 21:10:42 -06:00
parent 4b440618d6
commit aaabca6fc7
2 changed files with 39 additions and 4 deletions

View File

@ -2225,6 +2225,29 @@
### ###
### ###
(defn- no-side-effects
"Check if form may have side effects. If returns true, then the src
must not have side effects, such as calling a C function."
[src]
(cond
(tuple? src)
(if (= (tuple/type src) :brackets)
(all no-side-effects src))
(array? src)
(all no-side-effects src)
(dictionary? src)
(and (all no-side-effects (keys src))
(all no-side-effects (values src)))
true))
(defn- is-safe-def [x] (no-side-effects (last x)))
(def- safe-forms {'defn true 'defn- true 'defmacro true 'defmacro- true
'def is-safe-def 'var is-safe-def 'def- is-safe-def 'var- is-safe-def
'defglobal is-safe-def 'varglobal is-safe-def})
(def- importers {'import true 'import* true 'use true 'dofile true 'require true})
(defn cli-main (defn cli-main
"Entrance for the Janet CLI tool. Call this functions with the command line "Entrance for the Janet CLI tool. Call this functions with the command line
arguments as an array or tuple of strings to invoke the CLI interface." arguments as an array or tuple of strings to invoke the CLI interface."
@ -2292,15 +2315,21 @@
(def h (in handlers n)) (def h (in handlers n))
(if h (h i) (do (print "unknown flag -" n) ((in handlers "h"))))) (if h (h i) (do (print "unknown flag -" n) ((in handlers "h")))))
(def- safe-forms {'defn true 'defn- true 'defmacro true 'defmacro- true})
(def- importers {'import true 'import* true 'use true 'dofile true 'require true})
(defn- evaluator (defn- evaluator
[thunk source env where] [thunk source env where]
(if *compile-only* (if *compile-only*
(when (tuple? source) (when (tuple? source)
(def head (source 0))
(def safe-check (safe-forms head))
(cond (cond
(safe-forms (source 0)) (thunk) # Sometimes safe form
(importers (source 0)) (function? safe-check)
(if (safe-check source) (thunk))
# Always safe form
safe-check
(thunk)
# Import-like form
(importers head)
(do (do
(let [[l c] (tuple/sourcemap source) (let [[l c] (tuple/sourcemap source)
newtup (tuple/setmap (tuple ;source :evaluator evaluator) l c)] newtup (tuple/setmap (tuple ;source :evaluator evaluator) l c)]
@ -2347,6 +2376,11 @@
(setdyn :err-color (if *colorize* true)) (setdyn :err-color (if *colorize* true))
(repl getchunk onsig env))) (repl getchunk onsig env)))
(put _env 'no-side-effects nil)
(put _env 'is-safe-def nil)
(put _env 'safe-forms nil)
(put _env 'importers nil)
### ###
### ###

View File

@ -455,6 +455,7 @@ static JanetSlot janetc_call(JanetFopts opts, JanetSlot *slots, JanetSlot fun) {
break; break;
case JANET_CFUNCTION: case JANET_CFUNCTION:
case JANET_ABSTRACT: case JANET_ABSTRACT:
case JANET_NIL:
break; break;
case JANET_KEYWORD: case JANET_KEYWORD:
if (min_arity == 0) { if (min_arity == 0) {