47 lines
1.7 KiB
Scheme
47 lines
1.7 KiB
Scheme
(pub defmacro (list-T type)
|
|
(let ((list-type (cat 'list- type)))
|
|
`(struct ,list-type
|
|
((,type value)
|
|
((* ,list-type) next)))))
|
|
|
|
(pub defmacro (make-list-T type is-public?)
|
|
(let ((list-type (cat 'list- type))
|
|
(fn-name (cat 'make-list- type)))
|
|
`(,@(if is-public? '(pub) '()) fn (* ,list-type) ,fn-name ()
|
|
(var (* ,list-type) list (cast (* ,list-type) (malloc (sizeof ,list-type))))
|
|
(= (-> list next) NULL)
|
|
(return list))))
|
|
|
|
(pub defmacro (add-value-list-T type is-public?)
|
|
(let ((list-type (cat 'list- type))
|
|
(fn-name (cat 'add-value-list- type)))
|
|
`(,@(if is-public? '(pub) '()) fn void ,fn-name ((,list-type *list) (,type value))
|
|
(while (!= (-> list next) NULL)
|
|
(= list (-> list next)))
|
|
(= (-> list next) (,(cat 'make-list- type)))
|
|
(= (-> list value) value))))
|
|
|
|
(pub defmacro (length-list-T type is-public?)
|
|
(let ((fn-name (cat 'length-list- type))
|
|
(list-type (cat 'list- type)))
|
|
`(,@(if is-public? '(pub) '()) fn size-t ,fn-name ((,list-type *list))
|
|
(var size-t n 0)
|
|
(while (!= (-> list next) NULL)
|
|
(= list (-> list next))
|
|
(++ n))
|
|
(return n))))
|
|
|
|
(pub defmacro (is-empty-list-T type is-public?)
|
|
`(,@(if is-public? '(pub) '()) fn bool ,(cat 'is-empty-list- type)
|
|
((,(cat 'list- type) *list))
|
|
(return (== (-> list next) NULL))))
|
|
|
|
(pub defmacro (list-for-each list-type list-var elt-type elt-var what-do)
|
|
(let ((list-var-2 (cat list-var '-2)))
|
|
`((var (pointer ,list-type) ,list-var-2 ,list-var)
|
|
(var ,elt-type ,elt-var (-> ,list-var-2 value))
|
|
(while (!= (-> ,list-var-2 next) NULL)
|
|
,what-do
|
|
(= ,list-var-2 (-> ,list-var-2 next))
|
|
(= ,elt-var (-> ,list-var-2 value))))))
|