fix
[bpt/guile.git] / libguile / procs.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
3#ifndef PROCSH
4#define PROCSH
7dc6e754 5/* Copyright (C) 1995,1996,1998 Free Software Foundation, Inc.
0f2d19dd
JB
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this software; see the file COPYING. If not, write to
82892bed
JB
19 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 * Boston, MA 02111-1307 USA
0f2d19dd
JB
21 *
22 * As a special exception, the Free Software Foundation gives permission
23 * for additional uses of the text contained in its release of GUILE.
24 *
25 * The exception is that, if you link the GUILE library with other files
26 * to produce an executable, this does not by itself cause the
27 * resulting executable to be covered by the GNU General Public License.
28 * Your use of that executable is in no way restricted on account of
29 * linking the GUILE library code into it.
30 *
31 * This exception does not however invalidate any other reasons why
32 * the executable file might be covered by the GNU General Public License.
33 *
34 * This exception applies only to the code released by the
35 * Free Software Foundation under the name GUILE. If you copy
36 * code from other Free Software Foundation releases into a copy of
37 * GUILE, as the General Public License permits, the exception does
38 * not apply to the code that you add in this way. To avoid misleading
39 * anyone as to the status of such modified files, you must delete
40 * this exception notice from them.
41 *
42 * If you write modifications of your own for GUILE, it is your choice
43 * whether to permit this exception to apply to your modifications.
82892bed 44 * If you do not wish that, delete this exception notice. */
0f2d19dd
JB
45\f
46
b4309c3c 47#include "libguile/__scm.h"
0f2d19dd
JB
48
49\f
50
51
52/* Subrs
53 */
54
55typedef struct scm_subr
56{
57 long sname;
58 SCM (*cproc) ();
59} scm_subr;
60
61typedef struct scm_iproc
62{
63 char *scm_string;
64 SCM (*cproc) ();
65} scm_iproc;
66
67typedef struct scm_dsubr
68{
69 long sname;
70 double (*dproc) ();
71} scm_dsubr;
72
73#define SCM_SNAME(x) ((SCM_CAR(x)>>8)?(SCM)(scm_heap_org+(SCM_CAR(x)>>8)):scm_nullstr)
74#define SCM_SUBRF(x) (((scm_subr *)(SCM2PTR(x)))->cproc)
75#define SCM_DSUBRF(x) (((scm_dsubr *)(SCM2PTR(x)))->dproc)
76#define SCM_CCLO_SUBR(x) (SCM_VELTS(x)[0])
77
78/* Closures
79 */
80
81#define SCM_CLOSUREP(x) (SCM_TYP3(x)==scm_tc3_closure)
82#define SCM_CLOSCAR(x) (SCM_CAR(x)-scm_tc3_closure)
83#define SCM_CODE(x) SCM_CAR(SCM_CLOSCAR (x))
84#define SCM_PROCPROPS(x) SCM_CDR(SCM_CLOSCAR (x))
a6c64c3c
MD
85#define SCM_SETPROCPROPS(x, p) SCM_SETCDR(SCM_CLOSCAR (x), p)
86#define SCM_SETCODE(x, e) (SCM_SETCAR (x, scm_cons ((e), SCM_EOL) + scm_tc3_closure))
0f2d19dd 87#define SCM_ENV(x) SCM_CDR(x)
a6c64c3c 88#define SCM_SETENV(x, e) SCM_SETCDR (x, e)
0f2d19dd
JB
89#define SCM_TOP_LEVEL(SCM_ENV) (SCM_NULLP(SCM_ENV) || (SCM_BOOL_T == scm_procedure_p (SCM_CAR (SCM_ENV))))
90
03f27074
JB
91/* Procedure-with-setter
92
93 Four representations for procedure-with-setters were
94 considered before selecting this one:
95
96 1. A closure where the CODE and ENV slots are used to represent
97 the getter and a new SETTER slot is used for the setter. The
98 original getter is stored as a `getter' procedure property. For
99 closure getters, the CODE and ENV slots contains a copy of the
100 getter's CODE and ENV slots. For subr getters, the CODE contains
101 a call to the subr.
102
103 2. A compiled closure with a call to the getter in the cclo
104 procedure. The getter and setter are stored in slots 1 and 2.
105
106 3. An entity (i.e. a struct with an associated procedure) with a
107 call to the getter in the entity procedure and the setter stored
108 in slot 0. The original getter is stored in slot 1.
109
110 4. A new primitive procedure type supported in the evaluator. The
111 getter and setter are stored in a GETTER and SETTER slot. A call
112 to this procedure type results in a retrieval of the getter and a
113 jump back to the correct eval dispatcher.
114
115 Representation 4 was selected because of efficiency and
116 simplicity.
117
118 Rep 1 has the advantage that there is zero penalty for closure
119 getters, but primitive getters will get considerable overhead
120 because the procedure-with-getter will be a closure which calls
121 the getter.
122
123 Rep 3 has the advantage that a GOOPS accessor can be a subclass of
124 <procedure-with-setter>, but together with rep 2 it suffers from a
125 three level dispatch for non-GOOPS getters:
126
127 cclo/struct --> dispatch proc --> getter
128
129 This is because the dispatch procedure must take an extra initial
130 argument (cclo for rep 2, struct for rep 3).
131
132 Rep 4 has the single disadvantage that it uses up one tc7 type
133 code, but the plan for uniform vectors will very likely free tc7
134 codes, so this is probably no big problem. Also note that the
135 GETTER and SETTER slots can live directly on the heap, using the
136 new four-word cells. */
137
64c4580b
MD
138#define SCM_PROCEDURE_WITH_SETTER_P(obj) (SCM_TYP7 (obj) == scm_tc7_pws)
139#define SCM_PROCEDURE(obj) SCM_CADR (obj)
140#define SCM_SETTER(obj) SCM_CDDR (obj)
141
0f2d19dd
JB
142\f
143
3eeba8d4
JB
144extern SCM scm_make_subr SCM_P ((const char *name, int type, SCM (*fcn) ()));
145extern SCM scm_make_subr_opt SCM_P ((const char *name,
146 int type,
147 SCM (*fcn) (),
1cc91f1b
JB
148 int set));
149extern SCM scm_makcclo SCM_P ((SCM proc, long len));
150extern SCM scm_procedure_p SCM_P ((SCM obj));
87688f5f 151extern SCM scm_closure_p SCM_P ((SCM obj));
1cc91f1b 152extern SCM scm_thunk_p SCM_P ((SCM obj));
c2c82fba 153extern SCM scm_procedure_documentation SCM_P ((SCM proc));
64c4580b
MD
154extern SCM scm_procedure_with_setter_p SCM_P ((SCM obj));
155extern SCM scm_make_procedure_with_setter SCM_P ((SCM procedure, SCM setter));
156extern SCM scm_procedure SCM_P ((SCM proc));
157extern SCM scm_setter SCM_P ((SCM proc));
3eeba8d4 158extern void scm_init_iprocs SCM_P ((const scm_iproc *subra, int type));
1cc91f1b 159extern void scm_init_procs SCM_P ((void));
0f2d19dd 160
f3667f52
JB
161#ifdef GUILE_DEBUG
162extern SCM scm_make_cclo SCM_P ((SCM proc, SCM len));
163#endif /*GUILE_DEBUG*/
164
1cc91f1b 165\f
0f2d19dd 166#endif /* PROCSH */