Refactor function definitions
This commit is contained in:
@ -444,6 +444,3 @@
|
|||||||
(t (print obj)))
|
(t (print obj)))
|
||||||
(when newline
|
(when newline
|
||||||
(println)))
|
(println)))
|
||||||
|
|
||||||
(breakpoint)
|
|
||||||
'
|
|
||||||
|
|||||||
786
src/lisp.c
786
src/lisp.c
File diff suppressed because it is too large
Load Diff
74
src/lisp.h
74
src/lisp.h
@ -161,6 +161,16 @@ typedef struct {
|
|||||||
LispVal *imported; // list of (package . (str -> bool))
|
LispVal *imported; // list of (package . (str -> bool))
|
||||||
} LispPackage;
|
} LispPackage;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
LISP_OBJECT_HEADER;
|
||||||
|
|
||||||
|
LispVal *class;
|
||||||
|
} LispObject;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
LispObject as_obj;
|
||||||
|
} LispClass;
|
||||||
|
|
||||||
// #######################
|
// #######################
|
||||||
// # nil, unbound, and t #
|
// # nil, unbound, and t #
|
||||||
// #######################
|
// #######################
|
||||||
@ -258,7 +268,9 @@ inline static bool NUMBERP(LispVal *v) {
|
|||||||
extern LispVal *Q##c_name
|
extern LispVal *Q##c_name
|
||||||
// The args and doc fields are filled when the function is registered
|
// The args and doc fields are filled when the function is registered
|
||||||
#define _INTERNAL_DEFUN_EXTENDED(macrop, du, c_name, lisp_name, c_args, \
|
#define _INTERNAL_DEFUN_EXTENDED(macrop, du, c_name, lisp_name, c_args, \
|
||||||
static_kw) \
|
static_kw, lisp_args, doc_cstr) \
|
||||||
|
static const char _F##c_name##lisp_args_cstr[] = lisp_args; \
|
||||||
|
static const char _F##c_name##doccstr[] = doc_cstr; \
|
||||||
static_kw LispVal *F##c_name c_args; \
|
static_kw LispVal *F##c_name c_args; \
|
||||||
DEF_STATIC_STRING(_Q##c_name##_fnnamestr, lisp_name); \
|
DEF_STATIC_STRING(_Q##c_name##_fnnamestr, lisp_name); \
|
||||||
static LispSymbol _Q##c_name; \
|
static LispSymbol _Q##c_name; \
|
||||||
@ -288,16 +300,21 @@ inline static bool NUMBERP(LispVal *v) {
|
|||||||
}; \
|
}; \
|
||||||
LispVal *Q##c_name = (LispVal *) &_Q##c_name; \
|
LispVal *Q##c_name = (LispVal *) &_Q##c_name; \
|
||||||
static_kw LispVal *F##c_name c_args
|
static_kw LispVal *F##c_name c_args
|
||||||
#define DEFUN(c_name, lisp_name, c_args) \
|
#define DEFUN(c_name, lisp_name, c_args, lisp_args, doc_cstr) \
|
||||||
_INTERNAL_DEFUN_EXTENDED(false, false, c_name, lisp_name, c_args, )
|
_INTERNAL_DEFUN_EXTENDED(false, false, c_name, lisp_name, c_args, , \
|
||||||
#define DEFUN_DISTINGUISHED(c_name, lisp_name, c_args) \
|
lisp_args, doc_cstr)
|
||||||
_INTERNAL_DEFUN_EXTENDED(false, true, c_name, lisp_name, c_args, )
|
#define DEFUN_DISTINGUISHED(c_name, lisp_name, c_args, lisp_args, doc_cstr) \
|
||||||
#define DEFMACRO(c_name, lisp_name, c_args) \
|
_INTERNAL_DEFUN_EXTENDED(false, true, c_name, lisp_name, c_args, , \
|
||||||
_INTERNAL_DEFUN_EXTENDED(true, false, c_name, lisp_name, c_args, )
|
lisp_args, doc_cstr)
|
||||||
#define STATIC_DEFUN(c_name, lisp_name, c_args) \
|
#define DEFMACRO(c_name, lisp_name, c_args, lisp_args, doc_cstr) \
|
||||||
_INTERNAL_DEFUN_EXTENDED(false, false, c_name, lisp_name, c_args, static)
|
_INTERNAL_DEFUN_EXTENDED(true, false, c_name, lisp_name, c_args, , \
|
||||||
#define STATIC_DEFMACRO(c_name, lisp_name, c_args) \
|
lisp_args, doc_cstr)
|
||||||
_INTERNAL_DEFUN_EXTENDED(true, false, c_name, lisp_name, c_args, static)
|
#define STATIC_DEFUN(c_name, lisp_name, c_args, lisp_args, doc_cstr) \
|
||||||
|
_INTERNAL_DEFUN_EXTENDED(false, false, c_name, lisp_name, c_args, static, \
|
||||||
|
lisp_args, doc_cstr)
|
||||||
|
#define STATIC_DEFMACRO(c_name, lisp_name, c_args, lisp_args, doc_cstr) \
|
||||||
|
_INTERNAL_DEFUN_EXTENDED(true, false, c_name, lisp_name, c_args, static, \
|
||||||
|
lisp_args, doc_cstr)
|
||||||
|
|
||||||
// registration
|
// registration
|
||||||
#define REGISTER_SYMBOL_NOINTERN(sym) \
|
#define REGISTER_SYMBOL_NOINTERN(sym) \
|
||||||
@ -313,20 +330,20 @@ inline static bool NUMBERP(LispVal *v) {
|
|||||||
REGISTER_SYMBOL_NOINTERN(sym) \
|
REGISTER_SYMBOL_NOINTERN(sym) \
|
||||||
REGISTER_DO_INTERN(sym, pkg)
|
REGISTER_DO_INTERN(sym, pkg)
|
||||||
#define REGISTER_SYMBOL(sym) REGISTER_SYMBOL_INTO(sym, system_package)
|
#define REGISTER_SYMBOL(sym) REGISTER_SYMBOL_INTO(sym, system_package)
|
||||||
#define REGISTER_STATIC_FUNCTION(name, args, docstr) \
|
#define REGISTER_STATIC_FUNCTION(name) \
|
||||||
REGISTER_SYMBOL_NOINTERN(name); \
|
REGISTER_SYMBOL_NOINTERN(name); \
|
||||||
{ \
|
{ \
|
||||||
LispVal *obj = ((LispSymbol *) Q##name)->function; \
|
LispVal *obj = ((LispSymbol *) Q##name)->function; \
|
||||||
refcount_init_static(obj); \
|
refcount_init_static(obj); \
|
||||||
((LispFunction *) (obj))->doc = STATIC_STRING(docstr); \
|
((LispFunction *) (obj))->doc = STATIC_STRING(_F##name##doccstr); \
|
||||||
LispVal *src = STATIC_STRING(args); \
|
LispVal *src = STATIC_STRING(_F##name##lisp_args_cstr); \
|
||||||
LispVal *a = Fread(src, system_package); \
|
LispVal *a = Fread(src, system_package); \
|
||||||
set_function_args((LispFunction *) (obj), a); \
|
set_function_args((LispFunction *) (obj), a); \
|
||||||
refcount_unref(src); \
|
refcount_unref(src); \
|
||||||
refcount_unref(a); \
|
refcount_unref(a); \
|
||||||
}
|
}
|
||||||
#define REGISTER_FUNCTION(fn, args, docstr) \
|
#define REGISTER_FUNCTION(fn) \
|
||||||
REGISTER_STATIC_FUNCTION(fn, args, docstr); \
|
REGISTER_STATIC_FUNCTION(fn); \
|
||||||
((LispSymbol *) Q##fn)->package = refcount_ref(system_package); \
|
((LispSymbol *) Q##fn)->package = refcount_ref(system_package); \
|
||||||
puthash(((LispPackage *) system_package)->obarray, \
|
puthash(((LispPackage *) system_package)->obarray, \
|
||||||
LISPVAL(((LispSymbol *) Q##fn)->name), Q##fn);
|
LISPVAL(((LispSymbol *) Q##fn)->name), Q##fn);
|
||||||
@ -400,8 +417,7 @@ DECLARE_FUNCTION(user_pointer_p, (LispVal * val));
|
|||||||
// ##################################
|
// ##################################
|
||||||
// # Evaluation and Macro Expansion #
|
// # Evaluation and Macro Expansion #
|
||||||
// ##################################
|
// ##################################
|
||||||
DECLARE_FUNCTION(eval_in_env, (LispVal * form, LispVal *lexenv));
|
DECLARE_FUNCTION(eval, (LispVal * form, LispVal *lexenv));
|
||||||
DECLARE_FUNCTION(eval, (LispVal * form));
|
|
||||||
DECLARE_FUNCTION(funcall, (LispVal * function, LispVal *rest));
|
DECLARE_FUNCTION(funcall, (LispVal * function, LispVal *rest));
|
||||||
DECLARE_FUNCTION(apply, (LispVal * function, LispVal *rest));
|
DECLARE_FUNCTION(apply, (LispVal * function, LispVal *rest));
|
||||||
DECLARE_FUNCTION(macroexpand_1, (LispVal * form, LispVal *lexical_macros));
|
DECLARE_FUNCTION(macroexpand_1, (LispVal * form, LispVal *lexical_macros));
|
||||||
@ -507,7 +523,7 @@ DECLARE_FUNCTION(quote_symbol_name, (LispVal * name));
|
|||||||
DECLARE_FUNCTION(symbol_accessible_p, (LispVal * symbol, LispVal *package));
|
DECLARE_FUNCTION(symbol_accessible_p, (LispVal * symbol, LispVal *package));
|
||||||
extern LispVal *Qkw_as_needed;
|
extern LispVal *Qkw_as_needed;
|
||||||
DECLARE_FUNCTION(quote_symbol_for_read,
|
DECLARE_FUNCTION(quote_symbol_for_read,
|
||||||
(LispVal * target, LispVal *include_package));
|
(LispVal * target, LispVal *include_package, LispVal *from));
|
||||||
LispVal *intern(const char *name, size_t length, bool take, LispVal *package,
|
LispVal *intern(const char *name, size_t length, bool take, LispVal *package,
|
||||||
bool included_too);
|
bool included_too);
|
||||||
|
|
||||||
@ -521,7 +537,7 @@ DECLARE_FUNCTION(hash_table_count, (LispVal * table));
|
|||||||
DECLARE_FUNCTION(maphash, (LispVal * func, LispVal *table));
|
DECLARE_FUNCTION(maphash, (LispVal * func, LispVal *table));
|
||||||
DECLARE_FUNCTION(puthash, (LispVal * table, LispVal *key, LispVal *value));
|
DECLARE_FUNCTION(puthash, (LispVal * table, LispVal *key, LispVal *value));
|
||||||
DECLARE_FUNCTION(gethash, (LispVal * table, LispVal *key, LispVal *def));
|
DECLARE_FUNCTION(gethash, (LispVal * table, LispVal *key, LispVal *def));
|
||||||
DECLARE_FUNCTION(remhash, (LispVal * table, LispVal *key));
|
DECLARE_FUNCTION(remhash, (LispVal * table, LispVal *key, LispVal *def));
|
||||||
struct HashtableDataArray {
|
struct HashtableDataArray {
|
||||||
size_t size;
|
size_t size;
|
||||||
struct HashtableEntry *entries;
|
struct HashtableEntry *entries;
|
||||||
@ -531,7 +547,7 @@ void free_hash_table_data_array(void *data);
|
|||||||
// Don't ref their return value
|
// Don't ref their return value
|
||||||
LispVal *puthash(LispVal *table, LispVal *key, LispVal *value);
|
LispVal *puthash(LispVal *table, LispVal *key, LispVal *value);
|
||||||
LispVal *gethash(LispVal *table, LispVal *key, LispVal *def);
|
LispVal *gethash(LispVal *table, LispVal *key, LispVal *def);
|
||||||
LispVal *remhash(LispVal *table, LispVal *key);
|
void remhash(LispVal *table, LispVal *key);
|
||||||
|
|
||||||
// #####################
|
// #####################
|
||||||
// # Numeric Functions #
|
// # Numeric Functions #
|
||||||
|
|||||||
12
src/main.c
12
src/main.c
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
static int exit_status = 0;
|
static int exit_status = 0;
|
||||||
|
|
||||||
STATIC_DEFUN(toplevel_exit_handler, "toplevel-exit-handler",
|
STATIC_DEFUN(toplevel_exit_handler, "toplevel-exit-handler", (LispVal * except),
|
||||||
(LispVal * except)) {
|
"(except)", "Internal function.") {
|
||||||
LispVal *detail = TAIL(HEAD(except));
|
LispVal *detail = TAIL(HEAD(except));
|
||||||
if (NILP(detail) || NILP(HEAD(detail))) {
|
if (NILP(detail) || NILP(HEAD(detail))) {
|
||||||
exit_status = 0;
|
exit_status = 0;
|
||||||
@ -17,7 +17,7 @@ STATIC_DEFUN(toplevel_exit_handler, "toplevel-exit-handler",
|
|||||||
}
|
}
|
||||||
|
|
||||||
STATIC_DEFUN(toplevel_error_handler, "toplevel-error-handler",
|
STATIC_DEFUN(toplevel_error_handler, "toplevel-error-handler",
|
||||||
(LispVal * except)) {
|
(LispVal * except), "(except)", "Internal function.") {
|
||||||
LispVal *type = HEAD(HEAD(except));
|
LispVal *type = HEAD(HEAD(except));
|
||||||
LispVal *detail = TAIL(HEAD(except));
|
LispVal *detail = TAIL(HEAD(except));
|
||||||
LispVal *backtrace = HEAD(TAIL(except));
|
LispVal *backtrace = HEAD(TAIL(except));
|
||||||
@ -56,8 +56,8 @@ int main(int argc, const char **argv) {
|
|||||||
fclose(in);
|
fclose(in);
|
||||||
lisp_init();
|
lisp_init();
|
||||||
REGISTER_SYMBOL(toplevel_read);
|
REGISTER_SYMBOL(toplevel_read);
|
||||||
REGISTER_STATIC_FUNCTION(toplevel_error_handler, "(e)", "");
|
REGISTER_STATIC_FUNCTION(toplevel_error_handler);
|
||||||
REGISTER_STATIC_FUNCTION(toplevel_exit_handler, "(e)", "");
|
REGISTER_STATIC_FUNCTION(toplevel_exit_handler);
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
WITH_PUSH_FRAME(Qtoplevel, Qnil, false, {
|
WITH_PUSH_FRAME(Qtoplevel, Qnil, false, {
|
||||||
the_stack->hidden = false;
|
the_stack->hidden = false;
|
||||||
@ -92,7 +92,7 @@ int main(int argc, const char **argv) {
|
|||||||
&& list_length(tv) == 2) {
|
&& list_length(tv) == 2) {
|
||||||
refcount_unref(Fset_current_package(HEAD(TAIL(tv))));
|
refcount_unref(Fset_current_package(HEAD(TAIL(tv))));
|
||||||
} else {
|
} else {
|
||||||
refcount_unref(Feval(tv)); //
|
refcount_unref(Feval(tv, the_stack->lexenv)); //
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -575,7 +575,8 @@ size_t read_from_buffer(const char *text, size_t length, LispVal *package,
|
|||||||
return state.off;
|
return state.off;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN(read, "read", (LispVal * source, LispVal *package)) {
|
DEFUN(read, "read", (LispVal * source, LispVal *package), "(source package)",
|
||||||
|
"Read a single form from SOURCE.") {
|
||||||
LispString *str = (LispString *) source;
|
LispString *str = (LispString *) source;
|
||||||
CHECK_TYPE(TYPE_STRING, source);
|
CHECK_TYPE(TYPE_STRING, source);
|
||||||
struct ReadState state = {
|
struct ReadState state = {
|
||||||
@ -600,3 +601,7 @@ DEFUN(read, "read", (LispVal * source, LispVal *package)) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void register_reader_functions(void) {
|
||||||
|
REGISTER_FUNCTION(read);
|
||||||
|
}
|
||||||
|
|||||||
@ -13,4 +13,6 @@ size_t read_from_buffer(const char *text, size_t length, LispVal *package,
|
|||||||
|
|
||||||
DECLARE_FUNCTION(read, (LispVal * source, LispVal *package));
|
DECLARE_FUNCTION(read, (LispVal * source, LispVal *package));
|
||||||
|
|
||||||
|
void register_reader_functions(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user