diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-05-09 18:29:52 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-05-09 18:29:52 +0100 |
commit | ba5c0a4579ece5d53c009a14d00e683e70b982f4 (patch) | |
tree | ad7e6788b8ce634172f9a5cdee0a1a9ac08c7788 /lisp.h | |
parent | 576bf0f3085022e9117d78e3b4e19971c82a61d6 (diff) | |
download | oats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.tar.gz oats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.tar.bz2 oats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.zip |
Initial implementation
Diffstat (limited to 'lisp.h')
-rw-r--r-- | lisp.h | 59 |
1 files changed, 59 insertions, 0 deletions
@@ -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 |