move more decls to picrin.h
This commit is contained in:
		
							parent
							
								
									f70dd4d376
								
							
						
					
					
						commit
						780df6275b
					
				|  | @ -156,6 +156,7 @@ void pic_closure_set(pic_state *, int, pic_value); | |||
| pic_value pic_funcall(pic_state *pic, struct pic_lib *, const char *, int, ...); | ||||
| 
 | ||||
| struct pic_lib *pic_make_library(pic_state *, pic_value); | ||||
| void pic_in_library(pic_state *, pic_value); | ||||
| struct pic_lib *pic_find_library(pic_state *, pic_value); | ||||
| void pic_import(pic_state *, struct pic_lib *); | ||||
| void pic_export(pic_state *, pic_sym *); | ||||
|  | @ -170,10 +171,96 @@ pic_value pic_vcall(pic_state *, struct pic_proc *, int, va_list); | |||
| pic_value pic_apply(pic_state *, struct pic_proc *, int, pic_value *); | ||||
| pic_value pic_applyk(pic_state *, struct pic_proc *, int, pic_value *); | ||||
| 
 | ||||
| int pic_int(pic_value); | ||||
| double pic_float(pic_value); | ||||
| char pic_char(pic_value); | ||||
| bool pic_bool(pic_value); | ||||
| /* const char *pic_str(pic_state *, pic_value, int *len); */ | ||||
| /* unsigned char *pic_blob(pic_state *, pic_value, int *len); */ | ||||
| void *pic_data(pic_state *, pic_value); | ||||
| 
 | ||||
| pic_value pic_undef_value(); | ||||
| pic_value pic_int_value(int); | ||||
| pic_value pic_float_value(double); | ||||
| pic_value pic_char_value(char c); | ||||
| pic_value pic_true_value(); | ||||
| pic_value pic_false_value(); | ||||
| pic_value pic_bool_value(bool); | ||||
| 
 | ||||
| #define pic_int_p(v) (pic_vtype(v) == PIC_VTYPE_INT) | ||||
| #define pic_float_p(v) (pic_vtype(v) == PIC_VTYPE_FLOAT) | ||||
| #define pic_char_p(v) (pic_vtype(v) == PIC_VTYPE_CHAR) | ||||
| #define pic_true_p(v) (pic_vtype(v) == PIC_VTYPE_TRUE) | ||||
| #define pic_false_p(v) (pic_vtype(v) == PIC_VTYPE_FALSE) | ||||
| #define pic_str_p(v) (pic_type(v) == PIC_TT_STRING) | ||||
| #define pic_blob_p(v) (pic_type(v) == PIC_TT_BLOB) | ||||
| #define pic_proc_p(o) (pic_type(o) == PIC_TT_PROC) | ||||
| #define pic_data_p(o) (pic_type(o) == PIC_TT_DATA) | ||||
| #define pic_nil_p(v) (pic_vtype(v) == PIC_VTYPE_NIL) | ||||
| #define pic_pair_p(v) (pic_type(v) == PIC_TT_PAIR) | ||||
| #define pic_vec_p(v) (pic_type(v) == PIC_TT_VECTOR) | ||||
| #define pic_dict_p(v) (pic_type(v) == PIC_TT_DICT) | ||||
| #define pic_weak_p(v) (pic_type(v) == PIC_TT_WEAK) | ||||
| #define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) | ||||
| #define pic_undef_p(v) (pic_vtype(v) == PIC_VTYPE_UNDEF) | ||||
| 
 | ||||
| enum pic_tt pic_type(pic_value); | ||||
| const char *pic_type_repr(enum pic_tt); | ||||
| 
 | ||||
| bool pic_eq_p(pic_value, pic_value); | ||||
| bool pic_eqv_p(pic_value, pic_value); | ||||
| bool pic_equal_p(pic_state *, pic_value, pic_value); | ||||
| 
 | ||||
