38 lines
1.2 KiB
Scheme
38 lines
1.2 KiB
Scheme
(pub template (list-T ?T)
|
|
(struct list-?T
|
|
((?T value)
|
|
((* list-?T) next))))
|
|
|
|
(pub template (make-list-T ?T is-public?)
|
|
(,@(if 'is-public? '(pub) '()) fn (* list-?T) make-list-?T ()
|
|
(var (* list-?T) list (cast (* list-?T) (malloc (sizeof list-?T))))
|
|
(= (-> list next) NULL)
|
|
list))
|
|
|
|
(pub template (add-value-list-T ?T is-public?)
|
|
(,@(if 'is-public? '(pub) '()) fn void add-value-list-?T ((list-?T *list) (?T value))
|
|
(while (!= (-> list next) NULL)
|
|
(= list (-> list next)))
|
|
(= (-> list next) (make-list-?T))
|
|
(= (-> list value) value)))
|
|
|
|
(pub template (length-list-T ?T is-public?)
|
|
(,@(if 'is-public? '(pub) '()) fn size-t length-list-?T ((list-?T *list))
|
|
(var size-t n 0)
|
|
(while (!= (-> list next) NULL)
|
|
(= list (-> list next))
|
|
(++ n))
|
|
n))
|
|
|
|
(pub template (is-empty-list-T ?T is-public?)
|
|
(,@(if 'is-public? '(pub) '()) fn bool is-empty-list-?T ((list-?T *list))
|
|
(== (-> list next) NULL)))
|
|
|
|
(pub template (list-for-each list-type list-var elt-type elt-var what-do)
|
|
(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))))
|