summaryrefslogtreecommitdiffstats
path: root/lisplib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lisplib.c')
-rw-r--r--lisplib.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/lisplib.c b/lisplib.c
new file mode 100644
index 00000000..d6b7876a
--- /dev/null
+++ b/lisplib.c
@@ -0,0 +1,83 @@
+/* Copyright 2015
+ * Kaz Kylheku <kaz@kylheku.com>
+ * Vancouver, Canada
+ * All rights reserved.
+ *
+ * Redistribution of this software in source and binary forms, with or without
+ * modification, is permitted provided that the following two conditions are met.
+ *
+ * Use of this software in any manner constitutes agreement with the disclaimer
+ * which follows the two conditions.
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DAMAGES, HOWEVER CAUSED,
+ * AND UNDER ANY THEORY OF LIABILITY, ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <wchar.h>
+#include <dirent.h>
+#include <stdarg.h>
+#include "config.h"
+#include "lib.h"
+#include "eval.h"
+#include "parser.h"
+#include "stream.h"
+#include "hash.h"
+#include "gc.h"
+#include "place.h"
+#include "lisplib.h"
+
+static val dl_table;
+
+static void set_place_dlt_entries(val dlt, val fun)
+{
+ int i;
+ val dl_sym[] = {
+ lit("*place-clobber-expander*"), lit("*place-update-expander*"),
+ lit("*place-delete-expander*"),
+ lit("get-update-expander"), lit("get-clobber-expander"),
+ lit("get-delete-expander"),
+ lit("rlet"), lit("with-gensyms"),
+ lit("call-update-expander"), lit("call-clobber-expander"),
+ lit("call-delete-expander)"),
+ lit("with-update-expander"), lit("with-clobber-expander"),
+ lit("with-delete-expander"),
+ lit("set"), lit("zap"), lit("flip"), lit("inc"), lit("dec"),
+ lit("push"), lit("pop"), lit("swap"), lit("shift"), lit("rotate"),
+ lit("del"),
+ nil
+ };
+
+ for (i = 0; dl_sym[i]; i++)
+ sethash(dlt, intern(dl_sym[i], user_package), fun);
+}
+
+static val place_instantiate(val dlt)
+{
+ set_place_dlt_entries(dlt, nil);
+ return eval_intrinsic(lisp_parse(static_str(place_code), std_error, nil), nil);
+}
+
+void lisplib_init(void)
+{
+ prot1(&dl_table);
+ dl_table = make_hash(nil, nil, nil);
+ set_place_dlt_entries(dl_table, func_f0(dl_table, place_instantiate));
+}
+
+val lisplib_try_load(val sym)
+{
+ val fun = gethash(dl_table, sym);
+ return if3(fun, (funcall(fun), t), nil);
+}