-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlisp.h
116 lines (98 loc) · 2.05 KB
/
lisp.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#ifndef LISP_H
#define LISP_H
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
typedef int64_t ll;
typedef long double ld;
typedef uint8_t byte;
#define HASHTABLE_P 1
enum val_type {
T_NUMBER,
T_SYMBOL,
T_CHARACTER,
T_BOOL,
T_CONS,
T_VECTOR,
T_HASHTABLE,
T_PROCEDURE,
T_PRIMITIVE,
T_MACRO,
T_INPUT_PORT,
T_OUTPUT_PORT,
T_ENVIRONMENT,
T_EOF,
T_NIL,
T_UNBOUND,
};
typedef struct ptr {
enum val_type type;
union {
// number
ld number;
// symbol, cons, hashtable, procedure, primitive, macro, environment
ll index;
// character
char character;
// bool
bool boolean;
// vector
struct {
ll start, size;
};
// port
FILE *port;
};
} ptr;
ptr make_number(ld number);
ptr intern(const char *s, ll n);
#define INTERN(s) (intern((s), strlen(s)))
ptr make_char(char character);
ptr make_bool(bool boolean);
ptr make_input_port(FILE *port);
ptr make_output_port(FILE *port);
ptr make_primitive(ll index);
ptr make_eof();
ptr make_nil();
ptr make_unbound();
// extern ptr eof;
// extern ptr nil;
// extern ptr unbound;
// extern ptr quote;
// extern ptr vector;
// extern ptr quasiquote;
// extern ptr unquote;
// extern ptr unquote_splice;
#define eof (make_eof())
#define nil (make_nil())
#define unbound (make_unbound())
bool eq(ptr a, ptr b);
typedef struct obj {
bool moved;
union {
ptr p;
ll forward;
};
} obj;
extern obj *memory;
ptr cons_car(ptr p);
ptr cons_cdr(ptr p);
void cons_setcar(ptr p, ptr car);
void cons_setcdr(ptr p, ptr cdr);
ptr hashtable_at(ptr p, ll h);
ptr get_hash(ptr p, ptr k);
void set_hash(ptr p, ptr k, ptr v);
ptr proc_formals(ptr p);
ptr proc_body(ptr p);
ptr proc_env(ptr p);
ptr env_car(ptr p);
ptr env_cdr(ptr p);
ptr vector_ref(ptr p, ll i);
void vector_set(ptr p, ll i, ptr v);
bool vector_stringp(ptr p);
ll list_length(ptr l);
bool list_p(ptr l);
ll next_hash(ll prev, byte cur);
ll hash(ptr p);
#endif