67 lines
1.2 KiB
C
67 lines
1.2 KiB
C
#ifndef LISP_H
|
|
#define LISP_H
|
|
|
|
#include "nob.h"
|
|
|
|
typedef enum e_TokenKind {
|
|
TOKEN_KIND_PAR_LEFT,
|
|
TOKEN_KIND_PAR_RIGHT,
|
|
TOKEN_KIND_NUMBER,
|
|
TOKEN_KIND_SYMBOL,
|
|
} TokenKind;
|
|
|
|
typedef struct s_Token {
|
|
TokenKind kind;
|
|
Nob_String_View data;
|
|
} Token;
|
|
|
|
typedef struct s_Tokens {
|
|
Token *items;
|
|
size_t count;
|
|
size_t capacity;
|
|
} Tokens;
|
|
|
|
typedef enum e_NodeKind {
|
|
NODE_KIND_SYMBOL,
|
|
NODE_KIND_LIST,
|
|
NODE_KIND_NUMBER,
|
|
NODE_KIND_FUNCTION,
|
|
} NodeKind;
|
|
|
|
typedef struct s_Node Node;
|
|
typedef struct s_Nodes Nodes;
|
|
|
|
typedef Node *(*lisp_function_ptr)(Nodes *args);
|
|
typedef struct s_LispFunction {
|
|
Nob_String_View name;
|
|
lisp_function_ptr apply;
|
|
} LispFunction;
|
|
|
|
typedef struct s_Node {
|
|
NodeKind kind;
|
|
union {
|
|
Nob_String_View as_symbol;
|
|
Nodes *as_list;
|
|
long long as_number;
|
|
LispFunction as_function;
|
|
};
|
|
} Node;
|
|
|
|
struct s_Nodes {
|
|
Node *items;
|
|
size_t count;
|
|
size_t capacity;
|
|
};
|
|
|
|
const char *token_kind_name(TokenKind kind);
|
|
void node_print(Node node);
|
|
|
|
void tokenize(Nob_String_View content, Tokens *tokens);
|
|
Node *parse(Tokens *tokens);
|
|
Node *eval(Node *node);
|
|
|
|
// builtins
|
|
Node *lisp_function_addition(Nodes *args);
|
|
|
|
#endif // LISP_H
|