diff options
Diffstat (limited to 'stdlib/struct.tl')
-rw-r--r-- | stdlib/struct.tl | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/stdlib/struct.tl b/stdlib/struct.tl index 4f120eef..f0806723 100644 --- a/stdlib/struct.tl +++ b/stdlib/struct.tl @@ -48,7 +48,8 @@ (compile-error form "bad syntax: dotted form")) (let ((instance-init-form nil) (instance-postinit-form nil) - (instance-fini-form nil)) + (instance-fini-form nil) + (instance-postfini-form nil)) (labels ((expand-slot (form slot) (tree-case slot ((op . args) @@ -102,6 +103,15 @@ (set instance-fini-form (cons arg body)) ^((,word nil nil))) + (:postfini + (unless (bindable arg) + (sys:bad-slot-syntax form slot)) + (when instance-postfini-form + (compile-error form + "duplicate :postfini")) + (set instance-postfini-form + (cons arg body)) + ^((,word nil nil))) (t (when body (sys:bad-slot-syntax form slot)) :))) @@ -158,12 +168,16 @@ ,*(mapcar (aret ^(when (static-slot-p ,arg-sym ',@2) (static-slot-set ,arg-sym ',@2 ,@3))) (append func-si-forms val-si-forms)))) - ,(if (or inst-si-forms instance-init-form instance-fini-form) + ,(if (or inst-si-forms instance-init-form + instance-fini-form instance-postfini-form) ^(lambda (,arg-sym) ,*(if (cdr instance-fini-form) ^((finalize ,arg-sym (lambda (,(car instance-fini-form)) ,*(cdr instance-fini-form)) t))) + ,*(if (cdr instance-postfini-form) + ^((finalize ,arg-sym (lambda (,(car instance-postfini-form)) + ,*(cdr instance-postfini-form))))) ,*(if inst-si-forms ^((let ((,type-sym (struct-type ,arg-sym))) ,*(mapcar (aret ^(unless (static-slot-p ,type-sym ',@2) |