remove more Racket-to-C compiler leftovers
This commit is contained in:
parent
3da3e17c47
commit
ea3cabfc45
|
@ -1,366 +0,0 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define GLOBAL_VARREF(x) ((x)->val ? (Scheme_Object *)(x)->val : \
|
||||
(scheme_unbound_global(x), (Scheme_Object *)NULL))
|
||||
#define CHECK_GLOBAL_BOUND(x) \
|
||||
if (!(x)->val) scheme_raise_exn(MZEXN_UNIT, \
|
||||
"invoke-unit: cannot link to undefined identifier: %S", \
|
||||
(Scheme_Object*)(x)->key);
|
||||
|
||||
#ifdef NO_INLINE_KEYWORD
|
||||
# define MZC_INLINE /* */
|
||||
#else
|
||||
# define MZC_INLINE MSC_IZE(inline)
|
||||
#endif
|
||||
|
||||
#define MZC_GLOBAL_PREPARE(vec, pos) (SCHEME_VEC_ELS(vec)[pos] = SCHEME_PTR1_VAL(SCHEME_VEC_ELS(vec)[pos]))
|
||||
static MZC_INLINE Scheme_Object *MZC_GLOBAL_LOOKUP(Scheme_Object *vec, int pos) {
|
||||
Scheme_Bucket *bucket = (Scheme_Bucket *)SCHEME_VEC_ELS(vec)[pos];
|
||||
Scheme_Object *o = bucket->val;
|
||||
if (o)
|
||||
return o;
|
||||
else {
|
||||
scheme_unbound_global(bucket);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static MZC_INLINE Scheme_Object *MZC_GLOBAL_ASSIGN(Scheme_Object *vec, int pos, Scheme_Object *val) {
|
||||
Scheme_Bucket *bucket = (Scheme_Bucket *)SCHEME_VEC_ELS(vec)[pos];
|
||||
scheme_set_global_bucket("set!", bucket, val, 0);
|
||||
return scheme_void;
|
||||
}
|
||||
|
||||
#define MZC_KNOWN_SAFE_VECTOR_REF(vec, pos) (SCHEME_VEC_ELS(vec)[pos])
|
||||
|
||||
#define MZC_APPLY_MAGIC(val, n) \
|
||||
scheme_eval_compiled_sized_string_with_magic(top_level_bytecode_ ## n, sizeof(top_level_bytecode_ ## n), NULL, \
|
||||
scheme_intern_symbol(top_level_magic_sym_ ## n), val, 1)
|
||||
|
||||
#define DO_FUEL_POLL ((scheme_fuel_counter-- <= 0) ? (scheme_process_block(0), 0) : 0)
|
||||
|
||||
#define _scheme_direct_apply_primitive_multi_poll(prim, argc, argv) \
|
||||
(DO_FUEL_POLL, _scheme_direct_apply_primitive_multi(prim, argc, argv))
|
||||
#define _scheme_direct_apply_primitive_poll(prim, argc, argv) \
|
||||
(DO_FUEL_POLL, _scheme_direct_apply_primitive(prim, argc, argv))
|
||||
#define _scheme_direct_apply_primitive_closure_multi_poll(prim, argc, argv) \
|
||||
(DO_FUEL_POLL, _scheme_direct_apply_primitive_closure_multi(prim, argc, argv))
|
||||
#define _scheme_direct_apply_primitive_closure_poll(prim, argc, argv) \
|
||||
(DO_FUEL_POLL, _scheme_direct_apply_primitive_closure(prim, argc, argv))
|
||||
|
||||
#ifdef KEEP_CLOSURE_COUNT
|
||||
static int closure_alloc_cnt;
|
||||
static void print_closures()
|
||||
{
|
||||
printf("closures allocated in " MZC_SRC_FILE ": %d\n", closure_alloc_cnt);
|
||||
}
|
||||
# define CLOSURE_ALLOC_PP closure_alloc_inc(),
|
||||
static void closure_alloc_inc()
|
||||
{
|
||||
if (!closure_alloc_cnt)
|
||||
atexit(print_closures);
|
||||
closure_alloc_cnt++;
|
||||
}
|
||||
#else
|
||||
# define CLOSURE_ALLOC_PP /**/
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
Scheme_Primitive_Proc prim;
|
||||
#ifdef MZ_PRECISE_GC
|
||||
int count;
|
||||
#endif
|
||||
} Scheme_Primitive_Closure_Post;
|
||||
|
||||
# define MZC_INSTALL_DATA_PTR(rec) rec
|
||||
# define MZC_PARAM_TO_SWITCH(void_param) *(unsigned long *)(((Scheme_Primitive_Closure *)void_param)->val)
|
||||
# define MZC_ENV_POINTER(t, ct, void_param) (&(((const ct *)void_param)->data))
|
||||
|
||||
|
||||
#ifdef SIXTY_FOUR_BIT_INTEGERS
|
||||
# define MZ_LOG_WORD_SIZE 4
|
||||
#else
|
||||
# define MZ_LOG_WORD_SIZE 2
|
||||
#endif
|
||||
|
||||
#define _scheme_make_c_proc_closure(cfunc, rec, name, amin, amax, flags) \
|
||||
(CLOSURE_ALLOC_PP (Scheme_Object *)_scheme_fill_prim_closure_post(((Scheme_Primitive_Closure *)&rec->prim), cfunc, \
|
||||
name, amin, amax, flags, \
|
||||
sizeof(rec->data)>>MZ_LOG_WORD_SIZE))
|
||||
|
||||
#define _scheme_make_c_proc_closure_empty(cfunc, rec, name, amin, amax, flags) \
|
||||
(CLOSURE_ALLOC_PP (Scheme_Object *)_scheme_fill_prim_closure(&rec->prim, cfunc, name, amin, amax, flags))
|
||||
|
||||
#define _scheme_make_c_case_proc_closure(cfunc, rec, name, ccnt, cses, flags) \
|
||||
(CLOSURE_ALLOC_PP (Scheme_Object *)_scheme_fill_prim_case_closure_post(((Scheme_Primitive_Closure *)&rec->prim), cfunc, \
|
||||
name, ccnt, cses, flags, \
|
||||
sizeof(rec->data)>>MZ_LOG_WORD_SIZE))
|
||||
|
||||
#define _scheme_make_c_case_proc_closure_empty(cfunc, rec, name, ccnt, cses, flags) \
|
||||
(CLOSURE_ALLOC_PP (Scheme_Object *)_scheme_fill_prim_case_closure(&rec->prim, cfunc, name, ccnt, cses, flags))
|
||||
|
||||
#define NO_MULTIPLE_VALUES(res) \
|
||||
if (res == SCHEME_MULTIPLE_VALUES) \
|
||||
scheme_wrong_return_arity(NULL, 1, scheme_multiple_count, scheme_multiple_array, NULL);
|
||||
#define CHECK_MULTIPLE_VALUES(res, expected) \
|
||||
if (res != SCHEME_MULTIPLE_VALUES || scheme_multiple_count != expected) \
|
||||
scheme_wrong_return_arity(NULL, expected, \
|
||||
(res == SCHEME_MULTIPLE_VALUES ? scheme_multiple_count : 1), \
|
||||
(res == SCHEME_MULTIPLE_VALUES ? scheme_multiple_array : (Scheme_Object**)res), \
|
||||
NULL);
|
||||
|
||||
#define SCHEME_DETATCH_MV_BUFFER(mv, pr) if (SAME_OBJ(mv, pr->values_buffer)) pr->values_buffer = NULL
|
||||
|
||||
#define SCHEME_CURRENT_ENV(pr) scheme_get_env(NULL)
|
||||
|
||||
typedef struct {
|
||||
Scheme_Object * val;
|
||||
Scheme_Object ** array;
|
||||
int count;
|
||||
} _Scheme_Begin0_Rec;
|
||||
|
||||
typedef struct {
|
||||
Scheme_Cont_Frame_Data cf;
|
||||
Scheme_Object *val;
|
||||
} _Scheme_WCM_Rec;
|
||||
|
||||
#define _scheme_apply_ckp(f, argc, argv) (SCHEME_CLSD_PRIMP(f) ? _scheme_apply_prim_closure(f, argc, argv) : _scheme_apply(f, argc, argv))
|
||||
#define _scheme_apply_multi_ckp(f, argc, argv) (SCHEME_CLSD_PRIMP(f) ? _scheme_apply_prim_closure_multi(f, argc, argv) : _scheme_apply_multi(f, argc, argv))
|
||||
|
||||
#define MZC_EQP(ltp, av, bv) (SAME_OBJ(av, bv))
|
||||
#define MZC_EQVP(ltp, av, bv) (SAME_OBJ(av, bv) || scheme_eqv(av, bv))
|
||||
#define MZC_EQUALP(ltp, av, bv) scheme_equal(av, bv)
|
||||
#define MZC_NOTP(p, av) (SCHEME_FALSEP(av))
|
||||
#define MZC_NULLP(p, av) (SCHEME_NULLP(av))
|
||||
#define MZC_PAIRP(p, av) (SCHEME_PAIRP(av))
|
||||
#define MZC_SYMBOLP(p, av) (SCHEME_SYMBOLP(av))
|
||||
#define MZC_STRINGP(p, av) (SCHEME_CHAR_STRINGP(av))
|
||||
#define MZC_BYTESP(p, av) (SCHEME_BYTE_STRINGP(av))
|
||||
#define MZC_VECTORP(p, av) (SCHEME_VECTORP(av))
|
||||
#define MZC_NUMBERP(p, av) (SCHEME_NUMBERP(av))
|
||||
#define MZC_PROCEDUREP(p, av) (SCHEME_PROCP(av))
|
||||
#define MZC_EOFP(p, av) (SCHEME_EOFP(av))
|
||||
#define MZC_CHARP(p, av) (SCHEME_CHARP(av))
|
||||
|
||||
#define MZC_CONS(p, av, bv) scheme_make_pair(av, bv)
|
||||
#define MZC_LIST1(p, av) scheme_make_pair(av, scheme_null)
|
||||
#define MZC_LIST2(p, av, bv) scheme_make_pair(av, scheme_make_pair(bv, scheme_null))
|
||||
#define MZC_APPEND(p, av, bv) scheme_append(av, bv)
|
||||
|
||||
#define MZC_FOR_SYNTAX_IN_ENV(ignored, proc) scheme_apply_for_syntax_in_env(proc, env)
|
||||
|
||||
#if MZC_UNSAFE
|
||||
/* Unsafe versions */
|
||||
#define MZC_CAR(p, av) SCHEME_CAR(av)
|
||||
#define MZC_CDR(p, av) SCHEME_CDR(av)
|
||||
#define MZC_CADR(p, av) SCHEME_CAR(SCHEME_CDR(av))
|
||||
#define MZC_CDDR(p, av) SCHEME_CDR(SCHEME_CDR(av))
|
||||
#define MZC_CDAR(p, av) SCHEME_CDR(SCHEME_CAR(av))
|
||||
#define MZC_CAAR(p, av) SCHEME_CAR(SCHEME_CAR(av))
|
||||
#define MZC_CADDR(p, av) SCHEME_CADR(SCHEME_CDR(av))
|
||||
#define MZC_SET_CAR(p, av, bv) (SCHEME_CAR(av)=bv, scheme_void)
|
||||
#define MZC_SET_CDR(p, av, bv) (SCHEME_CDR(av)=bv, scheme_void)
|
||||
|
||||
# define MZC_VECTOR_REF(p, v, i) SCHEME_VEC_ELS(v)[SCHEME_INT_VAL(i)]
|
||||
# define MZC_VECTOR_SET(p, v, i, x) (SCHEME_VEC_ELS(v)[SCHEME_INT_VAL(i)] = x, scheme_void)
|
||||
|
||||
# define MZC_STRING_REF(p, v, i) scheme_make_character(SCHEME_CHAR_STR_VAL(v)[SCHEME_INT_VAL(i)])
|
||||
# define MZC_STRING_SET(p, v, i, x) (SCHEME_CHAR_STR_VAL(v)[SCHEME_INT_VAL(i)] = SCHEME_CHAR_VAL(x), scheme_void)
|
||||
|
||||
# define MZC_BYTES_REF(p, v, i) scheme_make_integer(SCHEME_BYTE_STR_VAL(v)[SCHEME_INT_VAL(i)])
|
||||
# define MZC_BYTES_SET(p, v, i, x) (SCHEME_BYTE_STR_VAL(v)[SCHEME_INT_VAL(i)] = SCHEME_INT_VAL(x), scheme_void)
|
||||
|
||||
#define MZC_CHAR_TO_INTEGER(p, v) scheme_make_integer((unsigned char)SCHEME_CHAR_VAL(v))
|
||||
/* End unsafe versions */
|
||||
#else
|
||||
/* Safe versions */
|
||||
#define MZC_CAR(p, av) (SCHEME_PAIRP(av) ? SCHEME_CAR(av) : (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_CDR(p, av) (SCHEME_PAIRP(av) ? SCHEME_CDR(av) : (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_CADR(p, av) ((SCHEME_PAIRP(av) && SCHEME_PAIRP(SCHEME_CDR(av))) ? SCHEME_CAR(SCHEME_CDR(av)) : (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_CDDR(p, av) ((SCHEME_PAIRP(av) && SCHEME_PAIRP(SCHEME_CDR(av))) ? SCHEME_CDR(SCHEME_CDR(av)) : (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_CDAR(p, av) ((SCHEME_PAIRP(av) && SCHEME_PAIRP(SCHEME_CAR(av))) ? SCHEME_CDR(SCHEME_CAR(av)) : (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_CAAR(p, av) ((SCHEME_PAIRP(av) && SCHEME_PAIRP(SCHEME_CAR(av))) ? SCHEME_CAR(SCHEME_CAR(av)) : (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_CADDR(p, av) ((SCHEME_PAIRP(av) && SCHEME_PAIRP(SCHEME_CDR(av)) && SCHEME_PAIRP(SCHEME_CDR(SCHEME_CDR(av)))) ? SCHEME_CADR(SCHEME_CDR(av)) : (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_SET_CAR(p, av, bv) (SCHEME_MUTABLE_PAIRP(av) ? (SCHEME_CAR(av)=bv, scheme_void) : (arg[0] = av, arg[1] = bv, _scheme_direct_apply_primitive_multi(p, 2, arg)))
|
||||
#define MZC_SET_CDR(p, av, bv) (SCHEME_MUTABLE_PAIRP(av) ? (SCHEME_CDR(av)=bv, scheme_void) : (arg[0] = av, arg[1] = bv, _scheme_direct_apply_primitive_multi(p, 2, arg)))
|
||||
|
||||
#define MZC_CHAR_TO_INTEGER(p, v) (SCHEME_CHARP(v) ? scheme_make_integer((unsigned char)SCHEME_CHAR_VAL(v)) \
|
||||
: (arg[0] = v, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
|
||||
# define MZC_VECTOR_REF(p, v, i) ((SCHEME_INTP(i) && SCHEME_VECTORP(v) && (SCHEME_INT_VAL(i) >= 0) \
|
||||
&& (SCHEME_INT_VAL(i) < SCHEME_VEC_SIZE(v)) \
|
||||
? SCHEME_VEC_ELS(v)[SCHEME_INT_VAL(i)] \
|
||||
: (arg[0] = v, arg[1] = i, _scheme_direct_apply_primitive_multi(p, 2, arg))))
|
||||
# define MZC_VECTOR_SET(p, v, i, x) ((SCHEME_INTP(i) && SCHEME_VECTORP(v) && (SCHEME_INT_VAL(i) >= 0) \
|
||||
&& (SCHEME_INT_VAL(i) < SCHEME_VEC_SIZE(v)) \
|
||||
? (SCHEME_VEC_ELS(v)[SCHEME_INT_VAL(i)] = x, scheme_void) \
|
||||
: (arg[0] = v, arg[1] = i, arg[2] = x, _scheme_direct_apply_primitive_multi(p, 3, arg))))
|
||||
# define MZC_STRING_REF(p, v, i) ((SCHEME_INTP(i) && SCHEME_CHAR_STRINGP(v) && (SCHEME_INT_VAL(i) >= 0) \
|
||||
&& (SCHEME_INT_VAL(i) < SCHEME_CHAR_STRLEN_VAL(v)) \
|
||||
? scheme_make_character(SCHEME_CHAR_STR_VAL(v)[SCHEME_INT_VAL(i)]) \
|
||||
: (arg[0] = v, arg[1] = i, _scheme_direct_apply_primitive_multi(p, 2, arg))))
|
||||
# define MZC_STRING_SET(p, v, i, x) ((SCHEME_INTP(i) && SCHEME_MUTABLE_CHAR_STRINGP(v) && SCHEME_CHARP(x) && (SCHEME_INT_VAL(i) >= 0) \
|
||||
&& (SCHEME_INT_VAL(i) < SCHEME_CHAR_STRLEN_VAL(v)) \
|
||||
? (SCHEME_CHAR_STR_VAL(v)[SCHEME_INT_VAL(i)] = SCHEME_CHAR_VAL(x), scheme_void) \
|
||||
: (arg[0] = v, arg[1] = i, arg[2] = x, _scheme_direct_apply_primitive_multi(p, 3, arg))))
|
||||
# define MZC_BYTES_REF(p, v, i) ((SCHEME_INTP(i) && SCHEME_BYTE_STRINGP(v) && (SCHEME_INT_VAL(i) >= 0) \
|
||||
&& (SCHEME_INT_VAL(i) < SCHEME_BYTE_STRLEN_VAL(v)) \
|
||||
? scheme_make_integer(SCHEME_BYTE_STR_VAL(v)[SCHEME_INT_VAL(i)]) \
|
||||
: (arg[0] = v, arg[1] = i, _scheme_direct_apply_primitive_multi(p, 2, arg))))
|
||||
# define MZC_BYTES_SET(p, v, i, x) ((SCHEME_INTP(i) && SCHEME_MUTABLE_BYTE_STRINGP(v) && SCHEME_INTP(x) \
|
||||
&& (SCHEME_INT_VAL(x) >= 0) && (SCHEME_INT_VAL(x) <= 255) \
|
||||
&& (SCHEME_INT_VAL(i) >= 0) && (SCHEME_INT_VAL(i) < SCHEME_BYTE_STRLEN_VAL(v)) \
|
||||
? (SCHEME_BYTE_STR_VAL(v)[SCHEME_INT_VAL(i)] = SCHEME_INT_VAL(x), scheme_void) \
|
||||
: (arg[0] = v, arg[1] = i, arg[2] = x, _scheme_direct_apply_primitive_multi(p, 3, arg))))
|
||||
/* End safe versions */
|
||||
#endif
|
||||
|
||||
#define _MZC_DBLP(obj) SAME_TYPE(_SCHEME_TYPE(obj), scheme_double_type)
|
||||
|
||||
#define MZC_ZEROP(zp, av) (SCHEME_INTP(av) \
|
||||
? (av == scheme_make_integer(0)) \
|
||||
: (_MZC_DBLP(av) \
|
||||
? !SCHEME_DBL_VAL(av) \
|
||||
: (arg[0] = av, SCHEME_TRUEP(_scheme_direct_apply_primitive_multi(zp, 1, arg)))))
|
||||
|
||||
#define MZC_ARITH_COMPARE(cp, av, bv, compareop) \
|
||||
((SCHEME_INTP(av) && SCHEME_INTP(bv)) \
|
||||
? (SCHEME_INT_VAL(av) compareop SCHEME_INT_VAL(bv)) \
|
||||
: ((SCHEME_DBLP(av) && SCHEME_DBLP(bv)) \
|
||||
? (SCHEME_DBL_VAL(av) compareop SCHEME_DBL_VAL(bv)) \
|
||||
: (arg[0] = av, arg[1] = bv, SCHEME_TRUEP(_scheme_direct_apply_primitive_multi(cp, 2, arg)))))
|
||||
|
||||
#define MZC_LTP(cp, av, bv) MZC_ARITH_COMPARE(cp, av, bv, <)
|
||||
#define MZC_GTP(cp, av, bv) MZC_ARITH_COMPARE(cp, av, bv, >)
|
||||
#define MZC_LTEP(cp, av, bv) MZC_ARITH_COMPARE(cp, av, bv, <=)
|
||||
#define MZC_GTEP(cp, av, bv) MZC_ARITH_COMPARE(cp, av, bv, >=)
|
||||
#define MZC_EQLP(cp, av, bv) MZC_ARITH_COMPARE(cp, av, bv, ==)
|
||||
|
||||
#if MZC_FIXNUM
|
||||
/* Numerically incorrect */
|
||||
#define MZC_ADD1(p, av) (SCHEME_INTP(av) \
|
||||
? scheme_make_integer(SCHEME_INT_VAL(av)+1) \
|
||||
: (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_SUB1(p, av) (SCHEME_INTP(av) \
|
||||
? scheme_make_integer(SCHEME_INT_VAL(av)-1) \
|
||||
: (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
|
||||
#define MZC_ARITH_OP(cp, av, bv, op, revop) \
|
||||
((SCHEME_INTP(av) && SCHEME_INTP(bv)) \
|
||||
? scheme_make_integer(SCHEME_INT_VAL(av) op SCHEME_INT_VAL(bv)) \
|
||||
: ((SCHEME_DBLP(av) && SCHEME_DBLP(bv)) \
|
||||
? scheme_make_double(SCHEME_DBL_VAL(av) op SCHEME_DBL_VAL(bv)) \
|
||||
: (arg[0] = av, arg[1] = bv, _scheme_direct_apply_primitive_multi(cp, 2, arg))))
|
||||
|
||||
#define MZC_TIMES2(cp, av, bv) MZC_ARITH_OP(cp, av, bv, *, /)
|
||||
|
||||
/* End numerically incorrect */
|
||||
#else
|
||||
/* Numerically correct */
|
||||
#define MZC_ADD1(p, av) ((SCHEME_INTP(av) && (SCHEME_INT_VAL(av) < 0x3FFFFFFF)) \
|
||||
? scheme_make_integer(SCHEME_INT_VAL(av)+1) \
|
||||
: (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
#define MZC_SUB1(p, av) ((SCHEME_INTP(av) && (SCHEME_INT_VAL(av) > (-0x3FFFFFFF))) \
|
||||
? scheme_make_integer(SCHEME_INT_VAL(av)-1) \
|
||||
: (arg[0] = av, _scheme_direct_apply_primitive_multi(p, 1, arg)))
|
||||
|
||||
#define MZC_ARITH_OP(cp, av, bv, op, revop) \
|
||||
((SCHEME_INTP(av) && SCHEME_INTP(bv) \
|
||||
&& (((SCHEME_INT_VAL(scheme_make_integer(SCHEME_INT_VAL(av) op SCHEME_INT_VAL(bv))) \
|
||||
revop SCHEME_INT_VAL(bv)) \
|
||||
== SCHEME_INT_VAL(av)))) \
|
||||
? scheme_make_integer(SCHEME_INT_VAL(av) op SCHEME_INT_VAL(bv)) \
|
||||
: ((SCHEME_DBLP(av) && SCHEME_DBLP(bv)) \
|
||||
? scheme_make_double(SCHEME_DBL_VAL(av) op SCHEME_DBL_VAL(bv)) \
|
||||
: (arg[0] = av, arg[1] = bv, _scheme_direct_apply_primitive_multi(cp, 2, arg))))
|
||||
/* End numerically correct */
|
||||
#endif
|
||||
|
||||
#define MZC_PLUS2(cp, av, bv) MZC_ARITH_OP(cp, av, bv, +, -)
|
||||
#define MZC_MINUS2(cp, av, bv) MZC_ARITH_OP(cp, av, bv, -, +)
|
||||
|
||||
#define MZC_MAXMIN_OP(cp, av, bv, minlt) \
|
||||
((SCHEME_INTP(av) && SCHEME_INTP(bv)) \
|
||||
? ((SCHEME_INT_VAL(av) minlt SCHEME_INT_VAL(bv)) ? av : bv) \
|
||||
: (arg[0] = av, arg[1] = bv, _scheme_direct_apply_primitive_multi(cp, 2, arg)))
|
||||
|
||||
#define MZC_MAX2(cp, av, bv) MZC_MAXMIN_OP(cp, av, bv, >)
|
||||
#define MZC_MIN2(cp, av, bv) MZC_MAXMIN_OP(cp, av, bv, <)
|
||||
|
||||
#define MZC_QUOTIENT(cp, av, bv) \
|
||||
((SCHEME_INTP(av) && SCHEME_INTP(bv) && SCHEME_INT_VAL(bv)) \
|
||||
? scheme_make_integer(SCHEME_INT_VAL(av) / SCHEME_INT_VAL(bv)) \
|
||||
: (arg[0] = av, arg[1] = bv, _scheme_direct_apply_primitive_multi(cp, 2, arg)))
|
||||
|
||||
static MSC_IZE(inline) Scheme_Object *mzc_force_value(Scheme_Object *v)
|
||||
{
|
||||
return _scheme_force_value(v);
|
||||
}
|
||||
|
||||
#define _scheme_direct_apply_primitive_closure_multi_fv(prim, argc, argv) \
|
||||
mzc_force_value(_scheme_direct_apply_primitive_closure_multi(prim, argc, argv))
|
||||
#define _scheme_direct_apply_primitive_closure_fv(prim, argc, argv) \
|
||||
scheme_check_one_value(_scheme_direct_apply_primitive_closure_multi_fv(prim, argc, argv))
|
||||
|
||||
static int mzc_strlen(const char *c) {
|
||||
int l;
|
||||
for (l = 0; c[l]; l++);
|
||||
return l;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static Scheme_Object *DEBUG_CHECK(Scheme_Object *v)
|
||||
{
|
||||
if ((SCHEME_TYPE(v) < _scheme_values_types_) || (SCHEME_TYPE(v) > _scheme_last_type_ + 5)) {
|
||||
/* Could be a boxed value ... */
|
||||
Scheme_Object *o = *(Scheme_Object **)v;
|
||||
if ((SCHEME_TYPE(v) < _scheme_values_types_) || (SCHEME_TYPE(v) > _scheme_last_type_ + 5)) {
|
||||
printf("wrong!\n");
|
||||
}
|
||||
}
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef MZ_PRECISE_GC
|
||||
START_XFORM_SUSPEND;
|
||||
static MZC_INLINE Scheme_Object *
|
||||
_mzc_direct_apply_primitive_multi(Scheme_Object *prim, int argc, Scheme_Object **argv)
|
||||
{
|
||||
return _scheme_direct_apply_primitive_multi(prim, argc, argv);
|
||||
}
|
||||
static MZC_INLINE Scheme_Object *
|
||||
_mzc_direct_apply_primitive(Scheme_Object *prim, int argc, Scheme_Object **argv)
|
||||
{
|
||||
return _scheme_direct_apply_primitive(prim, argc, argv);
|
||||
}
|
||||
static MZC_INLINE Scheme_Object *
|
||||
_mzc_direct_apply_primitive_closure_multi(Scheme_Object *prim, int argc, Scheme_Object **argv)
|
||||
{
|
||||
return _scheme_direct_apply_primitive_closure_multi(prim, argc, argv);
|
||||
}
|
||||
static MZC_INLINE Scheme_Object *
|
||||
_mzc_direct_apply_primitive_closure(Scheme_Object *prim, int argc, Scheme_Object **argv)
|
||||
{
|
||||
return _scheme_direct_apply_primitive_closure(prim, argc, argv);
|
||||
}
|
||||
END_XFORM_SUSPEND;
|
||||
#else
|
||||
# define _mzc_direct_apply_primitive_multi(prim, argc, argv) \
|
||||
_scheme_direct_apply_primitive_multi(prim, argc, argv)
|
||||
# define _mzc_direct_apply_primitive(prim, argc, argv) \
|
||||
_scheme_direct_apply_primitive(prim, argc, argv)
|
||||
# define _mzc_direct_apply_primitive_closure_multi(prim, argc, argv) \
|
||||
_scheme_direct_apply_primitive_closure_multi(prim, argc, argv)
|
||||
# define _mzc_direct_apply_primitive_closure(prim, argc, argv) \
|
||||
_scheme_direct_apply_primitive_closure(prim, argc, argv)
|
||||
#endif
|
||||
|
||||
#define _mzc_apply(r,n,rs) _scheme_apply(r,n,rs)
|
||||
#define _mzc_apply_multi(r,n,rs) _scheme_apply_multi(r,n,rs)
|
||||
#define _mzc_apply_known_prim_closure(r,n,rs) _scheme_apply_known_prim_closure(r,n,rs)
|
||||
#define _mzc_apply_known_prim_closure_multi(r,n,rs) _scheme_apply_known_prim_closure_multi(r,n,rs)
|
||||
|
||||
#define MZC_PRIM_CLS_DATA(prim) (prim)
|
|
@ -1,2 +0,0 @@
|
|||
|
||||
#define LOCAL_PROC(x) x
|
File diff suppressed because it is too large
Load Diff
|
@ -1,422 +0,0 @@
|
|||
(module to-core scheme/base
|
||||
(require syntax/kerncase
|
||||
syntax/stx
|
||||
mzlib/list
|
||||
syntax/boundmap
|
||||
(for-syntax scheme/base))
|
||||
|
||||
(provide top-level-to-core)
|
||||
|
||||
;; `module', `require', and `require-for-syntax' declarations must
|
||||
;; not be embedded in a `begin' sequence. For `require' and
|
||||
;; `require-for-syntax', it's a timing issue. For `module', it's
|
||||
;; because the transformation can only handle a single `module'
|
||||
;; declaration.
|
||||
(define (top-level-to-core stx lookup-stx set-stx safe-vector-ref-stx extract-stx
|
||||
simple-constant? stop-properties)
|
||||
(syntax-case stx (module begin)
|
||||
[(module m lang (plain-module-begin decl ...))
|
||||
(let-values ([(expr new-decls magic-sym)
|
||||
(lift-sequence (flatten-decls (syntax->list #'(decl ...)))
|
||||
lookup-stx set-stx safe-vector-ref-stx extract-stx
|
||||
#t
|
||||
simple-constant? stop-properties)])
|
||||
(values (expand-syntax expr)
|
||||
#`(module m lang (#%plain-module-begin #,@new-decls))
|
||||
magic-sym))]
|
||||
[(begin decl ...)
|
||||
(let-values ([(expr new-decls magic-sym)
|
||||
(lift-sequence (flatten-decls (syntax->list #'(decl ...)))
|
||||
lookup-stx set-stx safe-vector-ref-stx extract-stx
|
||||
#f
|
||||
simple-constant? stop-properties)])
|
||||
(values (expand-syntax expr)
|
||||
#`(begin #,@new-decls)
|
||||
magic-sym))]
|
||||
[else
|
||||
(top-level-to-core #`(begin #,stx) lookup-stx set-stx safe-vector-ref-stx extract-stx
|
||||
simple-constant? stop-properties)]))
|
||||
|
||||
(define (flatten-decls l)
|
||||
(apply append
|
||||
(map (lambda (stx)
|
||||
(syntax-case stx (begin)
|
||||
[(begin . e)
|
||||
(flatten-decls (syntax->list #'e))]
|
||||
[else (list stx)]))
|
||||
l)))
|
||||
|
||||
(define-struct lifted-info ([counter #:mutable] id-map slot-map))
|
||||
|
||||
(define (make-vars)
|
||||
(make-lifted-info
|
||||
0
|
||||
(make-module-identifier-mapping)
|
||||
(make-hash)))
|
||||
|
||||
(define (is-id-ref? v)
|
||||
(or (identifier? v)
|
||||
(and (stx-pair? v)
|
||||
(identifier? (stx-car v))
|
||||
(free-identifier=? #'#%top (stx-car v)))))
|
||||
|
||||
(define (vars-sequence li)
|
||||
(let loop ([i 0])
|
||||
(if (= i (lifted-info-counter li))
|
||||
null
|
||||
(cons (let ([v (hash-ref (lifted-info-slot-map li) i)])
|
||||
(if (is-id-ref? v)
|
||||
#`(#%variable-reference #,v)
|
||||
v))
|
||||
(loop (add1 i))))))
|
||||
|
||||
(define (extract-vars li vec-id extract-stx)
|
||||
(let loop ([i 0])
|
||||
(if (= i (lifted-info-counter li))
|
||||
null
|
||||
(let ([v (hash-ref (lifted-info-slot-map li) i)])
|
||||
(if (is-id-ref? v)
|
||||
(cons #`(#,extract-stx #,vec-id #,i)
|
||||
(loop (add1 i)))
|
||||
(loop (add1 i)))))))
|
||||
|
||||
(define (is-run-time? stx)
|
||||
(not (and (stx-pair? stx)
|
||||
(or (free-identifier=? #'define-syntaxes (stx-car stx))
|
||||
(free-identifier=? #'define-values-for-syntax (stx-car stx))))))
|
||||
|
||||
(define (has-symbol? decl magic-sym table)
|
||||
(cond
|
||||
[(hash-ref table decl (lambda () #f))
|
||||
;; cycle/graph
|
||||
#f]
|
||||
[else
|
||||
(hash-set! table decl #t)
|
||||
(cond
|
||||
[(eq? magic-sym decl)
|
||||
#t]
|
||||
[(pair? decl)
|
||||
(or (has-symbol? (car decl) magic-sym table)
|
||||
(has-symbol? (cdr decl) magic-sym table))]
|
||||
[(vector? decl)
|
||||
(has-symbol? (vector->list decl) magic-sym table)]
|
||||
[(box? decl)
|
||||
(has-symbol? (unbox decl) magic-sym table)]
|
||||
[else
|
||||
#f])]))
|
||||
|
||||
(define (generate-magic decls)
|
||||
(let ([magic-sym (string->symbol (format "magic~a~a"
|
||||
(current-seconds)
|
||||
(current-milliseconds)))])
|
||||
(if (has-symbol? (map syntax->datum decls) magic-sym (make-hasheq))
|
||||
(generate-magic decls)
|
||||
magic-sym)))
|
||||
|
||||
(define (need-thunk? rhs)
|
||||
(not (and (stx-pair? rhs)
|
||||
(or (free-identifier=? #'lambda (stx-car rhs))
|
||||
(free-identifier=? #'case-lambda (stx-car rhs))))))
|
||||
|
||||
(define (lift-sequence decls lookup-stx set-stx safe-vector-ref-stx extract-stx
|
||||
in-module? simple-constant? stop-properties)
|
||||
(let ([ct-vars (make-vars)]
|
||||
[rt-vars (make-vars)]
|
||||
[compile-time (datum->syntax #f (gensym 'compile-time))]
|
||||
[run-time (datum->syntax #f (gensym 'run-time))]
|
||||
[magic-sym (generate-magic decls)]
|
||||
[magic-indirect (gensym)])
|
||||
(let ([ct-converted
|
||||
(map (lambda (stx)
|
||||
#`(lambda ()
|
||||
#,(syntax-case stx ()
|
||||
[(def ids rhs)
|
||||
(let ([cvted (convert #'rhs #t
|
||||
lookup-stx set-stx safe-vector-ref-stx
|
||||
compile-time ct-vars
|
||||
in-module?
|
||||
simple-constant? stop-properties)])
|
||||
(if (and (not in-module?)
|
||||
(free-identifier=? #'def #'define-syntaxes))
|
||||
;; Don't try to name macro procedures, because it
|
||||
;; inteferes with the 0-values hack at the top level
|
||||
cvted
|
||||
#`(let-values ([ids #,cvted])
|
||||
(#%plain-app values . ids))))])))
|
||||
(filter (lambda (x) (not (is-run-time? x))) decls))]
|
||||
[rt-converted
|
||||
(map (lambda (stx)
|
||||
(syntax-case stx (define-values
|
||||
#%provide
|
||||
#%require)
|
||||
[(#%provide . _)
|
||||
#'void]
|
||||
[(#%require . _)
|
||||
#'void]
|
||||
[(define-values ids rhs)
|
||||
(let ([converted (convert #'rhs #f
|
||||
lookup-stx set-stx safe-vector-ref-stx
|
||||
run-time rt-vars
|
||||
in-module?
|
||||
simple-constant? stop-properties)])
|
||||
(if (need-thunk? #'rhs)
|
||||
#`(lambda () #,converted)
|
||||
#`(let-values ([ids #,converted])
|
||||
(#%plain-app values . ids))))]
|
||||
[else
|
||||
#`(lambda ()
|
||||
#,(convert stx #f
|
||||
lookup-stx set-stx safe-vector-ref-stx
|
||||
run-time rt-vars
|
||||
in-module?
|
||||
simple-constant? stop-properties))]))
|
||||
(filter is-run-time? decls))]
|
||||
[ct-rhs #`(#%plain-app
|
||||
(let-values ([(magic) (#%plain-app car (#%plain-app cons '#,magic-sym 2))])
|
||||
(if (#%plain-app symbol? magic)
|
||||
(#%plain-lambda (x)
|
||||
(#%plain-app
|
||||
vector
|
||||
#,@(map (lambda (stx)
|
||||
(syntax-case stx ()
|
||||
[(def (id) . _)
|
||||
#'void]
|
||||
[(def (id ...) . _)
|
||||
(with-syntax ([(v ...) (map (lambda (x) #f)
|
||||
(syntax->list #'(id ...)))])
|
||||
|
||||
#`(#%plain-lambda () (#%plain-app values v ...)))]))
|
||||
(filter (lambda (x) (not (is-run-time? x))) decls))))
|
||||
(#%plain-app car magic)))
|
||||
(#%plain-app vector #,@(vars-sequence ct-vars)))]
|
||||
[rt-rhs #`(#%plain-app (#%plain-app cdr '#,magic-sym)
|
||||
(#%plain-app vector #,@(vars-sequence rt-vars)))]
|
||||
[just-one-ct? (>= 1 (apply +
|
||||
(map (lambda (decl)
|
||||
(syntax-case decl (define-syntaxes define-values-for-syntax)
|
||||
[(define-values-for-syntax . _) 1]
|
||||
[(define-syntaxes . _) 1]
|
||||
[_else 0]))
|
||||
decls)))]
|
||||
[just-one-rt? (>= 1 (apply +
|
||||
(map (lambda (decl)
|
||||
(syntax-case decl (define-values #%provide #%require
|
||||
define-syntaxes define-values-for-syntax)
|
||||
[(#%provide . _) 0]
|
||||
[(#%require . _) 0]
|
||||
[(define-values-for-syntax . _) 0]
|
||||
[(define-syntaxes . _) 0]
|
||||
[_else 1]))
|
||||
decls)))])
|
||||
(values
|
||||
#`(#%plain-app
|
||||
cons (#%plain-lambda (#,compile-time)
|
||||
#,@(extract-vars ct-vars compile-time extract-stx)
|
||||
(#%plain-app vector #,@ct-converted))
|
||||
(#%plain-lambda (#,run-time)
|
||||
#,@(extract-vars rt-vars run-time extract-stx)
|
||||
(#%plain-app vector #,@rt-converted)))
|
||||
#`(;; Lift require and require-for-syntaxes to the front, so they're ready for
|
||||
;; variable references
|
||||
#,@(filter (lambda (decl)
|
||||
(syntax-case decl (#%require)
|
||||
[(#%require . _) #t]
|
||||
[_else #f]))
|
||||
decls)
|
||||
;; Lift define-for-values binding to front, so they can be referenced
|
||||
;; in compile-time definition
|
||||
#,@(let ([ids (apply
|
||||
append
|
||||
(map (lambda (stx)
|
||||
(syntax-case stx (define-values-for-syntax)
|
||||
[(define-values-for-syntax ids . _)
|
||||
(syntax->list #'ids)]
|
||||
[_else null]))
|
||||
decls))])
|
||||
(if (null? ids)
|
||||
null
|
||||
#`((define-values-for-syntax #,ids
|
||||
(values #,@(map (lambda (x) #'#f) ids))))))
|
||||
#,@(if just-one-ct?
|
||||
null
|
||||
#`((define-values-for-syntax (#,compile-time) #,ct-rhs)))
|
||||
#,@(if just-one-rt?
|
||||
null
|
||||
#`((define-values (#,run-time) #,rt-rhs)))
|
||||
#,@(let loop ([decls decls][ct-pos 0][rt-pos 0])
|
||||
(cond
|
||||
[(null? decls) null]
|
||||
[(is-run-time? (car decls))
|
||||
(cons (syntax-case (car decls) (define-values #%provide #%require)
|
||||
[(#%provide . _)
|
||||
(car decls)]
|
||||
[(#%require . _)
|
||||
#'(#%plain-app void)]
|
||||
[(define-values (id ...) rhs)
|
||||
#`(define-values (id ...)
|
||||
#,(let ([lookup #`(#%plain-app vector-ref #,(if just-one-rt? rt-rhs run-time) #,rt-pos)])
|
||||
(if (need-thunk? #'rhs)
|
||||
#`(#%plain-app #,lookup)
|
||||
lookup)))]
|
||||
[else
|
||||
#`(#%plain-app (#%plain-app vector-ref #,(if just-one-rt? rt-rhs run-time) #,rt-pos))])
|
||||
(loop (cdr decls) ct-pos (add1 rt-pos)))]
|
||||
[else
|
||||
(cons (syntax-case (car decls) (define-syntaxes define-values-for-syntax)
|
||||
[(define-syntaxes (id ...) . rhs)
|
||||
#`(define-syntaxes (id ...)
|
||||
(#%plain-app (#%plain-app vector-ref #,(if just-one-ct? ct-rhs compile-time) #,ct-pos)))]
|
||||
[(define-values-for-syntax (id ...) . rhs)
|
||||
#`(define-values-for-syntax ()
|
||||
(begin
|
||||
(set!-values (id ...)
|
||||
(#%plain-app
|
||||
(#%plain-app vector-ref #,(if just-one-ct? ct-rhs compile-time)
|
||||
#,ct-pos)))
|
||||
(#%plain-app values)))])
|
||||
(loop (cdr decls) (add1 ct-pos) rt-pos))])))
|
||||
magic-sym))))
|
||||
|
||||
(define (local-identifier? stx trans?)
|
||||
(eq? 'lexical ((if trans?
|
||||
identifier-transformer-binding
|
||||
identifier-binding)
|
||||
stx)))
|
||||
|
||||
(define (simple-identifier stx trans?)
|
||||
(let ([b ((if trans?
|
||||
identifier-transformer-binding
|
||||
identifier-binding)
|
||||
stx)])
|
||||
(cond
|
||||
[(eq? b 'lexical) stx]
|
||||
[(and (pair? b)
|
||||
(eq? '#%kernel (car b)))
|
||||
;; Generate a syntax object that has the right run-time binding:
|
||||
(datum->syntax #'here (cadr b) stx stx)]
|
||||
[else #f])))
|
||||
|
||||
(define (add-literal/pos stx li)
|
||||
(let ([pos (lifted-info-counter li)])
|
||||
(hash-set! (lifted-info-slot-map li) pos stx)
|
||||
(set-lifted-info-counter! li (add1 pos))
|
||||
pos))
|
||||
|
||||
(define (add-literal stx li safe-vector-ref-stx id)
|
||||
#`(#,safe-vector-ref-stx #,id #,(add-literal/pos stx li)))
|
||||
|
||||
(define (add-identifier/pos stx li trans?)
|
||||
(if (identifier? stx)
|
||||
;; id :
|
||||
(or (module-identifier-mapping-get (lifted-info-id-map li)
|
||||
stx
|
||||
(lambda () #f))
|
||||
(let ([pos (add-literal/pos (if (not ((if trans?
|
||||
identifier-transformer-binding
|
||||
identifier-binding)
|
||||
stx))
|
||||
#`(#%top . #,stx)
|
||||
stx)
|
||||
li)])
|
||||
(module-identifier-mapping-put! (lifted-info-id-map li) stx pos)
|
||||
pos))
|
||||
;; (#%top . id) :
|
||||
(add-literal/pos stx li)))
|
||||
|
||||
(define (add-identifier stx li trans? lookup-stx id)
|
||||
#`(#,lookup-stx #,id #,(add-identifier/pos stx li trans?)))
|
||||
|
||||
(define-syntax quasisyntax/loc+props
|
||||
(syntax-rules ()
|
||||
[(_ stx e) (let ([old-s stx]
|
||||
[new-s (quasisyntax e)])
|
||||
(datum->syntax new-s
|
||||
(syntax-e new-s)
|
||||
old-s
|
||||
old-s))]))
|
||||
(define code-insp (current-code-inspector))
|
||||
|
||||
(define (convert stx trans? lookup-stx set-stx safe-vector-ref-stx id li in-module?
|
||||
simple-constant? stop-properties)
|
||||
(define (loop stx)
|
||||
(if (ormap (lambda (prop)
|
||||
(syntax-property stx prop))
|
||||
stop-properties)
|
||||
stx
|
||||
(kernel-syntax-case (syntax-disarm stx code-insp) trans?
|
||||
[_
|
||||
(identifier? stx)
|
||||
(or (simple-identifier stx trans?)
|
||||
(add-identifier stx li trans? lookup-stx id))]
|
||||
[(#%provide . _)
|
||||
stx]
|
||||
[(#%plain-lambda formals e ...)
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(#%plain-lambda formals #,@(map loop (syntax->list #'(e ...)))))]
|
||||
[(case-lambda [formals e ...] ...)
|
||||
(with-syntax ([((e ...) ...)
|
||||
(map (lambda (l)
|
||||
(map loop (syntax->list l)))
|
||||
(syntax->list #'((e ...) ...)))])
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(case-lambda [formals e ...] ...)))]
|
||||
[(let-values ([(id ...) rhs] ...) e ...)
|
||||
(with-syntax ([(rhs ...)
|
||||
(map loop (syntax->list #'(rhs ...)))])
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(let-values ([(id ...) rhs] ...) #,@(map loop (syntax->list #'(e ...))))))]
|
||||
[(letrec-values ([(id ...) rhs] ...) e ...)
|
||||
(with-syntax ([(rhs ...)
|
||||
(map loop (syntax->list #'(rhs ...)))])
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(letrec-values ([(id ...) rhs] ...) #,@(map loop (syntax->list #'(e ...))))))]
|
||||
[(quote e)
|
||||
(if (simple-constant? #'e)
|
||||
#'(quote e)
|
||||
(add-literal stx li safe-vector-ref-stx id))]
|
||||
[(quote-syntax e)
|
||||
(add-literal stx li safe-vector-ref-stx id)]
|
||||
[(#%top . tid)
|
||||
(let ([target (let ([b ((if trans?
|
||||
identifier-transformer-binding
|
||||
identifier-binding)
|
||||
#'tid)])
|
||||
(if (or (eq? b 'lexical)
|
||||
(and (not in-module?)
|
||||
b))
|
||||
#`(#%top . tid)
|
||||
#'tid))])
|
||||
(add-identifier target li trans? lookup-stx id))]
|
||||
[(set! x e)
|
||||
(if (local-identifier? #'x trans?)
|
||||
(quasisyntax/loc+props stx (set! x #,(loop #'e)))
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(#,set-stx #,id #,(add-identifier/pos #'x li trans?) #,(loop #'e))))]
|
||||
[(#%variable-reference e)
|
||||
(add-literal stx li safe-vector-ref-stx id)]
|
||||
[(if e ...)
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(if #,@(map loop (syntax->list #'(e ...)))))]
|
||||
[(begin e ...)
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(begin #,@(map loop (syntax->list #'(e ...)))))]
|
||||
[(begin0 e ...)
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(begin0 #,@(map loop (syntax->list #'(e ...)))))]
|
||||
[(with-continuation-mark e ...)
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(with-continuation-mark #,@(map loop (syntax->list #'(e ...)))))]
|
||||
[(#%plain-app e ...)
|
||||
(quasisyntax/loc+props
|
||||
stx
|
||||
(#%plain-app #,@(map loop (syntax->list #'(e ...)))))])))
|
||||
(loop stx)))
|
Loading…
Reference in New Issue
Block a user