lac : 4e6a085ed017a784c8bbead6fe6038d6ea1e9cd5
1: /*
2: lac -- a lisp interpreter library
3: Copyright (C) 2010 Gianluca Guida
4:
5: This program is free software; you can redistribute it and/or modify
6: it under the terms of the GNU General Public License as published by
7: the Free Software Foundation; either version 2 of the License, or
8: (at your option) any later version.
9:
10: This program is distributed in the hope that it will be useful,
11: but WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License along
16: with this program; if not, write to the Free Software Foundation, Inc.,
17: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18: */
19:
20: #ifndef __PRIVATE_H
21: #define __PRIVATE_H
22:
23: #include <stdio.h>
24: #include <stdint.h>
25: #include <string.h>
26: #include <setjmp.h>
27: #include <gc/gc.h>
28: #include "lac.h"
29:
30: #ifdef NO_ASSERT
31: #define assert(...)
32: #else
33: #include <assert.h>
34: #endif
35:
36: #define is_llproc(lr) (lreg_raw_type(lr) == LREG_LLPROC)
37: #define is_symbol(lr) (lreg_raw_type(lr) == LREG_SYMBOL)
38: #define is_cons(lr) (lreg_raw_type(lr) == LREG_CONS)
39: #define is_lambda(lr) (lreg_raw_type(lr) == LREG_LAMBDA)
40: #define is_macro(lr) (lreg_raw_type(lr) == LREG_MACRO)
41:
42: int lacint_extty_equal(lreg_t arg1, lreg_t arg2);
43:
44: #define HT_SIZE 32
45:
46: struct ht_entry {
47: lreg_t key;
48: lreg_t value;
49: struct ht_entry *next;
50: };
51:
52: struct ht_cache {
53: lreg_t key;
54: lreg_t value;
55: };
56:
57: typedef struct ht {
58: struct ht_entry *table[HT_SIZE];
59: } ht_t;
60:
61: struct env {
62: ht_t htable;
63: };
64:
65: /*
66: * Embedded procedures
67: */
68:
69: #define lreg_to_llproc(lr) lreg_to_cfunc(lr)
70: #define llproc_to_lreg(llproc) cfunc_to_lreg(llproc, LREG_LLPROC)
71:
72: static inline lac_function_t lreg_to_cfunc(lreg_t lr)
73: {
74: assert(is_llproc(lr));
75: return (lac_function_t) lreg_raw_ptr(lr);
76: }
77:
78: static inline lreg_t cfunc_to_lreg(lac_function_t llproc, unsigned type)
79: {
80: assert(((uintptr_t) llproc & LREG_TYPE_MASK) == 0);
81: return lreg_raw(llproc, type);
82: }
83:
84: /*
85: * Macro/Lambda procedures
86: */
87:
88: static inline lreg_t get_closure_proc(lreg_t lr)
89: {
90: lreg_t c = lreg_raw(lreg_raw_ptr(lr), LREG_CONS);
91: assert((lreg_raw_type(lr) == LREG_LAMBDA)
92: || (lreg_raw_type(lr) == LREG_MACRO));
93:
94: return car(c);
95: }
96:
97: static inline lenv_t *get_closure_env(lreg_t lr)
98: {
99: lreg_t c = lreg_raw(lreg_raw_ptr(lr), LREG_CONS);
100: assert((lreg_raw_type(lr) == LREG_LAMBDA)
101: || (lreg_raw_type(lr) == LREG_MACRO));
102:
103: return (lenv_t *) lreg_raw_ptr(cdr(c));
104: }
105:
106: static inline lreg_t get_proc_binds(lreg_t lr)
107: {
108: return car(lr);
109: }
110:
111: static inline lreg_t get_proc_body(lreg_t lr)
112: {
113: return cdr(lr);
114: }
115:
116:
117: /*
118: * Private exception management.
119: */
120:
121: #define _throw() do { \
122: struct _lac_xcpt *p = _lac_xcpt; \
123: _lac_xcpt = p->next; \
124: siglongjmp(p->buf, 1); \
125: } while(0)
126:
127:
128: /*
129: * Environment management.
130: */
131:
132: void env_init(lenv_t * env);
133: lreg_t env_lookup(lenv_t * env, lreg_t key);
134: int env_define(lenv_t * env, lreg_t key, lreg_t value);
135: int env_set(lenv_t * env, lreg_t key, lreg_t value);
136: void env_pushnew(lenv_t * env, lenv_t * new);
137:
138:
139: /*
140: * Parser Interface.
141: */
142:
143: struct parse_cb {
144: lreg_t (*fn)(lreg_t, void *);
145: void *opq;
146: lreg_t res;
147: };
148:
149: void *ParseAlloc(void *(*)(size_t));
150: void Parse(void *, int, lreg_t, struct parse_cb *);
151: void ParseFree(void *, void (*)(void*));
152:
153: #endif /* PRIVATE_H */
Generated by git2html.