| /* list */ | ||||
| pic_value pic_nil_value(); | ||||
| pic_value pic_cons(pic_state *, pic_value, pic_value); | ||||
| PIC_INLINE pic_value pic_car(pic_state *, pic_value); | ||||
| PIC_INLINE pic_value pic_cdr(pic_state *, pic_value); | ||||
| void pic_set_car(pic_state *, pic_value, pic_value); | ||||
| void pic_set_cdr(pic_state *, pic_value, pic_value); | ||||
| bool pic_list_p(pic_value); | ||||
| pic_value pic_list(pic_state *, int n, ...); | ||||
| pic_value pic_vlist(pic_state *, int n, va_list); | ||||
| pic_value pic_list_ref(pic_state *, pic_value, int); | ||||
| void pic_list_set(pic_state *, pic_value, int, pic_value); | ||||
| int pic_length(pic_state *, pic_value); | ||||
| 
 | ||||
| /* vector */ | ||||
| pic_vec *pic_make_vec(pic_state *, int); | ||||
| pic_value pic_vec_ref(pic_state *, pic_vec *, int); | ||||
| void pic_vec_set(pic_state *, pic_vec *, int, pic_value); | ||||
| int pic_vec_len(pic_state *, pic_vec *); | ||||
| 
 | ||||
| /* dictionary */ | ||||
| struct pic_dict *pic_make_dict(pic_state *); | ||||
| pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_sym *); | ||||
| void pic_dict_set(pic_state *, struct pic_dict *, pic_sym *, pic_value); | ||||
| void pic_dict_del(pic_state *, struct pic_dict *, pic_sym *); | ||||
| bool pic_dict_has(pic_state *, struct pic_dict *, pic_sym *); | ||||
| int pic_dict_size(pic_state *, struct pic_dict *); | ||||
| 
 | ||||
| /* ephemeron */ | ||||
| struct pic_weak *pic_make_weak(pic_state *); | ||||
| pic_value pic_weak_ref(pic_state *, struct pic_weak *, void *); | ||||
| void pic_weak_set(pic_state *, struct pic_weak *, void *, pic_value); | ||||
| void pic_weak_del(pic_state *, struct pic_weak *, void *); | ||||
| bool pic_weak_has(pic_state *, struct pic_weak *, void *); | ||||
| 
 | ||||
| /* symbol */ | ||||
| pic_sym *pic_intern(pic_state *, pic_str *); | ||||
| #define pic_intern_str(pic,s,i) pic_intern(pic, pic_make_str(pic, (s), (i))) | ||||
| #define pic_intern_cstr(pic,s) pic_intern(pic, pic_make_cstr(pic, (s))) | ||||
| #define pic_intern_lit(pic,lit) pic_intern(pic, pic_make_lit(pic, lit)) | ||||
| const char *pic_symbol_name(pic_state *, pic_sym *); | ||||
| 
 | ||||
| /* string */ | ||||
| int pic_str_len(pic_str *); | ||||
| char pic_str_ref(pic_state *, pic_str *, int); | ||||
| pic_str *pic_str_cat(pic_state *, pic_str *, pic_str *); | ||||
| pic_str *pic_str_sub(pic_state *, pic_str *, int, int); | ||||
| int pic_str_cmp(pic_state *, pic_str *, pic_str *); | ||||
| int pic_str_hash(pic_state *, pic_str *); | ||||
| 
 | ||||
| #include "picrin/blob.h" | ||||
| #include "picrin/cont.h" | ||||
| #include "picrin/data.h" | ||||
|  |  | |||
|  | @ -15,7 +15,6 @@ struct pic_blob { | |||
|   int len; | ||||
| }; | ||||
| 
 | ||||
| #define pic_blob_p(v) (pic_type(v) == PIC_TT_BLOB) | ||||
| #define pic_blob_ptr(v) ((struct pic_blob *)pic_ptr(v)) | ||||
| 
 | ||||
| struct pic_blob *pic_make_blob(pic_state *, int); | ||||
|  |  | |||
|  | @ -21,7 +21,6 @@ struct pic_data { | |||
|   void *data; | ||||
| }; | ||||
| 
 | ||||
| #define pic_data_p(o) (pic_type(o) == PIC_TT_DATA) | ||||
| #define pic_data_ptr(o) ((struct pic_data *)pic_ptr(o)) | ||||
| 
 | ||||
