Add (param :as type) annotations to all fn/lambda params across SX spec
Extend the type annotation system from defcomp-only to fn/lambda params: - Infrastructure: sf-lambda, py/js-collect-params-loop, and bootstrap_py.py now recognize (name :as type) in param lists, extracting just the name - bootstrap_py.py: add _extract_param_name() helper, fix _emit_for_each_stmt - 521 type annotations across 22 .sx spec files (eval, types, adapters, transpilers, engine, orchestration, deps, signals, router, prove, etc.) - Zero behavioral change: annotations are metadata for static analysis only - All bootstrappers (Python, JS, G1) pass, 81/81 spec tests pass Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -528,7 +528,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-mangle
|
||||
(fn (name)
|
||||
(fn ((name :as string))
|
||||
(let ((renamed (get js-renames name)))
|
||||
(if (not (nil? renamed))
|
||||
renamed
|
||||
@@ -549,7 +549,7 @@
|
||||
result))))))))
|
||||
|
||||
(define js-kebab-to-camel
|
||||
(fn (s)
|
||||
(fn ((s :as string))
|
||||
(let ((parts (split s "-")))
|
||||
(if (<= (len parts) 1)
|
||||
s
|
||||
@@ -557,7 +557,7 @@
|
||||
(join "" (map (fn (p) (js-capitalize p)) (rest parts))))))))
|
||||
|
||||
(define js-capitalize
|
||||
(fn (s)
|
||||
(fn ((s :as string))
|
||||
(if (empty? s) s
|
||||
(str (upper (slice s 0 1)) (slice s 1)))))
|
||||
|
||||
@@ -567,7 +567,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-quote-string
|
||||
(fn (s)
|
||||
(fn ((s :as string))
|
||||
(str "\""
|
||||
(replace (replace (replace (replace (replace (replace
|
||||
s "\\" "\\\\") "\"" "\\\"") "\n" "\\n") "\r" "\\r") "\t" "\\t") "\0" "\\0")
|
||||
@@ -582,11 +582,11 @@
|
||||
(list "+" "-" "*" "/" "=" "!=" "<" ">" "<=" ">=" "mod"))
|
||||
|
||||
(define js-infix?
|
||||
(fn (op)
|
||||
(fn ((op :as string))
|
||||
(some (fn (x) (= x op)) js-infix-ops)))
|
||||
|
||||
(define js-op-symbol
|
||||
(fn (op)
|
||||
(fn ((op :as string))
|
||||
(case op
|
||||
"=" "=="
|
||||
"!=" "!="
|
||||
@@ -599,13 +599,13 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-is-self-tail-recursive?
|
||||
(fn (name body)
|
||||
(fn ((name :as string) (body :as list))
|
||||
(if (empty? body)
|
||||
false
|
||||
(js-has-tail-call? name (last body)))))
|
||||
|
||||
(define js-has-tail-call?
|
||||
(fn (name expr)
|
||||
(fn ((name :as string) expr)
|
||||
(if (not (and (list? expr) (not (empty? expr))))
|
||||
false
|
||||
(let ((head (first expr)))
|
||||
@@ -642,7 +642,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-tail-as-stmt
|
||||
(fn (name expr)
|
||||
(fn ((name :as string) expr)
|
||||
(if (not (and (list? expr) (not (empty? expr))))
|
||||
(str "return " (js-expr expr) ";")
|
||||
(let ((head (first expr)))
|
||||
@@ -702,7 +702,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-cond-as-loop-stmt
|
||||
(fn (name clauses)
|
||||
(fn ((name :as string) (clauses :as list))
|
||||
(if (empty? clauses)
|
||||
"return NIL;"
|
||||
;; Detect scheme vs clojure
|
||||
@@ -714,7 +714,7 @@
|
||||
(js-cond-clojure-loop name clauses 0 0 false))))))
|
||||
|
||||
(define js-cond-scheme-loop
|
||||
(fn (name clauses i)
|
||||
(fn ((name :as string) (clauses :as list) (i :as number))
|
||||
(if (>= i (len clauses))
|
||||
"else { return NIL; }"
|
||||
(let ((clause (nth clauses i))
|
||||
@@ -728,7 +728,7 @@
|
||||
(js-cond-scheme-loop name clauses (+ i 1))))))))
|
||||
|
||||
(define js-cond-clojure-loop
|
||||
(fn (name clauses i clause-idx has-else)
|
||||
(fn ((name :as string) (clauses :as list) (i :as number) (clause-idx :as number) (has-else :as boolean))
|
||||
(if (>= i (len clauses))
|
||||
(if has-else "" " else { return NIL; }")
|
||||
(let ((c (nth clauses i)))
|
||||
@@ -749,7 +749,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-loop-body
|
||||
(fn (name body)
|
||||
(fn ((name :as string) (body :as list))
|
||||
(if (empty? body)
|
||||
"return NIL;"
|
||||
(str (join "\n" (map (fn (e) (js-statement e))
|
||||
@@ -805,7 +805,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-native-dict
|
||||
(fn (d)
|
||||
(fn ((d :as dict))
|
||||
(let ((items (keys d)))
|
||||
(str "{" (join ", " (map (fn (k)
|
||||
(str (js-quote-string k) ": " (js-expr (get d k))))
|
||||
@@ -963,11 +963,11 @@
|
||||
(str "function(" params-str ") { " (join "\n" parts) " }")))))))))
|
||||
|
||||
(define js-collect-params
|
||||
(fn (params)
|
||||
(fn ((params :as list))
|
||||
(js-collect-params-loop params 0 (list) nil)))
|
||||
|
||||
(define js-collect-params-loop
|
||||
(fn (params i result rest-name)
|
||||
(fn ((params :as list) (i :as number) (result :as list) rest-name)
|
||||
(if (>= i (len params))
|
||||
(list result rest-name)
|
||||
(let ((p (nth params i)))
|
||||
@@ -975,13 +975,25 @@
|
||||
;; &rest marker
|
||||
(and (= (type-of p) "symbol") (= (symbol-name p) "&rest"))
|
||||
(if (< (+ i 1) (len params))
|
||||
(js-collect-params-loop params (+ i 2) result
|
||||
(js-mangle (symbol-name (nth params (+ i 1)))))
|
||||
(let ((rp (nth params (+ i 1))))
|
||||
(js-collect-params-loop params (+ i 2) result
|
||||
(js-mangle
|
||||
(if (and (= (type-of rp) "list") (= (len rp) 3)
|
||||
(= (type-of (nth rp 1)) "keyword")
|
||||
(= (keyword-name (nth rp 1)) "as"))
|
||||
(symbol-name (first rp))
|
||||
(if (= (type-of rp) "symbol") (symbol-name rp) (str rp))))))
|
||||
(js-collect-params-loop params (+ i 1) result rest-name))
|
||||
;; Normal param
|
||||
(= (type-of p) "symbol")
|
||||
(js-collect-params-loop params (+ i 1)
|
||||
(append result (js-mangle (symbol-name p))) rest-name)
|
||||
;; Annotated param: (name :as type) → extract name
|
||||
(and (= (type-of p) "list") (= (len p) 3)
|
||||
(= (type-of (nth p 1)) "keyword")
|
||||
(= (keyword-name (nth p 1)) "as"))
|
||||
(js-collect-params-loop params (+ i 1)
|
||||
(append result (js-mangle (symbol-name (first p)))) rest-name)
|
||||
;; Something else
|
||||
:else
|
||||
(js-collect-params-loop params (+ i 1)
|
||||
@@ -1024,7 +1036,7 @@
|
||||
(js-parse-clojure-let-bindings bindings 0 (list))))))
|
||||
|
||||
(define js-parse-clojure-let-bindings
|
||||
(fn (bindings i result)
|
||||
(fn (bindings (i :as number) (result :as list))
|
||||
(if (>= i (- (len bindings) 1))
|
||||
result
|
||||
(let ((vname (if (= (type-of (nth bindings i)) "symbol")
|
||||
@@ -1050,7 +1062,7 @@
|
||||
(str (js-emit-clojure-let-vars bindings 0 (list)) " ")))))
|
||||
|
||||
(define js-emit-clojure-let-vars
|
||||
(fn (bindings i result)
|
||||
(fn (bindings (i :as number) (result :as list))
|
||||
(if (>= i (- (len bindings) 1))
|
||||
(join " " result)
|
||||
(let ((vname (if (= (type-of (nth bindings i)) "symbol")
|
||||
@@ -1062,7 +1074,7 @@
|
||||
|
||||
;; Helper to append let binding var declarations to a parts list
|
||||
(define js-append-let-binding-parts
|
||||
(fn (bindings parts)
|
||||
(fn (bindings (parts :as list))
|
||||
(when (and (list? bindings) (not (empty? bindings)))
|
||||
(if (list? (first bindings))
|
||||
;; Scheme-style
|
||||
@@ -1076,7 +1088,7 @@
|
||||
(js-append-clojure-bindings bindings parts 0)))))
|
||||
|
||||
(define js-append-clojure-bindings
|
||||
(fn (bindings parts i)
|
||||
(fn (bindings (parts :as list) (i :as number))
|
||||
(when (< i (- (len bindings) 1))
|
||||
(let ((vname (if (= (type-of (nth bindings i)) "symbol")
|
||||
(symbol-name (nth bindings i))
|
||||
@@ -1105,7 +1117,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-cond
|
||||
(fn (clauses)
|
||||
(fn ((clauses :as list))
|
||||
(if (empty? clauses)
|
||||
"NIL"
|
||||
;; Detect scheme vs clojure style
|
||||
@@ -1123,7 +1135,7 @@
|
||||
(and (= (type-of test) "keyword") (= (keyword-name test) "else")))))
|
||||
|
||||
(define js-cond-scheme
|
||||
(fn (clauses)
|
||||
(fn ((clauses :as list))
|
||||
(if (empty? clauses)
|
||||
"NIL"
|
||||
(let ((clause (first clauses))
|
||||
@@ -1135,7 +1147,7 @@
|
||||
" : " (js-cond-scheme (rest clauses)) ")"))))))
|
||||
|
||||
(define js-cond-clojure
|
||||
(fn (clauses)
|
||||
(fn ((clauses :as list))
|
||||
(if (< (len clauses) 2)
|
||||
"NIL"
|
||||
(let ((test (first clauses))
|
||||
@@ -1151,14 +1163,14 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-case
|
||||
(fn (args)
|
||||
(fn ((args :as list))
|
||||
(let ((match-expr (js-expr (first args)))
|
||||
(clauses (rest args)))
|
||||
(str "(function() { var _m = " match-expr "; "
|
||||
(js-case-chain clauses) " })()"))))
|
||||
|
||||
(define js-case-chain
|
||||
(fn (clauses)
|
||||
(fn ((clauses :as list))
|
||||
(if (< (len clauses) 2)
|
||||
"return NIL;"
|
||||
(let ((test (nth clauses 0))
|
||||
@@ -1175,7 +1187,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-and
|
||||
(fn (args)
|
||||
(fn ((args :as list))
|
||||
(let ((parts (map js-expr args)))
|
||||
(if (= (len parts) 1)
|
||||
(first parts)
|
||||
@@ -1190,7 +1202,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-or
|
||||
(fn (args)
|
||||
(fn ((args :as list))
|
||||
(if (= (len args) 1)
|
||||
(js-expr (first args))
|
||||
(str "sxOr(" (join ", " (map js-expr args)) ")"))))
|
||||
@@ -1201,7 +1213,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-do
|
||||
(fn (args)
|
||||
(fn ((args :as list))
|
||||
(if (= (len args) 1)
|
||||
(js-expr (first args))
|
||||
(str "(" (join ", " (map js-expr args)) ")"))))
|
||||
@@ -1212,11 +1224,11 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-dict-literal
|
||||
(fn (pairs)
|
||||
(fn ((pairs :as list))
|
||||
(str "{" (js-dict-pairs-str pairs 0 (list)) "}")))
|
||||
|
||||
(define js-dict-pairs-str
|
||||
(fn (pairs i result)
|
||||
(fn ((pairs :as list) (i :as number) (result :as list))
|
||||
(if (>= i (- (len pairs) 1))
|
||||
(join ", " result)
|
||||
(let ((key (nth pairs i))
|
||||
@@ -1234,7 +1246,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-emit-infix
|
||||
(fn (op args)
|
||||
(fn ((op :as string) (args :as list))
|
||||
(let ((js-op (js-op-symbol op)))
|
||||
(if (and (= (len args) 1) (= op "-"))
|
||||
(str "(-" (js-expr (first args)) ")")
|
||||
@@ -1374,7 +1386,7 @@
|
||||
;; --------------------------------------------------------------------------
|
||||
|
||||
(define js-translate-file
|
||||
(fn (defines)
|
||||
(fn ((defines :as list))
|
||||
(join "\n" (map (fn (pair)
|
||||
(let ((name (first pair))
|
||||
(expr (nth pair 1)))
|
||||
|
||||
Reference in New Issue
Block a user