From 82bd3f163894b91c7af377a91beb7a385f21ba55 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 1 Jan 2012 12:38:05 -0800 Subject: * eval.c (eval_init): New gensym function registered. * lib.c (gensym_counter): New variable. (gensymv): New function. (obj_init): Initialize gensym_counter. * lib.h (gensym_counter, gensymv): Declared. --- ChangeLog | 10 ++++++++++ eval.c | 1 + lib.c | 12 ++++++++++++ lib.h | 3 +++ 4 files changed, 26 insertions(+) diff --git a/ChangeLog b/ChangeLog index bab15280..56554371 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-01-01 Kaz Kylheku + + * eval.c (eval_init): New gensym function registered. + + * lib.c (gensym_counter): New variable. + (gensymv): New function. + (obj_init): Initialize gensym_counter. + + * lib.h (gensym_counter, gensymv): Declared. + 2011-12-30 Kaz Kylheku * match.c (counter_k): New keyword symbol variable. diff --git a/eval.c b/eval.c index e5672f24..163f9135 100644 --- a/eval.c +++ b/eval.c @@ -1331,6 +1331,7 @@ void eval_init(void) reg_var(intern(lit("*keyword-package*"), user_package), keyword_package); reg_var(intern(lit("*system-package*"), user_package), system_package); reg_fun(intern(lit("make-sym"), user_package), func_n1(make_sym)); + reg_fun(intern(lit("gensym"), user_package), func_n0v(gensymv)); reg_fun(intern(lit("make-package"), user_package), func_n1(make_package)); reg_fun(intern(lit("find-package"), user_package), func_n1(find_package)); reg_fun(intern(lit("intern"), user_package), func_n2(intern)); diff --git a/lib.c b/lib.c index a1663217..c5afc004 100644 --- a/lib.c +++ b/lib.c @@ -84,6 +84,8 @@ val null_list; val identity_f, equal_f, eql_f, eq_f, car_f, cdr_f; +val gensym_counter; + val prog_string; static val env_list; @@ -1633,6 +1635,15 @@ val make_sym(val name) return obj; } +val gensymv(val args) +{ + uses_or2; + gensym_counter = plus(gensym_counter, one); + val prefix = or2(car(args), lit("g")); + val name = format(nil, lit("~a~,04a"), prefix, gensym_counter, nao); + return make_sym(name); +} + val make_package(val name) { if (find_package(name)) { @@ -3273,6 +3284,7 @@ static void obj_init(void) identity_f = func_n1(identity); car_f = func_n1(car); cdr_f = func_n1(cdr); + gensym_counter = zero; prog_string = string(progname); } diff --git a/lib.h b/lib.h index 6b3bf0a9..4c8d6e69 100644 --- a/lib.h +++ b/lib.h @@ -298,6 +298,8 @@ extern val null_list; /* (nil) */ extern val identity_f, equal_f, eql_f, eq_f, car_f, cdr_f; +extern val gensym_counter; + extern const wchar_t *progname; extern val prog_string; @@ -443,6 +445,7 @@ val span_str(val str, val set); val compl_span_str(val str, val set); val break_str(val str, val set); val make_sym(val name); +val gensymv(val args); val make_package(val name); val find_package(val name); val intern(val str, val package); -- cgit v1.2.3