17
18
#include <ecl/ecl.h>
19
#include <ecl/internal.h>
20
prepare_map(cl_va_list lists, cl_index *cdrs_sp)
22
prepare_map(cl_va_list lists, cl_object cdrs_frame, cl_object cars_frame)
22
cl_index i, nlist = lists[0].narg;
24
*cdrs_sp = cl_stack_index();
25
ecl_stack_frame_push_va_list(cdrs_frame, lists);
26
if (cdrs_frame->frame.narg == 0) {
26
27
FEprogram_error("MAP*: Too few arguments.", 0);
27
cl_stack_push_va_list(lists);
28
for (i = 0; i<nlist; i++)
29
ecl_stack_frame_reserve(cars_frame, cdrs_frame->frame.narg);
30
for (i = 0; i < cars_frame->frame.narg; i++) {
31
ecl_stack_frame_elt_set(cars_frame, i, Cnil);
33
35
@(defun mapcar (fun &rest lists)
34
36
cl_object res, *val = &res;
35
cl_index i, nlist, cdrs_sp;
37
nlist = prepare_map(lists, &cdrs_sp);
39
ECL_BUILD_STACK_FRAME(cars_frame);
40
ECL_BUILD_STACK_FRAME(cdrs_frame);
41
prepare_map(lists, cdrs_frame, cars_frame);
40
/* INV: The stack does not grow here. */
41
cl_object *cdrs = cl_env.stack + cdrs_sp;
42
cl_object *cars = cdrs + nlist;
43
for (i = 0; i < nlist; i++) {
44
if (ecl_endp(cdrs[i])) {
45
cl_stack_set_index(cdrs_sp);
45
for (i = 0; i < cdrs_frame->frame.narg; i++) {
46
cl_object cdr = ecl_stack_frame_elt(cdrs_frame, i);
48
ecl_stack_frame_close(cars_frame);
49
ecl_stack_frame_close(cdrs_frame);
48
cars[i] = CAR(cdrs[i]);
49
cdrs[i] = CDR(cdrs[i]);
52
ecl_stack_frame_elt_set(cars_frame, i, CAR(cdr));
53
ecl_stack_frame_elt_set(cdrs_frame, i, CDR(cdr));
51
*val = CONS(cl_apply_from_stack(nlist, fun), Cnil);
55
*val = CONS(ecl_apply_from_stack_frame(cars_frame, fun), Cnil);
56
60
@(defun maplist (fun &rest lists)
57
61
cl_object res, *val = &res;
58
cl_index i, nlist, cdrs_sp;
60
nlist = prepare_map(lists, &cdrs_sp);
63
ECL_BUILD_STACK_FRAME(cars_frame);
64
ECL_BUILD_STACK_FRAME(cdrs_frame);
65
prepare_map(lists, cdrs_frame, cars_frame);
63
cl_object *cdrs = cl_env.stack + cdrs_sp;
64
cl_object *cars = cdrs + nlist;
65
for (i = 0; i < nlist; i++) {
66
if (ecl_endp(cdrs[i])) {
67
cl_stack_set_index(cdrs_sp);
69
for (i = 0; i < cdrs_frame->frame.narg; i++) {
70
cl_object cdr = ecl_stack_frame_elt(cdrs_frame, i);
72
ecl_stack_frame_close(cars_frame);
73
ecl_stack_frame_close(cdrs_frame);
71
cdrs[i] = CDR(cdrs[i]);
76
ecl_stack_frame_elt_set(cars_frame, i, cdr);
77
ecl_stack_frame_elt_set(cdrs_frame, i, CDR(cdr));
73
*val = CONS(cl_apply_from_stack(nlist, fun), Cnil);
79
*val = CONS(ecl_apply_from_stack_frame(cars_frame, fun), Cnil);
78
84
@(defun mapc (fun &rest lists)
80
cl_index i, nlist, cdrs_sp;
82
nlist = prepare_map(lists, &cdrs_sp);
83
onelist = cl_env.stack[cdrs_sp];
87
ECL_BUILD_STACK_FRAME(cars_frame);
88
ECL_BUILD_STACK_FRAME(cdrs_frame);
89
prepare_map(lists, cdrs_frame, cars_frame);
90
onelist = ecl_stack_frame_elt(cdrs_frame, 0);
85
cl_object *cdrs = cl_env.stack + cdrs_sp;
86
cl_object *cars = cdrs + nlist;
87
for (i = 0; i < nlist; i++) {
88
if (ecl_endp(cdrs[i])) {
89
cl_stack_set_index(cdrs_sp);
93
for (i = 0; i < cdrs_frame->frame.narg; i++) {
94
cl_object cdr = ecl_stack_frame_elt(cdrs_frame, i);
96
ecl_stack_frame_close(cars_frame);
97
ecl_stack_frame_close(cdrs_frame);
92
cars[i] = CAR(cdrs[i]);
93
cdrs[i] = CDR(cdrs[i]);
100
ecl_stack_frame_elt_set(cars_frame, i, CAR(cdr));
101
ecl_stack_frame_elt_set(cdrs_frame, i, CDR(cdr));
95
cl_apply_from_stack(nlist, fun);
103
ecl_apply_from_stack_frame(cars_frame, fun);
99
107
@(defun mapl (fun &rest lists)
100
108
cl_object onelist;
101
cl_index i, nlist, cdrs_sp;
103
nlist = prepare_map(lists, &cdrs_sp);
104
onelist = cl_env.stack[cdrs_sp];
110
ECL_BUILD_STACK_FRAME(cars_frame);
111
ECL_BUILD_STACK_FRAME(cdrs_frame);
112
prepare_map(lists, cdrs_frame, cars_frame);
113
onelist = ecl_stack_frame_elt(cdrs_frame, 0);
106
cl_object *cdrs = cl_env.stack + cdrs_sp;
107
cl_object *cars = cdrs + nlist;
108
for (i = 0; i < nlist; i++) {
109
if (ecl_endp(cdrs[i])) {
110
cl_stack_set_index(cdrs_sp);
116
for (i = 0; i < cdrs_frame->frame.narg; i++) {
117
cl_object cdr = ecl_stack_frame_elt(cdrs_frame, i);
119
ecl_stack_frame_close(cars_frame);
120
ecl_stack_frame_close(cdrs_frame);
111
121
@(return onelist)
114
cdrs[i] = CDR(cdrs[i]);
123
ecl_stack_frame_elt_set(cars_frame, i, cdr);
124
ecl_stack_frame_elt_set(cdrs_frame, i, CDR(cdr));
116
cl_apply_from_stack(nlist, fun);
126
ecl_apply_from_stack_frame(cars_frame, fun);
120
130
@(defun mapcan (fun &rest lists)
121
131
cl_object res, *val = &res;
122
cl_index i, nlist, cdrs_sp;
124
nlist = prepare_map(lists, &cdrs_sp);
133
ECL_BUILD_STACK_FRAME(cars_frame);
134
ECL_BUILD_STACK_FRAME(cdrs_frame);
135
prepare_map(lists, cdrs_frame, cars_frame);
127
cl_object *cdrs = cl_env.stack + cdrs_sp;
128
cl_object *cars = cdrs + nlist;
129
for (i = 0; i < nlist; i++) {
130
if (ecl_endp(cdrs[i])) {
131
cl_stack_set_index(cdrs_sp);
139
for (i = 0; i < cdrs_frame->frame.narg; i++) {
140
cl_object cdr = ecl_stack_frame_elt(cdrs_frame, i);
142
ecl_stack_frame_close(cars_frame);
143
ecl_stack_frame_close(cdrs_frame);
134
cars[i] = CAR(cdrs[i]);
135
cdrs[i] = CDR(cdrs[i]);
146
ecl_stack_frame_elt_set(cars_frame, i, CAR(cdr));
147
ecl_stack_frame_elt_set(cdrs_frame, i, CDR(cdr));
137
*val = cl_apply_from_stack(nlist, fun);
149
*val = ecl_apply_from_stack_frame(cars_frame, fun);
138
150
while (CONSP(*val))
139
151
val = &CDR(*val);
143
155
@(defun mapcon (fun &rest lists)
144
156
cl_object res, *val = &res;
145
cl_index i, nlist, cdrs_sp;
147
nlist = prepare_map(lists, &cdrs_sp);
158
ECL_BUILD_STACK_FRAME(cars_frame);
159
ECL_BUILD_STACK_FRAME(cdrs_frame);
160
prepare_map(lists, cdrs_frame, cars_frame);
150
cl_object *cdrs = cl_env.stack + cdrs_sp;
151
cl_object *cars = cdrs + nlist;
152
for (i = 0; i < nlist; i++) {
153
if (ecl_endp(cdrs[i])) {
154
cl_stack_set_index(cdrs_sp);
164
for (i = 0; i < cdrs_frame->frame.narg; i++) {
165
cl_object cdr = ecl_stack_frame_elt(cdrs_frame, i);
167
ecl_stack_frame_close(cars_frame);
168
ecl_stack_frame_close(cdrs_frame);
158
cdrs[i] = CDR(cdrs[i]);
171
ecl_stack_frame_elt_set(cars_frame, i, cdr);
172
ecl_stack_frame_elt_set(cdrs_frame, i, CDR(cdr));
160
*val = cl_apply_from_stack(nlist, fun);
174
*val = ecl_apply_from_stack_frame(cars_frame, fun);
161
175
while (CONSP(*val))
162
176
val = &CDR(*val);