/*
Copyright © 2023 Simon Forman
This file is part of Thun
Thun 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.
Thun 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 Thun. If not see .
*/
#include
enum JoyTypeType {
joySymbol,
joyTrue,
joyFalse,
joyInt,
joyList
};
typedef struct list_node* JoyList;
typedef JoyList* JoyListPtr;
typedef struct {
enum JoyTypeType kind;
union {
char *symbol;
mpz_t i;
JoyList el;
} value;
} JoyType;
typedef JoyType* JoyTypePtr;
struct list_node {
JoyTypePtr head;
JoyList tail;
};
#define EMPTY_LIST (JoyList)NULL
#define newJoyList GC_malloc(sizeof(struct list_node))
#define newJoyType GC_malloc(sizeof(JoyType))
typedef void JoyFunc(JoyListPtr, JoyListPtr);
JoyList text_to_expression(char *text);
void push_quote_onto_expression(JoyList el, JoyListPtr expression);
void init_defs(void);
JoyFunc add;
JoyFunc branch;
JoyFunc clear;
JoyFunc cmp_joyfunc;
JoyFunc cons;
JoyFunc concat;
JoyFunc dip;
JoyFunc dup;
JoyFunc first;
JoyFunc i_joyfunc;
JoyFunc inscribe;
JoyFunc loop;
JoyFunc lshift;
JoyFunc pop;
JoyFunc rest;
JoyFunc rshift;
JoyFunc stack;
JoyFunc swaack;
JoyFunc swap;
JoyFunc mul;
JoyFunc sub;
JoyFunc fdiv_q;
JoyFunc fdiv_r;
JoyFunc truthy;
JoyFunc fn;
struct dict_entry {
char *name;
JoyFunc *func;
};
const struct dict_entry *
in_word_set (register const char *str, register size_t len);