diff options
Diffstat (limited to 'ast.h')
-rw-r--r-- | ast.h | 41 |
1 files changed, 33 insertions, 8 deletions
@@ -2,24 +2,40 @@ #include <stdbool.h> +typedef struct InterState InterState; +typedef struct InterRet InterRet; +typedef struct AST AST; + +typedef InterRet (*lambdafunc_t)(InterState *is,int nargs,AST **args); + typedef enum ASTtype{ AST_LIST, + AST_LAMBDA, + AST_LAMBDAARG, AST_WORD, AST_NUMBER, AST_STRING, AST_SYMBOL, + AST_QUOTED, } ASTtype; -typedef struct AST AST; - typedef struct ASTlist{ int len; AST **nodes; - bool quoted; } ASTlist; +typedef struct ASTlambda{ + //exactly one is non-NULL + lambdafunc_t cfunc; + AST *body; +} ASTlambda; + +typedef struct ASTlambdaArg{ + int idx; +} ASTlambdaArg; + typedef struct ASTword{ char *word; } ASTword; @@ -42,14 +58,21 @@ typedef struct ASTsymbol{ //You should probably use ast_symbol(), in which case you don't have to do anything. } ASTsymbol; +typedef struct ASTquoted{ + AST *ast; +} ASTquoted; + struct AST{ ASTtype type; union { - ASTlist l; - ASTword w; - ASTnumber n; - ASTstring S; - ASTsymbol s; + ASTlist li; + ASTlambda la; + ASTlambdaArg ar; + ASTword wo; + ASTnumber nu; + ASTstring st; + ASTsymbol sy; + ASTquoted qu; }; }; @@ -61,7 +84,9 @@ AST* ast_copy(const AST *ast); char* ast_stringify(const AST *ast); AST* ast_list(int len,AST **nodes); //these convenience functions DO NOT copy their arguments +AST* ast_lambda(lambdafunc_t cfunc,AST *body); AST* ast_word(char *word); AST* ast_number(double num); AST* ast_string(char *str,int len); AST* ast_symbol(char *name); +AST* ast_quoted(AST *ast); |