allow quoting :key symbols + further optimize defpart (#2592)

This should hopefully improve build times in general, especially for
files with `defpart`.
This commit is contained in:
ManDude
2023-04-30 02:46:14 +01:00
committed by GitHub
parent 44193caef0
commit d67b95c68f
11 changed files with 130 additions and 56 deletions
+12 -12
View File
@@ -697,8 +697,8 @@
(define *sparticle-fields* '())
(doenum (name val 'sp-field-id)
(append!! *sparticle-fields* (list (if (string-starts-with? (symbol->string name) "spt-")
(string-substr (symbol->string name) 4 0)
(symbol->string name))
(string->symbol (string-substr (symbol->string name) 4 0))
name)
val name (member name '(spt-vel-x
spt-vel-y
spt-vel-z
@@ -740,13 +740,13 @@
,@(apply (lambda (x)
(let* ((head (symbol->string (car x)))
(params (cdr x))
(field-name (string-substr head 1 0))
(field-name (string->symbol (string-substr head 1 0)))
(field (assoc field-name *sparticle-fields*)))
(when (not field)
(fmt #t "unknown sparticle field {}\n" x))
(when (neq? (string-ref head 0) #\:)
(fmt #t "invalid sparticle field {}\n" x))
(when (member (string->symbol field-name) *sparticle-fields-banned*)
(when (member field-name *sparticle-fields-banned*)
(fmt #t "you cannot use sparticle field {}\n" field-name))
(let* ((field-id (cadr field))
(field-enum-name (caddr field))
@@ -759,20 +759,20 @@
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
(set! last-field-id field-id)
(cond
((eq? field-name "flags")
((eq? field-name 'flags)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
)
((eq? field-name "texture")
((eq? field-name 'texture)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
)
((eq? field-name "next-launcher")
((eq? field-name 'next-launcher)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
)
((eq? field-name "sound")
((eq? field-name 'sound)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
)
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
((and (= 2 param-count) (symbol? param0) (eq? param0 ':copy))
(let* ((other-field (assoc (cadr (member ':copy params)) *sparticle-fields*))
(other-field-id (cadr other-field)))
(when (>= other-field-id field-id)
(fmt #t "warning copying to sparticle field {} - you can only copy from fields before this one!\n" field-name))
@@ -780,9 +780,9 @@
:initial-value ,(- other-field-id field-id) :random-mult 1)
)
)
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
((and (= 2 param-count) (symbol? param0) (eq? param0 ':data))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
:pntr (the-as pointer ,(cadr (member (string->symbol ":data") params))))
:pntr (the-as pointer ,(cadr (member ':data params))))
)
((and (= 1 param-count) (param-symbol? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)
+13 -13
View File
@@ -1041,8 +1041,8 @@
(define *sparticle-fields* '())
(doenum (name val 'sp-field-id)
(append!! *sparticle-fields* (list (if (string-starts-with? (symbol->string name) "spt-")
(string-substr (symbol->string name) 4 0)
(symbol->string name))
(string->symbol (string-substr (symbol->string name) 4 0))
name)
val name (member name '(spt-vel-x
spt-vel-y
spt-vel-z
@@ -1084,18 +1084,18 @@
,@(apply (lambda (x)
(let* ((head (symbol->string (car x)))
(params (cdr x))
(field-name (string-substr head 1 0))
(field-name (string->symbol (string-substr head 1 0)))
(field (assoc field-name *sparticle-fields*)))
(when (not field)
(fmt #t "unknown sparticle field {}\n" x))
(when (neq? (string-ref head 0) #\:)
(fmt #t "invalid sparticle field {}\n" x))
(when (member (string->symbol field-name) *sparticle-fields-banned*)
(when (member field-name *sparticle-fields-banned*)
(fmt #t "you cannot use sparticle field {}\n" field-name))
(let* ((field-id (cadr field))
(field-enum-name (caddr field))
(vel? (and #f (cadddr field)))
(store? (member (string->symbol ":store") params))
(store? (member ':store params))
(param-count (if store? (1- (length params)) (length params)))
(param0 (and (>= param-count 1) (first params)))
(param1 (and (>= param-count 2) (second params)))
@@ -1104,20 +1104,20 @@
(fmt #t "field {} must come after field {}, not before\n" field-name (car (nth last-field-id *sparticle-fields*))))
(set! last-field-id field-id)
(cond
((eq? field-name "flags")
((eq? field-name 'flags)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value (sp-cpuinfo-flag ,@param0) :random-mult 1)
)
((eq? field-name "texture")
((eq? field-name 'texture)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :tex ,param0 :flags (sp-flag int))
)
((eq? field-name "next-launcher")
((eq? field-name 'next-launcher)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :initial-value ,param0 :flags (sp-flag launcher))
)
((eq? field-name "sound")
((eq? field-name 'sound)
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :sound ,param0 :flags (sp-flag object))
)
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":copy"))
(let* ((other-field (assoc (symbol->string (cadr (member (string->symbol ":copy") params))) *sparticle-fields*))
((and (= 2 param-count) (symbol? param0) (eq? param0 ':copy))
(let* ((other-field (assoc (cadr (member ':copy params)) *sparticle-fields*))
(other-field-id (cadr other-field)))
(when (>= other-field-id field-id)
(fmt #t "warning copying to sparticle field {} - you can only copy from fields before this one!\n" field-name))
@@ -1125,9 +1125,9 @@
:initial-value ,(- other-field-id field-id) :random-mult 1)
)
)
((and (= 2 param-count) (symbol? param0) (eq? (symbol->string param0) ":data"))
((and (= 2 param-count) (symbol? param0) (eq? param0 ':data))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag object)
:object ,(cadr (member (string->symbol ":data") params)))
:object ,(cadr (member ':data params)))
)
((and (= 1 param-count) (param-symbol? param0))
`(new 'static 'sp-field-init-spec :field (sp-field-id ,field-enum-name) :flags (sp-flag symbol)