| PIC_INLINE bool pic_data_type_p(const pic_value obj, const pic_data_type *type) { | ||||
|  |  | |||
|  | @ -16,23 +16,14 @@ struct pic_dict { | |||
|   khash_t(dict) hash; | ||||
| }; | ||||
| 
 | ||||
| #define pic_dict_p(v) (pic_type(v) == PIC_TT_DICT) | ||||
| #define pic_dict_ptr(v) ((struct pic_dict *)pic_ptr(v)) | ||||
| 
 | ||||
| struct pic_dict *pic_make_dict(pic_state *); | ||||
| 
 | ||||
| #define pic_dict_for_each(sym, dict, it)        \ | ||||
|   pic_dict_for_each_help(sym, (&(dict)->hash), it) | ||||
| #define pic_dict_for_each_help(sym, h, it)        \ | ||||
|   for (it = kh_begin(h); it != kh_end(h); ++it)   \ | ||||
|     if ((sym = kh_key(h, it)), kh_exist(h, it)) | ||||
| 
 | ||||
| pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_sym *); | ||||
| void pic_dict_set(pic_state *, struct pic_dict *, pic_sym *, pic_value); | ||||
| void pic_dict_del(pic_state *, struct pic_dict *, pic_sym *); | ||||
| int pic_dict_size(pic_state *, struct pic_dict *); | ||||
| bool pic_dict_has(pic_state *, struct pic_dict *, pic_sym *); | ||||
| 
 | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -15,7 +15,6 @@ struct pic_pair { | |||
|   pic_value cdr; | ||||
| }; | ||||
| 
 | ||||
| #define pic_pair_p(v) (pic_type(v) == PIC_TT_PAIR) | ||||
| #define pic_pair_ptr(o) ((struct pic_pair *)pic_ptr(o)) | ||||
| 
 | ||||
| PIC_INLINE pic_value | ||||
|  | @ -44,11 +43,6 @@ pic_cdr(pic_state *pic, pic_value obj) | |||
|   return pair->cdr; | ||||
| } | ||||
| 
 | ||||
| pic_value pic_cons(pic_state *, pic_value, pic_value); | ||||
| void pic_set_car(pic_state *, pic_value, pic_value); | ||||
| void pic_set_cdr(pic_state *, pic_value, pic_value); | ||||
| 
 | ||||
| bool pic_list_p(pic_value); | ||||
| pic_value pic_list1(pic_state *, pic_value); | ||||
| pic_value pic_list2(pic_state *, pic_value, pic_value); | ||||
| pic_value pic_list3(pic_state *, pic_value, pic_value, pic_value); | ||||
|  | @ -66,7 +60,6 @@ pic_value pic_make_list(pic_state *, int, pic_value); | |||
| #define pic_push(pic, item, place) (place = pic_cons(pic, item, place)) | ||||
| #define pic_pop(pic, place) (place = pic_cdr(pic, place)) | ||||
| 
 | ||||
| int pic_length(pic_state *, pic_value); | ||||
| pic_value pic_reverse(pic_state *, pic_value); | ||||
| pic_value pic_append(pic_state *, pic_value, pic_value); | ||||
| 
 | ||||
|  | @ -86,8 +79,6 @@ pic_value pic_cdar(pic_state *, pic_value); | |||
| pic_value pic_cddr(pic_state *, pic_value); | ||||
| 
 | ||||
| pic_value pic_list_tail(pic_state *, pic_value, int); | ||||
| pic_value pic_list_ref(pic_state *, pic_value, int); | ||||
| void pic_list_set(pic_state *, pic_value, int, pic_value); | ||||
| pic_value pic_list_copy(pic_state *, pic_value); | ||||
| 
 | ||||
