summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-01-01 12:38:05 -0800
committerKaz Kylheku <kaz@kylheku.com>2012-01-01 12:38:05 -0800
commit82bd3f163894b91c7af377a91beb7a385f21ba55 (patch)
treecbbd7adac4937c5c693888515fb0e0c8bdf39c49
parentac08d22c2b916fbd88c938569e0cd6af488b7a67 (diff)
downloadtxr-82bd3f163894b91c7af377a91beb7a385f21ba55.tar.gz
txr-82bd3f163894b91c7af377a91beb7a385f21ba55.tar.bz2
txr-82bd3f163894b91c7af377a91beb7a385f21ba55.zip
* 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.
-rw-r--r--ChangeLog10
-rw-r--r--eval.c1
-rw-r--r--lib.c12
-rw-r--r--lib.h3
4 files changed, 26 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index bab15280..56554371 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2012-01-01 Kaz Kylheku <kaz@kylheku.com>
+
+ * 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 <kaz@kylheku.com>
* 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);