summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-07-09 11:24:01 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-07-09 11:24:01 -0700
commit73890bf51805d416936b0d1e7ef87e6fe840010e (patch)
tree85f59e4d9e69e60c5c3fcd970b39b0755fa6d462 /share
parent778c54a4931fb19546792d1e2a9f30cd9dc5105c (diff)
downloadtxr-73890bf51805d416936b0d1e7ef87e6fe840010e.tar.gz
txr-73890bf51805d416936b0d1e7ef87e6fe840010e.tar.bz2
txr-73890bf51805d416936b0d1e7ef87e6fe840010e.zip
structs: improve access to initfun and postinitfun.
In this change, a struct type's initfun and postinitfun become mutable. This is achieved by modeling them as the pseudo-static-slots :initfun and :postinitfun. Effectively these now behave as reserved names which do not denote static slots but these special functions. * eval.c (lookup_fun): When (meth type slot) syntax is encountered, treat the slot names :init and :postinit specially: retrieve these special functions instead of accessing static slots. * share/txr/stdlib/place.tl (sys:get-fun-getter-setter): Similarly, when handling (meth type slot) syntax, return the alternative getter/setter functions for the special functions, not the static slot accessing functions. Also, getting rid of a useless @1 here in existing code, since (op foo @1) is equivalent to (op foo). * share/txr/stdlib/struct.tl (sys:defmeth): Check for the special names :init and :postinit, handling these through the appropriate setter functions rather than static-slot-ensure. * struct.c (init_k, postinit_k): New keyword symbol variables. (struct_init): Initialize init_k and postinit_k. Register intrinsics struct-get-initfun, struct-set-initfun, struct-get-postinitfun and struct-set-postinitfun. * (struct_get_initfun, struct_set_initfun, struct_get_postinitfun, struct_set_postinitfun): New functions. (method_name): For each struct type visited, check whether the function is the initfun or postinitfun and return the appropriate meth syntax if so. * struct.h (init_k, postinit_k, struct_get_initfun, struct_set_initfun, struct_get_postinitfun, struct_set_postinitfun): Declared. * txr.1: Documented. Updated description of method-name, defmeth, and documented new functions.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/place.tl9
-rw-r--r--share/txr/stdlib/struct.tl5
2 files changed, 11 insertions, 3 deletions
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl
index 2e15118b..90251726 100644
--- a/share/txr/stdlib/place.tl
+++ b/share/txr/stdlib/place.tl
@@ -803,8 +803,13 @@
(tree-case sym
((type struct slot)
(if (eq type 'meth)
- (cons (op static-slot struct slot)
- (op static-slot-set struct slot @1))
+ (caseql slot
+ (:init (cons (op struct-get-initfun struct)
+ (op struct-set-initfun struct)))
+ (:postinit (cons (op struct-get-postinitfun struct)
+ (op struct-set-postinitfun struct)))
+ (t (cons (op static-slot struct slot)
+ (op static-slot-set struct slot))))
:))
((type sym)
(if (eq type 'macro)
diff --git a/share/txr/stdlib/struct.tl b/share/txr/stdlib/struct.tl
index 8548e03a..68b86c95 100644
--- a/share/txr/stdlib/struct.tl
+++ b/share/txr/stdlib/struct.tl
@@ -286,7 +286,10 @@
^[(fun umethod) ',slot ,*bound-args])
(defun sys:defmeth (type-sym name fun)
- (static-slot-ensure type-sym name fun)
+ (caseq name
+ (:init (struct-set-initfun type-sym fun))
+ (:postinit (struct-set-postinitfun type-sym fun))
+ (t (static-slot-ensure type-sym name fun)))
^(meth ,type-sym ,name))
(defmacro defmeth (:form form type-sym name arglist . body)