special-form heads are not shadowable
Found in a read/eval review: a local named like a special form wrongly took over operator position. (let [if (fn ...)] (if true 1 2)) returned the fn, but per spec section 3 (and the reference) special-form heads are not shadowable; only macros are. Two fixes: drop the (not shadowed) guard on the special-form branch of analyze-list (so an (if ...) head is always the special), and prefix a local whose name is a Scheme keyword when emitting (so a value local legally named if does not shadow the (if ...) the back end emits). Value-position locals named if/or/case still work.
This commit is contained in:
parent
f18ae3bd46
commit
212cd0399a
5 changed files with 106 additions and 81 deletions
File diff suppressed because one or more lines are too long
|
|
@ -796,15 +796,15 @@
|
|||
(mark-macro! "clojure.core" "defonce"))
|
||||
(guard (e (#t #f))
|
||||
(def-var! "clojure.core" "if-not"
|
||||
(lambda (test then . G__17) (let fnrec441 ((test test) (then then) (G__17 (list->cseq G__17))) (let* ((G__18 G__17) (else (jolt-nth G__18 0 jolt-nil))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "if")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "not")) (jolt-invoke (var-deref "clojure.core" "__sq1") test))) (jolt-invoke (var-deref "clojure.core" "__sq1") then) (jolt-invoke (var-deref "clojure.core" "__sq1") else))))))
|
||||
(lambda (test then . G__17) (let fnrec441 ((test test) (then then) (G__17 (list->cseq G__17))) (let* ((G__18 G__17) (_else (jolt-nth G__18 0 jolt-nil))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "if")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "not")) (jolt-invoke (var-deref "clojure.core" "__sq1") test))) (jolt-invoke (var-deref "clojure.core" "__sq1") then) (jolt-invoke (var-deref "clojure.core" "__sq1") _else))))))
|
||||
(mark-macro! "clojure.core" "if-not"))
|
||||
(guard (e (#t #f))
|
||||
(def-var! "clojure.core" "if-let"
|
||||
(lambda (bindings then . G__19) (let fnrec442 ((bindings bindings) (then then) (G__19 (list->cseq G__19))) (let* ((G__20 G__19) (else (jolt-nth G__20 0 jolt-nil))) (let* ((form (jolt-invoke bindings 0)) (tst (jolt-invoke bindings 1))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__4__auto")) (jolt-invoke (var-deref "clojure.core" "__sq1") tst))) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "if")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__4__auto")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") form) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__4__auto")))) (jolt-invoke (var-deref "clojure.core" "__sq1") then))) (jolt-invoke (var-deref "clojure.core" "__sq1") else)))))))))
|
||||
(lambda (bindings then . G__19) (let fnrec442 ((bindings bindings) (then then) (G__19 (list->cseq G__19))) (let* ((G__20 G__19) (_else (jolt-nth G__20 0 jolt-nil))) (let* ((form (jolt-invoke bindings 0)) (tst (jolt-invoke bindings 1))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__4__auto")) (jolt-invoke (var-deref "clojure.core" "__sq1") tst))) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "if")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__4__auto")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") form) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__4__auto")))) (jolt-invoke (var-deref "clojure.core" "__sq1") then))) (jolt-invoke (var-deref "clojure.core" "__sq1") _else)))))))))
|
||||
(mark-macro! "clojure.core" "if-let"))
|
||||
(guard (e (#t #f))
|
||||
(def-var! "clojure.core" "if-some"
|
||||
(lambda (bindings then . G__21) (let fnrec443 ((bindings bindings) (then then) (G__21 (list->cseq G__21))) (let* ((G__22 G__21) (else (jolt-nth G__22 0 jolt-nil))) (let* ((form (jolt-invoke bindings 0)) (tst (jolt-invoke bindings 1))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__5__auto")) (jolt-invoke (var-deref "clojure.core" "__sq1") tst))) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "if")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "some?")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__5__auto")))) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") form) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__5__auto")))) (jolt-invoke (var-deref "clojure.core" "__sq1") then))) (jolt-invoke (var-deref "clojure.core" "__sq1") else)))))))))
|
||||
(lambda (bindings then . G__21) (let fnrec443 ((bindings bindings) (then then) (G__21 (list->cseq G__21))) (let* ((G__22 G__21) (_else (jolt-nth G__22 0 jolt-nil))) (let* ((form (jolt-invoke bindings 0)) (tst (jolt-invoke bindings 1))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__5__auto")) (jolt-invoke (var-deref "clojure.core" "__sq1") tst))) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "if")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "some?")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__5__auto")))) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol "clojure.core" "let")) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-invoke (var-deref "clojure.core" "__sqvec") (jolt-invoke (var-deref "clojure.core" "__sq1") form) (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "temp__5__auto")))) (jolt-invoke (var-deref "clojure.core" "__sq1") then))) (jolt-invoke (var-deref "clojure.core" "__sq1") _else)))))))))
|
||||
(mark-macro! "clojure.core" "if-some"))
|
||||
(guard (e (#t #f))
|
||||
(def-var! "clojure.core" "when-some"
|
||||
|
|
@ -1051,10 +1051,10 @@
|
|||
(guard (e (#t #f))
|
||||
(def-var! "clojure.walk" "stringify-keys" (letrec ((stringify-keys (lambda (m) (let fnrec109 ((m m)) (let* ((f (lambda (G__11) (let fnrec111 ((G__11 G__11)) (let* ((G__12 G__11) (k (jolt-nth G__12 0 jolt-nil)) (v (jolt-nth G__12 1 jolt-nil))) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "keyword?") k)) (let* ((_o$114 (jolt-invoke (var-deref "clojure.core" "name") k)) (_o$115 v)) (jolt-vector _o$114 _o$115)) (let* ((_o$112 k) (_o$113 v)) (jolt-vector _o$112 _o$113)))))))) (jolt-invoke (var-deref "clojure.walk" "postwalk") (lambda (x) (let fnrec110 ((x x)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "map?") x)) (jolt-into (jolt-hash-map) (jolt-map f x)) x))) m)))))) stringify-keys)))
|
||||
(guard (e (#t #f))
|
||||
(def-var! "clojure.template" "apply-template" (letrec ((apply-template (lambda (argv expr values) (let fnrec44 ((argv argv) (expr expr) (values values)) (begin (if (jolt-not (jolt-invoke (var-deref "clojure.core" "vector?") argv)) (jolt-throw (jolt-ex-info "Assert failed: (vector? argv)" (jolt-hash-map))) jolt-nil) (if (jolt-not (jolt-invoke (var-deref "clojure.core" "every?") (var-deref "clojure.core" "symbol?") argv)) (jolt-throw (jolt-ex-info "Assert failed: (every? symbol? argv)" (jolt-hash-map))) jolt-nil) (jolt-invoke (var-deref "clojure.walk" "postwalk-replace") (jolt-invoke (var-deref "clojure.core" "zipmap") argv values) expr)))))) apply-template)))
|
||||
(def-var! "clojure.template" "apply-template" (letrec ((apply-template (lambda (argv expr _values) (let fnrec44 ((argv argv) (expr expr) (_values _values)) (begin (if (jolt-not (jolt-invoke (var-deref "clojure.core" "vector?") argv)) (jolt-throw (jolt-ex-info "Assert failed: (vector? argv)" (jolt-hash-map))) jolt-nil) (if (jolt-not (jolt-invoke (var-deref "clojure.core" "every?") (var-deref "clojure.core" "symbol?") argv)) (jolt-throw (jolt-ex-info "Assert failed: (every? symbol? argv)" (jolt-hash-map))) jolt-nil) (jolt-invoke (var-deref "clojure.walk" "postwalk-replace") (jolt-invoke (var-deref "clojure.core" "zipmap") argv _values) expr)))))) apply-template)))
|
||||
(guard (e (#t #f))
|
||||
(def-var! "clojure.template" "do-template"
|
||||
(lambda (argv expr . values) (let fnrec45 ((argv argv) (expr expr) (values (list->cseq values))) (let* ((c (jolt-count argv))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "do")) (jolt-map (lambda (a) (let fnrec46 ((a a)) (jolt-invoke (var-deref "clojure.template" "apply-template") argv expr a))) (jolt-invoke (var-deref "clojure.core" "partition") c values)))))))
|
||||
(lambda (argv expr . _values) (let fnrec45 ((argv argv) (expr expr) (_values (list->cseq _values))) (let* ((c (jolt-count argv))) (jolt-invoke (var-deref "clojure.core" "__sqcat") (jolt-invoke (var-deref "clojure.core" "__sq1") (jolt-symbol #f "do")) (jolt-map (lambda (a) (let fnrec46 ((a a)) (jolt-invoke (var-deref "clojure.template" "apply-template") argv expr a))) (jolt-invoke (var-deref "clojure.core" "partition") c _values)))))))
|
||||
(mark-macro! "clojure.template" "do-template"))
|
||||
(guard (e (#t #f))
|
||||
(def-var! "clojure.edn" "edn->value" (letrec ((edn->value (lambda (opts x) (let fnrec47 ((opts opts) (x x)) (if (jolt= (keyword "jolt" "set") (jolt-get x (keyword "jolt" "type"))) (jolt-invoke (var-deref "clojure.core" "set") (jolt-map (lambda (v) (let fnrec53 ((v v)) (jolt-invoke edn->value opts v))) (jolt-get x (keyword #f "value")))) (if (jolt= (keyword "jolt" "tagged") (jolt-get x (keyword "jolt" "type"))) (let* ((tag (jolt-get x (keyword #f "tag"))) (v (jolt-invoke edn->value opts (jolt-get x (keyword #f "form")))) (tag-sym (let* ((n (jolt-invoke (var-deref "clojure.core" "name") tag))) (jolt-invoke (var-deref "clojure.core" "symbol") (if (jolt= "#" (jolt-invoke (var-deref "clojure.core" "subs") n 0 1)) (jolt-invoke (var-deref "clojure.core" "subs") n 1) n)))) (custom (jolt-get (jolt-get opts (keyword #f "readers")) tag-sym))) (if (jolt-truthy? custom) (jolt-invoke custom v) (if (jolt-truthy? (jolt-get opts (keyword #f "default"))) (jolt-invoke (jolt-get opts (keyword #f "default")) tag v) (if (jolt-truthy? (keyword #f "else")) (jolt-invoke (var-deref "clojure.core" "__read-tagged") tag v) jolt-nil)))) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "map?") x)) (jolt-into (jolt-hash-map) (jolt-map (lambda (e) (let fnrec50 ((e e)) (let* ((_o$51 (jolt-invoke edn->value opts (jolt-invoke (var-deref "clojure.core" "key") e))) (_o$52 (jolt-invoke edn->value opts (jolt-invoke (var-deref "clojure.core" "val") e)))) (jolt-vector _o$51 _o$52)))) x)) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "vector?") x)) (jolt-invoke (var-deref "clojure.core" "mapv") (lambda (v) (let fnrec49 ((v v)) (jolt-invoke edn->value opts v))) x) (if (jolt-truthy? (jolt-invoke (var-deref "clojure.core" "seq?") x)) (jolt-map (lambda (v) (let fnrec48 ((v v)) (jolt-invoke edn->value opts v))) x) (if (jolt-truthy? (keyword #f "else")) x jolt-nil)))))))))) edn->value)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue