1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 20:00:19 +02:00

procedures-with-setters implemented in terms of structs

* libguile/tags.h (scm_tc7_pws): No more.

* libguile/procs.c (scm_procedure_with_setter_p)
  (scm_make_procedure_with_setter, scm_procedure, scm_setter): Implement
  procedures-with-setters in terms of applicable structs with setters.

* libguile/procs.h: Remove a big, outdated comment, and the deprecated
  macros.

* libguile/deprecated.h (SCM_PROCEDURE_WITH_SETTER_P, SCM_PROCEDURE)
  (SCM_SETTER): Deprecate these. SCM_PROCEDURE and SCM_SETTER are bad
  names.

* libguile/evalext.c (scm_self_evaluating_p):
* libguile/gc.c (scm_i_tag_name):
* libguile/goops.c: (scm_class_of):
* libguile/print.c (iprin1):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p):
* libguile/debug.c (scm_procedure_source): Remove a tc7_pws case.

* libguile/goops.h:
* libguile/goops.c (scm_class_procedure_with_setter): Remove this class;
  it is subsumed by applicable_struct_with_setter.

* libguile/struct.h: Update a comment.

* libguile/vm-i-system.c (call, goto/args, mv-call): Remove PWS cases.
This commit is contained in:
Andy Wingo 2009-12-07 09:56:58 +01:00
parent ce65df9f09
commit ea68d342f1
13 changed files with 40 additions and 134 deletions

View file

@ -46,59 +46,6 @@
(scm_tc7_gsubr | (SCM_GSUBR_MAKTYPE (req, opt, rest) << 8U))
/* Procedure-with-setter
Four representations for procedure-with-setters were
considered before selecting this one:
1. A closure where the CODE and ENV slots are used to represent
the getter and a new SETTER slot is used for the setter. The
original getter is stored as a `getter' procedure property. For
closure getters, the CODE and ENV slots contains a copy of the
getter's CODE and ENV slots. For subr getters, the CODE contains
a call to the subr.
2. A compiled closure with a call to the getter in the cclo
procedure. The getter and setter are stored in slots 1 and 2.
3. An entity (i.e. a struct with an associated procedure) with a
call to the getter in the entity procedure and the setter stored
in slot 0. The original getter is stored in slot 1.
4. A new primitive procedure type supported in the evaluator. The
getter and setter are stored in a GETTER and SETTER slot. A call
to this procedure type results in a retrieval of the getter and a
jump back to the correct eval dispatcher.
Representation 4 was selected because of efficiency and
simplicity.
Rep 1 has the advantage that there is zero penalty for closure
getters, but primitive getters will get considerable overhead
because the procedure-with-getter will be a closure which calls
the getter.
Rep 3 has the advantage that a GOOPS accessor can be a subclass of
<procedure-with-setter>, but together with rep 2 it suffers from a
three level dispatch for non-GOOPS getters:
cclo/struct --> dispatch proc --> getter
This is because the dispatch procedure must take an extra initial
argument (cclo for rep 2, struct for rep 3).
Rep 4 has the single disadvantage that it uses up one tc7 type
code, but the plan for uniform vectors will very likely free tc7
codes, so this is probably no big problem. Also note that the
GETTER and SETTER slots can live directly on the heap, using the
new four-word cells. */
#define SCM_PROCEDURE_WITH_SETTER_P(obj) (!SCM_IMP(obj) && (SCM_TYP7 (obj) == scm_tc7_pws))
#define SCM_PROCEDURE(obj) SCM_CELL_OBJECT_1 (obj)
#define SCM_SETTER(obj) SCM_CELL_OBJECT_2 (obj)
SCM_API SCM scm_c_make_subr (const char *name, long type, SCM (*fcn)());