| #if defined(__cplusplus) | ||||
|  |  | |||
|  | @ -39,7 +39,6 @@ struct pic_proc { | |||
| #define pic_proc_func_p(proc) ((proc)->tag == PIC_PROC_TAG_FUNC) | ||||
| #define pic_proc_irep_p(proc) ((proc)->tag == PIC_PROC_TAG_IREP) | ||||
| 
 | ||||
| #define pic_proc_p(o) (pic_type(o) == PIC_TT_PROC) | ||||
| #define pic_proc_ptr(o) ((struct pic_proc *)pic_ptr(o)) | ||||
| 
 | ||||
| #define pic_context_p(o) (pic_type(o) == PIC_TT_CXT) | ||||
|  |  | |||
|  | @ -17,19 +17,12 @@ struct pic_string { | |||
| void pic_rope_incref(pic_state *, struct pic_rope *); | ||||
| void pic_rope_decref(pic_state *, struct pic_rope *); | ||||
| 
 | ||||
| #define pic_str_p(v) (pic_type(v) == PIC_TT_STRING) | ||||
| #define pic_str_ptr(o) ((struct pic_string *)pic_ptr(o)) | ||||
| 
 | ||||
| pic_str *pic_make_str(pic_state *, const char *, int); | ||||
| #define pic_make_cstr(pic, cstr) pic_make_str(pic, (cstr), strlen(cstr)) | ||||
| #define pic_make_lit(pic, lit) pic_make_str(pic, "" lit, -((int)sizeof lit - 1)) | ||||
| 
 | ||||
| char pic_str_ref(pic_state *, pic_str *, int); | ||||
| int pic_str_len(pic_str *); | ||||
| pic_str *pic_str_cat(pic_state *, pic_str *, pic_str *); | ||||
| pic_str *pic_str_sub(pic_state *, pic_str *, int, int); | ||||
| int pic_str_cmp(pic_state *, pic_str *, pic_str *); | ||||
| int pic_str_hash(pic_state *, pic_str *); | ||||
| const char *pic_str_cstr(pic_state *, pic_str *); | ||||
| 
 | ||||
| pic_str *pic_format(pic_state *, const char *, ...); | ||||
|  |  | |||
|  | @ -23,20 +23,13 @@ struct pic_id { | |||
|   } u; | ||||
| }; | ||||
| 
 | ||||
| #define pic_sym_p(v) (pic_type(v) == PIC_TT_SYMBOL) | ||||
| #define pic_sym_ptr(v) ((pic_sym *)pic_ptr(v)) | ||||
| 
 | ||||
| #define pic_id_p(v) (pic_type(v) == PIC_TT_ID || pic_type(v) == PIC_TT_SYMBOL) | ||||
| #define pic_id_ptr(v) ((pic_id *)pic_ptr(v)) | ||||
| 
 | ||||
| pic_sym *pic_intern(pic_state *, pic_str *); | ||||
| #define pic_intern_str(pic,s,i) pic_intern(pic, pic_make_str(pic, (s), (i))) | ||||
| #define pic_intern_cstr(pic,s) pic_intern(pic, pic_make_cstr(pic, (s))) | ||||
| #define pic_intern_lit(pic,lit) pic_intern(pic, pic_make_lit(pic, lit)) | ||||
| 
 | ||||
| pic_id *pic_make_identifier(pic_state *, pic_id *, struct pic_env *); | ||||
| 
 | ||||
| const char *pic_symbol_name(pic_state *, pic_sym *); | ||||
| const char *pic_identifier_name(pic_state *, pic_id *); | ||||
| 
 | ||||
| #if defined(__cplusplus) | ||||
|  |  | |||
|  | @ -66,7 +66,11 @@ pic_int(pic_value v) | |||
|   return u.i; | ||||
| } | ||||
| 
 | ||||
| #define pic_char(v) ((v) & 0xfffffffful) | ||||
| static inline char | ||||
| pic_char(pic_value v) | ||||
| { | ||||
|   return v & 0xfffffffful; | ||||
| } | ||||
| 
 | ||||
| #elif PIC_WORD_BOXING | ||||
| 
 | ||||
