2 cl-loop.h -- Common Lisp Goodness, the fast version
3 Copyright (C) 2006, 2007 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"
45 #define EMOD_CL_DEBUG_LOOP(args...) EMOD_CL_DEBUG("[loop]: " args)
47 extern Lisp_Object Qcl_loop_sentence, Qcl_loop_sentence_p;
48 extern Lisp_Object Qcl_loop_for_clause, Qcl_loop_for_clause_p;
49 extern Lisp_Object Qcl_loop_do_clause, Qcl_loop_do_clause_p;
50 extern Lisp_Object Qcl_loop_with_clause, Qcl_loop_with_clause_p;
51 extern Lisp_Object Qcl_loop_repeat_clause, Qcl_loop_repeat_clause_p;
52 extern Lisp_Object Qcl_loop_append_clause, Qcl_loop_append_clause_p;
53 extern Lisp_Object Qcl_loop_collect_clause, Qcl_loop_collect_clause_p;
54 extern Lisp_Object Qcl_loop_nconc_clause, Qcl_loop_nconc_clause_p;
55 extern Lisp_Object Qcl_loop_return_clause, Qcl_loop_return_clause_p;
56 extern Lisp_Object Qcl_loop_initally_clause, Qcl_loop_initially_clause_p;
57 extern Lisp_Object Qcl_loop_finally_clause, Qcl_loop_finally_clause_p;
58 extern Lisp_Object Qcl_loop_count_clause, Qcl_loop_count_clause_p;
59 extern Lisp_Object Qcl_loop_sum_clause, Qcl_loop_sum_clause_p;
60 extern Lisp_Object Qcl_loop_maximise_clause, Qcl_loop_maximise_clause_p;
61 extern Lisp_Object Qcl_loop_minimise_clause, Qcl_loop_minimise_clause_p;
63 extern Lisp_Object Qfor, Qas;
64 extern Lisp_Object Qfrom, Qdownfrom, Qupfrom;
65 extern Lisp_Object Qto, Qdownto, Qupto, Qabove, Qbelow, Qby;
66 extern Lisp_Object Qin, Qon, Qthen, Qacross, Qeach, Qthe, Qbeing, Qof;
67 extern Lisp_Object Qhash_key, Qhash_keys, Qhash_value, Qhash_values, Qusing;
68 extern Lisp_Object Qdo, Qdoing;
69 extern Lisp_Object Qtoken;
70 extern Lisp_Object Qwith, Qequals, Qand;
71 extern Lisp_Object Qrepeat;
72 extern Lisp_Object Qappend, Qappending, Qcollect, Qcollecting;
73 extern Lisp_Object Qnconc, Qnconcing, Qinto;
74 extern Lisp_Object Qcount, Qcounting, Qsum, Qsumming;
75 extern Lisp_Object Qmaximise, Qmaximising;
76 extern Lisp_Object Qminimise, Qminimising;
77 extern Lisp_Object Qinitially, Qfinally;
79 /* a whole loop sentence made up from various clauses */
80 typedef struct cl_loop_sentence_s cl_loop_sentence_t;
82 typedef struct cl_loop_for_clause_s cl_loop_for_clause_t;
83 typedef struct cl_loop_do_clause_s cl_loop_do_clause_t;
84 typedef struct cl_loop_with_clause_s cl_loop_with_clause_t;
85 typedef struct cl_loop_repeat_clause_s cl_loop_repeat_clause_t;
86 typedef struct cl_loop_append_clause_s cl_loop_append_clause_t;
87 typedef struct cl_loop_accu_clause_s cl_loop_accu_clause_t;
88 typedef struct cl_loop_inifinret_clause_s cl_loop_inifinret_clause_t;
91 * tg reported that bison 2.4.1 may not define YYSTYPE, we go the
92 * utmost safe way and just define it here */
98 cl_loop_yylex(YYSTYPE*, Lisp_Object*,
99 cl_loop_sentence_t*, Lisp_Object*, Lisp_Object*);
101 cl_loop_yyerror(Lisp_Object*,
102 cl_loop_sentence_t*, Lisp_Object*, Lisp_Object*, char*);
104 cl_loop_yyparse(Lisp_Object*,
105 cl_loop_sentence_t*, Lisp_Object*, Lisp_Object*);
108 /* a loop sentence is a set of loop clauses */
109 struct cl_loop_sentence_s {
110 Lisp_Object prologue;
111 Lisp_Object epilogue;
112 Lisp_Object iteration;
118 sxe_mutex_t lsen_mtx;
122 struct cl_loop_for_clause_s {
127 FOR_ARITHMETIC_CLAUSE,
128 FOR_IN_SUBLIST_CLAUSE,
129 FOR_ON_SUBLIST_CLAUSE,
130 FOR_ACROSS_ARRAY_CLAUSE,
131 FOR_EQUALS_THEN_CLAUSE,
132 FOR_OF_HASHTABLE_CLAUSE
135 /* for the arith subclause */
139 ase_binary_operation_t byop;
140 ase_binary_relation_t torel;
143 /* for the in, on, and across subclauses */
144 Lisp_Object inonacross;
146 /* for the =-then subclause */
150 /* for the being-each-hash-key/value subclause */
151 Lisp_Object hash_keyvar;
152 Lisp_Object hash_valvar;
154 /* for parallel stepping for clauses */
160 Lisp_Object curbound;
168 struct cl_loop_do_clause_s {
172 struct cl_loop_repeat_clause_s {
177 struct cl_loop_with_clause_s {
180 /* for parallel with clauses */
185 struct cl_loop_accu_clause_s {
192 struct cl_loop_inifinret_clause_s {
197 #define CL_LOOP_SENTENCEP(_i) \
198 (DYNACATP(_i) && EQ(XDYNACAT_TYPE(_i), Qcl_loop_sentence))
199 #define CHECK_CL_LOOP_SENTENCE(x) \
201 if (!CL_LOOP_SENTENCEP(x)) \
202 dead_wrong_type_argument(Qcl_loop_sentence_p, x); \
204 #define CONCHECK_CL_LOOP_SENTENCE(x) \
206 if (!CL_LOOP_SENTENCEP(x)) \
207 x = wrong_type_argument(Qcl_loop_sentence_p, x); \
209 #define XCL_LOOP_SENTENCE(_x) ((cl_loop_sentence_t*)get_dynacat(_x))
212 extern Lisp_Object cl_loop_make_for_clause(Lisp_Object);
213 extern Lisp_Object cl_loop_make_do_clause(Lisp_Object);
214 extern Lisp_Object cl_loop_make_with_clause(Lisp_Object);
215 extern Lisp_Object cl_loop_make_repeat_clause(Lisp_Object);
216 extern Lisp_Object cl_loop_make_append_clause(Lisp_Object);
217 extern Lisp_Object cl_loop_make_collect_clause(Lisp_Object);
218 extern Lisp_Object cl_loop_make_nconc_clause(Lisp_Object);
219 extern Lisp_Object cl_loop_make_return_clause(Lisp_Object);
220 extern Lisp_Object cl_loop_make_initially_clause(Lisp_Object);
221 extern Lisp_Object cl_loop_make_finally_clause(Lisp_Object);
222 extern Lisp_Object cl_loop_make_count_clause(Lisp_Object);
223 extern Lisp_Object cl_loop_make_sum_clause(Lisp_Object);
224 extern Lisp_Object cl_loop_make_maximise_clause(Lisp_Object);
225 extern Lisp_Object cl_loop_make_minimise_clause(Lisp_Object);
228 extern void cl_loop_LTX_init(void);
229 extern void cl_loop_LTX_deinit(void);
230 extern void cl_loop_LTX_reinit(void);
232 #endif /* INCLUDED_cl_loop_h_ */