aboutsummaryrefslogtreecommitdiff
path: root/lisp.h
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2025-05-09 18:29:52 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2025-05-09 18:29:52 +0100
commitba5c0a4579ece5d53c009a14d00e683e70b982f4 (patch)
treead7e6788b8ce634172f9a5cdee0a1a9ac08c7788 /lisp.h
parent576bf0f3085022e9117d78e3b4e19971c82a61d6 (diff)
downloadoats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.tar.gz
oats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.tar.bz2
oats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.zip
Initial implementation
Diffstat (limited to 'lisp.h')
-rw-r--r--lisp.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/lisp.h b/lisp.h
new file mode 100644
index 0000000..b714e7d
--- /dev/null
+++ b/lisp.h
@@ -0,0 +1,59 @@
+/* Copyright (C) 2025 Aryadev Chavali
+
+ * 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 Version 2 for
+ * details.
+
+ * You may distribute and modify this code under the terms of the GNU General
+ * Public License Version 2, which you should have received a copy of along with
+ * this program. If not, please go to <https://www.gnu.org/licenses/>.
+
+ * Created: 2025-04-06
+ * Description: Object model where we deal with contexts
+ */
+
+#ifndef LISP_H
+#define LISP_H
+
+#include "./base.h"
+#include "./memory.h"
+#include "./sv.h"
+#include "./tag.h"
+#include "./vec.h"
+
+typedef struct Cons
+{
+ lisp_t *car, *cdr;
+} cons_t;
+
+typedef struct Cell
+{
+ u64 size;
+ u8 data[];
+} cell_t;
+
+#define NIL 0
+lisp_t *make_int(i64 integer);
+lisp_t *make_sym(context_t *ctx, char *data, u64 size);
+lisp_t *make_cons(context_t *ctx, lisp_t *car, lisp_t *cdr);
+lisp_t *make_list(context_t *ctx, lisp_t **lisps, u64 size);
+lisp_t *make_vec(context_t *ctx, u32 size);
+lisp_t *make_str(context_t *ctx, char *data, u64 size);
+
+i64 as_int(lisp_t *obj);
+u32 as_char(lisp_t *obj);
+cell_t *as_sym(lisp_t *obj);
+void as_ssym(lisp_t *obj, sv_t *sv);
+bool as_bool(lisp_t *obj);
+f64 as_float(lisp_t *obj);
+cons_t *as_cons(lisp_t *obj);
+vec_t *as_vec(lisp_t *obj);
+vec_t *as_str(lisp_t *obj);
+
+sv_t serialise(context_t *ctx, lisp_t *lisp);
+
+#define CAR(PTR) (as_cons(PTR)->car)
+#define CDR(PTR) (as_cons(PTR)->cdr)
+
+#endif