summaryrefslogtreecommitdiff
path: root/libguile/eval.c
diff options
context:
space:
mode:
authorMikael Djurfeldt <djurfeldt@nada.kth.se>1999-07-29 09:54:10 +0000
committerMikael Djurfeldt <djurfeldt@nada.kth.se>1999-07-29 09:54:10 +0000
commitca4be6ea9e3116af708019f812479eeeb850bf56 (patch)
treefcdf749853cc4f7f9bfa4e86c5f20630b0fca7d7 /libguile/eval.c
parent294b1b2e3eba176d66ecc873b61de3fd1fd7ec30 (diff)
downloadguile-ca4be6ea9e3116af708019f812479eeeb850bf56.tar.gz
* eval.c (SCM_IM_DISPATCH, SCM_IM_HASH_DISPATCH): Don't use
improper lists in the low-level representation, since that will cause a begin to be prepended at macro expansion. * eval.c, tags.h, print.c (SCM_IM_SLOT_REF, SCM_IM_SLOT_SET_X): New isym operations.
Diffstat (limited to 'libguile/eval.c')
-rw-r--r--libguile/eval.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/libguile/eval.c b/libguile/eval.c
index 1c48d72c0..6ea0ca1a4 100644
--- a/libguile/eval.c
+++ b/libguile/eval.c
@@ -2077,7 +2077,7 @@ dispatch:
{
int i, end, mask;
mask = -1;
- proc = SCM_CDR (x);
+ proc = SCM_CADR (x);
i = 0;
end = SCM_LENGTH (proc);
find_method:
@@ -2093,7 +2093,7 @@ dispatch:
arg2 = SCM_CDR (arg2);
}
while (SCM_NIMP (t.arg1));
- x = SCM_CAR (arg2);
+ x = arg2;
env = scm_cons (SCM_CAR (env), SCM_CDR (arg2));
goto begin;
next_method:
@@ -2106,7 +2106,7 @@ dispatch:
{
int hashset = SCM_INUM (SCM_CADR (x));
mask = SCM_INUM (SCM_CADDR (x));
- proc = SCM_CDDDR (x);
+ proc = SCM_CADDDR (x);
i = 0;
t.arg1 = SCM_CDDAR (env);
do
@@ -2121,6 +2121,19 @@ dispatch:
goto find_method;
}
+ case (SCM_ISYMNUM (SCM_IM_SLOT_REF)):
+ x = SCM_CDR (x);
+ t.arg1 = EVALCAR (x, env);
+ RETURN (SCM_STRUCT_DATA (t.arg1)[SCM_INUM (SCM_CADR (x))]);
+
+ case (SCM_ISYMNUM (SCM_IM_SLOT_SET_X)):
+ x = SCM_CDR (x);
+ t.arg1 = EVALCAR (x, env);
+ x = SCM_CDR (x);
+ proc = SCM_CDR (x);
+ RETURN (SCM_STRUCT_DATA (t.arg1)[SCM_INUM (SCM_CAR (x))]
+ = EVALCAR (proc, env));
+
case (SCM_ISYMNUM (SCM_IM_NIL_COND)):
proc = SCM_CDR (x);
while (SCM_NIMP (x = SCM_CDR (proc)))