Better types #15
@@ -75,6 +75,7 @@
|
|||||||
(('cast expr type) (list '%cast
|
(('cast expr type) (list '%cast
|
||||||
(walk-type type)
|
(walk-type type)
|
||||||
(walk-expr expr)))
|
(walk-expr expr)))
|
||||||
|
(('enum . _) (walk-enum form))
|
||||||
;; | is problematic... And c-or/bit-or/etc are actually
|
;; | is problematic... And c-or/bit-or/etc are actually
|
||||||
;; procedures, so we have to call the procedure itself
|
;; procedures, so we have to call the procedure itself
|
||||||
(('c-or . rest) (apply c-or (map walk-expr rest)))
|
(('c-or . rest) (apply c-or (map walk-expr rest)))
|
||||||
@@ -130,6 +131,7 @@
|
|||||||
((or ('struct . _)
|
((or ('struct . _)
|
||||||
('union . _)) (walk-struct form))
|
('union . _)) (walk-struct form))
|
||||||
|
|
||||||
|
(('enum . _) (walk-enum form))
|
||||||
(else
|
(else
|
||||||
(type-convert-to-c form))))
|
(type-convert-to-c form))))
|
||||||
|
|
||||||
@@ -208,6 +210,13 @@
|
|||||||
. ,(tree-map atom-to-fmt-c attrs)))
|
. ,(tree-map atom-to-fmt-c attrs)))
|
||||||
(else (error "Malformed aggregate definition " form))))
|
(else (error "Malformed aggregate definition " form))))
|
||||||
|
|
||||||
|
(define (walk-enum form)
|
||||||
|
(match form
|
||||||
|
(('enum (values ...))
|
||||||
|
`(enum ,(map atom-to-fmt-c values)))
|
||||||
|
(('enum name (values ...))
|
||||||
|
`(enum ,(atom-to-fmt-c name) ,(map atom-to-fmt-c values)))))
|
||||||
|
|
||||||
(define (walk-extern form)
|
(define (walk-extern form)
|
||||||
(match form
|
(match form
|
||||||
(('fn . _)
|
(('fn . _)
|
||||||
@@ -246,6 +255,7 @@
|
|||||||
(('pub . rest) (walk-public rest))
|
(('pub . rest) (walk-public rest))
|
||||||
((or ('struct . _)
|
((or ('struct . _)
|
||||||
('union . _)) (walk-struct form))
|
('union . _)) (walk-struct form))
|
||||||
|
(('enum . _) (walk-enum form))
|
||||||
(else (walk-expr form))))
|
(else (walk-expr form))))
|
||||||
|
|
||||||
(define (emit-c sex-forms)
|
(define (emit-c sex-forms)
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
('pub 'struct . _)) (process-struct sex-form acc))
|
('pub 'struct . _)) (process-struct sex-form acc))
|
||||||
((or ('union . _)
|
((or ('union . _)
|
||||||
('pub 'union . _)) (process-struct sex-form acc))
|
('pub 'union . _)) (process-struct sex-form acc))
|
||||||
|
((or ('enum . _)
|
||||||
|
('pub 'enum . _)) (process-struct sex-form acc))
|
||||||
((or ('var . _)
|
((or ('var . _)
|
||||||
('pub 'var . _)
|
('pub 'var . _)
|
||||||
('extern 'var . _)) (process-global-var sex-form acc))
|
('extern 'var . _)) (process-global-var sex-form acc))
|
||||||
@@ -162,7 +164,7 @@
|
|||||||
(process-fn `(fn ,ret-type ,name ,arglist ,@body) (list)))
|
(process-fn `(fn ,ret-type ,name ,arglist ,@body) (list)))
|
||||||
(else (assert #f (fmt #f "Malformed lambda " form)))))
|
(else (assert #f (fmt #f "Malformed lambda " form)))))
|
||||||
|
|
||||||
;;; Struct
|
;;; Structs
|
||||||
|
|
||||||
(define (process-struct sex-struct acc)
|
(define (process-struct sex-struct acc)
|
||||||
(cons sex-struct acc))
|
(cons sex-struct acc))
|
||||||
|
|||||||
Reference in New Issue
Block a user