2 cl-loop.h -- Common Lisp Goodness, the fast version
3 Copyright (C) 2006-2012 Sebastian Freundt
5 Author: Sebastian Freundt <hroptatyr@sxemacs.org>
7 * This file is part of SXEmacs.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
20 * 3. Neither the name of the author nor the names of any contributors
21 * may be used to endorse or promote products derived from this
22 * software without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
25 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
31 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
33 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
34 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 /* Synched up with: Not in FSF. */
39 #ifndef INCLUDED_cl_loop_h_
40 #define INCLUDED_cl_loop_h_ 1
43 #include "cl-loop-parser.h"
44 #include "ent/ent-optable.h"
45 #include "ent/ent-binary-op.h"
46 #include "ent/ent-binary-rel.h"
47 #include "ent/ent-int.h"
48 #include "ent/ent-indef.h"
50 #define EMOD_CL_DEBUG_LOOP(args...) EMOD_CL_DEBUG("[loop]: " args)
52 extern Lisp_Object Qcl_loop_sentence, Qcl_loop_sentence_p;
53 extern Lisp_Object Qcl_loop_for_clause, Qcl_loop_for_clause_p;
54 extern Lisp_Object Qcl_loop_do_clause, Qcl_loop_do_clause_p;
55 extern Lisp_Object Qcl_loop_with_clause, Qcl_loop_with_clause_p;
56 extern Lisp_Object Qcl_loop_repeat_clause, Qcl_loop_repeat_clause_p;
57 extern Lisp_Object Qcl_loop_append_clause, Qcl_loop_append_clause_p;
58 extern Lisp_Object Qcl_loop_collect_clause, Qcl_loop_collect_clause_p;
59 extern Lisp_Object Qcl_loop_nconc_clause, Qcl_loop_nconc_clause_p;
60 extern Lisp_Object Qcl_loop_return_clause, Qcl_loop_return_clause_p;
61 extern Lisp_Object Qcl_loop_initally_clause, Qcl_loop_initially_clause_p;
62 extern Lisp_Object Qcl_loop_finally_clause, Qcl_loop_finally_clause_p;
63 extern Lisp_Object Qcl_loop_count_clause, Qcl_loop_count_clause_p;
64 extern Lisp_Object Qcl_loop_sum_clause, Qcl_loop_sum_clause_p;
65 extern Lisp_Object Qcl_loop_maximise_clause, Qcl_loop_maximise_clause_p;
66 extern Lisp_Object Qcl_loop_minimise_clause, Qcl_loop_minimise_clause_p;
68 extern Lisp_Object Qfor, Qas;
69 extern Lisp_Object Qfrom, Qdownfrom, Qupfrom;
70 extern Lisp_Object Qto, Qdownto, Qupto, Qabove, Qbelow, Qby;
71 extern Lisp_Object Qin, Qon, Qthen, Qacross, Qeach, Qthe, Qbeing, Qof;
72 extern Lisp_Object Qhash_key, Qhash_keys, Qhash_value, Qhash_values, Qusing;
73 extern Lisp_Object Qdo, Qdoing;
74 extern Lisp_Object Qtoken;
75 extern Lisp_Object Qwith, Qequals, Qand;
76 extern Lisp_Object Qrepeat;
77 extern Lisp_Object Qappend, Qappending, Qcollect, Qcollecting;
78 extern Lisp_Object Qnconc, Qnconcing, Qinto;
79 extern Lisp_Object Qcount, Qcounting, Qsum, Qsumming;
80 extern Lisp_Object Qmaximise, Qmaximising;
81 extern Lisp_Object Qminimise, Qminimising;
82 extern Lisp_Object Qinitially, Qfinally;
84 /* a whole loop sentence made up from various clauses */
85 typedef struct cl_loop_sentence_s cl_loop_sentence_t;
87 typedef struct cl_loop_for_clause_s cl_loop_for_clause_t;
88 typedef struct cl_loop_do_clause_s cl_loop_do_clause_t;
89 typedef struct cl_loop_with_clause_s cl_loop_with_clause_t;
90 typedef struct cl_loop_repeat_clause_s cl_loop_repeat_clause_t;
91 typedef struct cl_loop_append_clause_s cl_loop_append_clause_t;
92 typedef struct cl_loop_accu_clause_s cl_loop_accu_clause_t;
93 typedef struct cl_loop_inifinret_clause_s cl_loop_inifinret_clause_t;
96 * tg reported that bison 2.4.1 may not define YYSTYPE, we go the
97 * utmost safe way and just define it here */
103 cl_loop_yylex(YYSTYPE*, Lisp_Object*,
104 cl_loop_sentence_t*, Lisp_Object*, Lisp_Object*);
106 cl_loop_yyerror(Lisp_Object*,
107 cl_loop_sentence_t*, Lisp_Object*, Lisp_Object*, char*);
109 cl_loop_yyparse(Lisp_Object*,
110 cl_loop_sentence_t*, Lisp_Object*, Lisp_Object*);
113 /* a loop sentence is a set of loop clauses */
114 struct cl_loop_sentence_s {
115 Lisp_Object prologue;
116 Lisp_Object epilogue;
117 Lisp_Object iteration;
123 sxe_mutex_t lsen_mtx;
127 struct cl_loop_for_clause_s {
132 FOR_ARITHMETIC_CLAUSE,
133 FOR_IN_SUBLIST_CLAUSE,
134 FOR_ON_SUBLIST_CLAUSE,
135 FOR_ACROSS_ARRAY_CLAUSE,
136 FOR_EQUALS_THEN_CLAUSE,
137 FOR_OF_HASHTABLE_CLAUSE
140 /* for the arith subclause */
144 ase_binary_operation_t byop;
145 ase_binary_relation_t torel;
148 /* for the in, on, and across subclauses */
149 Lisp_Object inonacross;
151 /* for the =-then subclause */
155 /* for the being-each-hash-key/value subclause */
156 Lisp_Object hash_keyvar;
157 Lisp_Object hash_valvar;
159 /* for parallel stepping for clauses */
165 Lisp_Object curbound;
173 struct cl_loop_do_clause_s {
177 struct cl_loop_repeat_clause_s {
182 struct cl_loop_with_clause_s {
185 /* for parallel with clauses */
190 struct cl_loop_accu_clause_s {
197 struct cl_loop_inifinret_clause_s {
202 #define CL_LOOP_SENTENCEP(_i) \
203 (DYNACATP(_i) && EQ(XDYNACAT_TYPE(_i), Qcl_loop_sentence))
204 #define CHECK_CL_LOOP_SENTENCE(x) \
206 if (!CL_LOOP_SENTENCEP(x)) \
207 dead_wrong_type_argument(Qcl_loop_sentence_p, x); \
209 #define CONCHECK_CL_LOOP_SENTENCE(x) \
211 if (!CL_LOOP_SENTENCEP(x)) \
212 x = wrong_type_argument(Qcl_loop_sentence_p, x); \
214 #define XCL_LOOP_SENTENCE(_x) ((cl_loop_sentence_t*)get_dynacat(_x))
217 extern Lisp_Object cl_loop_make_for_clause(Lisp_Object);
218 extern Lisp_Object cl_loop_make_do_clause(Lisp_Object);
219 extern Lisp_Object cl_loop_make_with_clause(Lisp_Object);
220 extern Lisp_Object cl_loop_make_repeat_clause(Lisp_Object);
221 extern Lisp_Object cl_loop_make_append_clause(Lisp_Object);
222 extern Lisp_Object cl_loop_make_collect_clause(Lisp_Object);
223 extern Lisp_Object cl_loop_make_nconc_clause(Lisp_Object);
224 extern Lisp_Object cl_loop_make_return_clause(Lisp_Object);
225 extern Lisp_Object cl_loop_make_initially_clause(Lisp_Object);
226 extern Lisp_Object cl_loop_make_finally_clause(Lisp_Object);
227 extern Lisp_Object cl_loop_make_count_clause(Lisp_Object);
228 extern Lisp_Object cl_loop_make_sum_clause(Lisp_Object);
229 extern Lisp_Object cl_loop_make_maximise_clause(Lisp_Object);
230 extern Lisp_Object cl_loop_make_minimise_clause(Lisp_Object);
233 extern void cl_loop_LTX_init(void);
234 extern void cl_loop_LTX_deinit(void);
235 extern void cl_loop_LTX_reinit(void);
237 #endif /* INCLUDED_cl_loop_h_ */