|  | @ -124,9 +128,23 @@ typedef struct { | |||
| #define pic_vtype(v) ((v).type) | ||||
| #define pic_init_value(v,vtype) ((v).type = (vtype), (v).u.data = NULL) | ||||
| 
 | ||||
| #define pic_float(v) ((v).u.f) | ||||
| #define pic_int(v) ((v).u.i) | ||||
| #define pic_char(v) ((v).u.c) | ||||
| PIC_INLINE double | ||||
| pic_float(pic_value v) | ||||
| { | ||||
|   return v.u.f; | ||||
| } | ||||
| 
 | ||||
| PIC_INLINE int | ||||
| pic_int(pic_value v) | ||||
| { | ||||
|   return v.u.i; | ||||
| } | ||||
| 
 | ||||
| PIC_INLINE char | ||||
| pic_char(pic_value v) | ||||
| { | ||||
|   return v.u.c; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
|  | @ -191,21 +209,11 @@ typedef struct pic_blob pic_blob; | |||
| #define pic_obj_p(v) (pic_vtype(v) == PIC_VTYPE_HEAP) | ||||
| #define pic_obj_ptr(v) ((struct pic_object *)pic_ptr(v)) | ||||
| 
 | ||||
| #define pic_nil_p(v) (pic_vtype(v) == PIC_VTYPE_NIL) | ||||
| #define pic_true_p(v) (pic_vtype(v) == PIC_VTYPE_TRUE) | ||||
| #define pic_false_p(v) (pic_vtype(v) == PIC_VTYPE_FALSE) | ||||
| #define pic_undef_p(v) (pic_vtype(v) == PIC_VTYPE_UNDEF) | ||||
| #define pic_invalid_p(v) (pic_vtype(v) == PIC_VTYPE_INVALID) | ||||
| #define pic_float_p(v) (pic_vtype(v) == PIC_VTYPE_FLOAT) | ||||
| #define pic_int_p(v) (pic_vtype(v) == PIC_VTYPE_INT) | ||||
| #define pic_char_p(v) (pic_vtype(v) == PIC_VTYPE_CHAR) | ||||
| #define pic_eof_p(v) (pic_vtype(v) == PIC_VTYPE_EOF) | ||||
| 
 | ||||
| #define pic_test(v) (! pic_false_p(v)) | ||||
| 
 | ||||
| PIC_INLINE enum pic_tt pic_type(pic_value); | ||||
| PIC_INLINE const char *pic_type_repr(enum pic_tt); | ||||
| 
 | ||||
| #define pic_assert_type(pic, v, type)                           \ | ||||
|   if (! pic_##type##_p(v)) {                                    \ | ||||
|     pic_errorf(pic, "expected " #type ", but got ~s", v);       \ | ||||
|  | @ -217,19 +225,8 @@ pic_valid_int(double v) | |||
|   return INT_MIN <= v && v <= INT_MAX; | ||||
| } | ||||
| 
 | ||||
| PIC_INLINE pic_value pic_nil_value(); | ||||
| PIC_INLINE pic_value pic_true_value(); | ||||
| PIC_INLINE pic_value pic_false_value(); | ||||
| PIC_INLINE pic_value pic_bool_value(bool); | ||||
| PIC_INLINE pic_value pic_undef_value(); | ||||
| PIC_INLINE pic_value pic_invalid_value(); | ||||
| PIC_INLINE pic_value pic_obj_value(void *); | ||||
| PIC_INLINE pic_value pic_float_value(double); | ||||
| PIC_INLINE pic_value pic_int_value(int); | ||||
| PIC_INLINE pic_value pic_char_value(char c); | ||||
| 
 | ||||
| PIC_INLINE bool pic_eq_p(pic_value, pic_value); | ||||
| PIC_INLINE bool pic_eqv_p(pic_value, pic_value); | ||||
| 
 | ||||
| PIC_INLINE enum pic_tt | ||||
| pic_type(pic_value v) | ||||
|  | @ -538,58 +535,15 @@ pic_eqv_p(pic_value x, pic_value y) | |||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #define pic_define_aop(name, op, guard)                                 \ | ||||
|   PIC_INLINE pic_value                                                  \ | ||||
|   name(pic_state *pic, pic_value a, pic_value b)                        \ | ||||
|   {                                                                     \ | ||||
|     PIC_NORETURN void pic_errorf(pic_state *, const char *, ...);       \ | ||||
|     double f;                                                           \ | ||||
|     if (pic_int_p(a) && pic_int_p(b)) {                                 \ | ||||
|       f = (double)pic_int(a) op (double)pic_int(b);                     \ | ||||
|       return (INT_MIN <= f && f <= INT_MAX && guard)                    \ | ||||
|         ? pic_int_value((int)f)                                         \ | ||||
|         : pic_float_value(f);                                           \ | ||||
|     } else if (pic_float_p(a) && pic_float_p(b)) {                      \ | ||||
|       return pic_float_value(pic_float(a) op pic_float(b));             \ | ||||
|     } else if (pic_int_p(a) && pic_float_p(b)) {                        \ | ||||
|       return pic_float_value(pic_int(a) op pic_float(b));               \ | ||||
|     } else if (pic_float_p(a) && pic_int_p(b)) {                        \ | ||||
|       return pic_float_value(pic_float(a) op pic_int(b));               \ | ||||
|     } else {                                                            \ | ||||
|       pic_errorf(pic, #name ": non-number operand given");              \ | ||||
|     }                                                                   \ | ||||
|     PIC_UNREACHABLE();                                                  \ | ||||
|   } | ||||
| 
 | ||||
| pic_define_aop(pic_add, +, true) | ||||
| pic_define_aop(pic_sub, -, true) | ||||
| pic_define_aop(pic_mul, *, true) | ||||
| pic_define_aop(pic_div, /, f == (int)f) | ||||
| 
 | ||||
| #define pic_define_cmp(name, op)                                        \ | ||||
|   PIC_INLINE bool                                                       \ | ||||
|   name(pic_state *pic, pic_value a, pic_value b)                        \ | ||||
|   {                                                                     \ | ||||
|     PIC_NORETURN void pic_errorf(pic_state *, const char *, ...);       \ | ||||
|     if (pic_int_p(a) && pic_int_p(b)) {                                 \ | ||||
|       return pic_int(a) op pic_int(b);                                  \ | ||||
|     } else if (pic_float_p(a) && pic_float_p(b)) {                      \ | ||||
|       return pic_float(a) op pic_float(b);                              \ | ||||
|     } else if (pic_int_p(a) && pic_float_p(b)) {                        \ | ||||
|       return pic_int(a) op pic_float(b);                                \ | ||||
|     } else if (pic_float_p(a) && pic_int_p(b)) {                        \ | ||||
|       return pic_float(a) op pic_int(b);                                \ | ||||
|     } else {                                                            \ | ||||
|       pic_errorf(pic, #name ": non-number operand given");              \ | ||||
|     }                                                                   \ | ||||
|     PIC_UNREACHABLE();                                                  \ | ||||
|   } | ||||
| 
 | ||||
| pic_define_cmp(pic_eq, ==) | ||||
| pic_define_cmp(pic_lt, <) | ||||
| pic_define_cmp(pic_le, <=) | ||||
| pic_define_cmp(pic_gt, >) | ||||
| pic_define_cmp(pic_ge, >=) | ||||
| pic_value pic_add(pic_state *, pic_value, pic_value); | ||||
| pic_value pic_sub(pic_state *, pic_value, pic_value); | ||||
| pic_value pic_mul(pic_state *, pic_value, pic_value); | ||||
| pic_value pic_div(pic_state *, pic_value, pic_value); | ||||
| bool pic_eq(pic_state *, pic_value, pic_value); | ||||
| bool pic_lt(pic_state *, pic_value, pic_value); | ||||
| bool pic_le(pic_state *, pic_value, pic_value); | ||||
| bool pic_gt(pic_state *, pic_value, pic_value); | ||||
| bool pic_ge(pic_state *, pic_value, pic_value); | ||||
| 
 | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
|  |  | |||
|  | @ -15,11 +15,8 @@ struct pic_vector { | |||
|   int len; | ||||
| }; | ||||
| 
 | ||||
| #define pic_vec_p(v) (pic_type(v) == PIC_TT_VECTOR) | ||||
| #define pic_vec_ptr(o) ((struct pic_vector *)pic_ptr(o)) | ||||
| 
 | ||||
| pic_vec *pic_make_vec(pic_state *, int); | ||||
| 
 | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -17,16 +17,8 @@ struct pic_weak { | |||
|   struct pic_weak *prev;         /* for GC */ | ||||
| }; | ||||
| 
 | ||||
| #define pic_weak_p(v) (pic_type(v) == PIC_TT_WEAK) | ||||
| #define pic_weak_ptr(v) ((struct pic_weak *)pic_ptr(v)) | ||||
| 
 | ||||
| struct pic_weak *pic_make_weak(pic_state *); | ||||
| 
 | ||||
| pic_value pic_weak_ref(pic_state *, struct pic_weak *, void *); | ||||
| void pic_weak_set(pic_state *, struct pic_weak *, void *, pic_value); | ||||
| void pic_weak_del(pic_state *, struct pic_weak *, void *); | ||||
| bool pic_weak_has(pic_state *, struct pic_weak *, void *); | ||||
| 
 | ||||
| #if defined(__cplusplus) | ||||
| } | ||||
| #endif | ||||
|  |  | |||
|  | @ -54,6 +54,59 @@ pic_number_exact(pic_state *pic) | |||
|   return pic_int_value((int)f); | ||||
| } | ||||
| 
 | ||||
| #define pic_define_aop(name, op, guard)                                 \ | ||||
|   pic_value                                                             \ | ||||
|   name(pic_state *pic, pic_value a, pic_value b)                        \ | ||||
|   {                                                                     \ | ||||
|     PIC_NORETURN void pic_errorf(pic_state *, const char *, ...);       \ | ||||
|     double f;                                                           \ | ||||
|     if (pic_int_p(a) && pic_int_p(b)) {                                 \ | ||||
|       f = (double)pic_int(a) op (double)pic_int(b);                     \ | ||||
|       return (INT_MIN <= f && f <= INT_MAX && guard)                    \ | ||||
|         ? pic_int_value((int)f)                                         \ | ||||
|         : pic_float_value(f);                                           \ | ||||
|     } else if (pic_float_p(a) && pic_float_p(b)) {                      \ | ||||
|       return pic_float_value(pic_float(a) op pic_float(b));             \ | ||||
|     } else if (pic_int_p(a) && pic_float_p(b)) {                        \ | ||||
|       return pic_float_value(pic_int(a) op pic_float(b));               \ | ||||
|     } else if (pic_float_p(a) && pic_int_p(b)) {                        \ | ||||
|       return pic_float_value(pic_float(a) op pic_int(b));               \ | ||||
|     } else {                                                            \ | ||||
|       pic_errorf(pic, #name ": non-number operand given");              \ | ||||
|     }                                                                   \ | ||||
|     PIC_UNREACHABLE();                                                  \ | ||||
|   } | ||||
| 
 | ||||
| pic_define_aop(pic_add, +, true) | ||||
| pic_define_aop(pic_sub, -, true) | ||||
| pic_define_aop(pic_mul, *, true) | ||||
| pic_define_aop(pic_div, /, f == (int)f) | ||||
| 
 | ||||
| #define pic_define_cmp(name, op)                                        \ | ||||
|   bool                                                                  \ | ||||
|   name(pic_state *pic, pic_value a, pic_value b)                        \ | ||||
|   {                                                                     \ | ||||
|     PIC_NORETURN void pic_errorf(pic_state *, const char *, ...);       \ | ||||
|     if (pic_int_p(a) && pic_int_p(b)) {                                 \ | ||||
|       return pic_int(a) op pic_int(b);                                  \ | ||||
|     } else if (pic_float_p(a) && pic_float_p(b)) {                      \ | ||||
|       return pic_float(a) op pic_float(b);                              \ | ||||
|     } else if (pic_int_p(a) && pic_float_p(b)) {                        \ | ||||
|       return pic_int(a) op pic_float(b);                                \ | ||||
|     } else if (pic_float_p(a) && pic_int_p(b)) {                        \ | ||||
|       return pic_float(a) op pic_int(b);                                \ | ||||
|     } else {                                                            \ | ||||
|       pic_errorf(pic, #name ": non-number operand given");              \ | ||||
|     }                                                                   \ | ||||
|     PIC_UNREACHABLE();                                                  \ | ||||
|   } | ||||
| 
 | ||||
| pic_define_cmp(pic_eq, ==) | ||||
| pic_define_cmp(pic_lt, <) | ||||
| pic_define_cmp(pic_le, <=) | ||||
| pic_define_cmp(pic_gt, >) | ||||
| pic_define_cmp(pic_ge, >=) | ||||
| 
 | ||||
| #define DEFINE_CMP(op)                                  \ | ||||
|   static pic_value                                      \ | ||||
|   pic_number_##op(pic_state *pic)                       \ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki