summaryrefslogtreecommitdiff
path: root/functions.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-08-04 15:32:37 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-08-04 15:32:37 +0200
commit820c78beaccf784f710bdd91298401a745d93f2e (patch)
tree30a9e7a7cc6cf7ccd4aa953edc72b2e2b825b362 /functions.m
parenteaf8e27a9860e404390da055510d1f8e4de33f1f (diff)
Add MLKPrintToString along with a couple of fixnum handling functions.
Diffstat (limited to 'functions.m')
-rw-r--r--functions.m66
1 files changed, 66 insertions, 0 deletions
diff --git a/functions.m b/functions.m
new file mode 100644
index 0000000..136c2da
--- /dev/null
+++ b/functions.m
@@ -0,0 +1,66 @@
+/* -*- mode: objc; coding: utf-8 -*- */
+/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime.
+ * Copyright (C) 2008 Matthias Andreas Benkard.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "functions.h"
+#import "MLKInteger.h"
+
+NSString *MLKPrintToString (id object)
+{
+ if (object == nil)
+ return @"()";
+ else if (MLKInstanceP (object))
+ return [object descriptionForLisp];
+ else if (MLKFixnumP (object))
+ return MLKPrintToString ([MLKInteger
+ integerWithInt:(MLKIntWithFixnum (object))]);
+ else
+ {
+ NSLog (@"MLKPrintToString: Encountered a really weird object at address %p",
+ object);
+ return @"<??\?>";
+ }
+}
+
+intptr_t MLKIntWithFixnum (id fixnum)
+{
+ return ((intptr_t)fixnum >> 1);
+}
+
+id MLKFixnumWithInt (intptr_t value)
+{
+ return (id)((value << 1) | 1);
+}
+
+id MLKIntegerWithInt (intptr_t value)
+{
+ intptr_t maybeFixnum = ((intptr_t)value << 1) | 1;
+ if (value == (maybeFixnum >> 1))
+ return (id)maybeFixnum;
+ else
+ return [MLKInteger integerWithInt:value];
+}
+
+BOOL MLKFixnumP (id thing)
+{
+ return ((intptr_t)thing & 1);
+}
+
+BOOL MLKInstanceP (id thing)
+{
+ return !((intptr_t)thing & 1);
+}