LispBM
Loading...
Searching...
No Matches
extensions.h
Go to the documentation of this file.
1
2/*
3 Copyright 2019, 2022, 2024 Joel Svensson svenssonjoel@yahoo.se
4 2022 Benjamin Vedder
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#ifndef EXTENSIONS_H_
21#define EXTENSIONS_H_
22
23#include "heap.h"
24#include "lbm_types.h"
25#include "lbm_constants.h"
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
37
40typedef struct {
42 const char *name;
44
45
47
48#define LBM_EXTENSION(name, argv, argn) \
49 __attribute__((aligned(LBM_STORABLE_ADDRESS_ALIGNMENT))) lbm_value name(lbm_value *(argv), lbm_uint (argn))
50
56bool lbm_extensions_init(lbm_extension_t *extension_storage, lbm_uint extension_storage_size);
74bool lbm_lookup_extension_id(char *sym_str, lbm_uint *ix);
88bool lbm_clr_extension(lbm_uint sym_id);
94bool lbm_add_extension(const char *sym_str, extension_fptr ext);
95
100static inline bool lbm_is_extension(lbm_value exp) {
101 return ((lbm_type_of(exp) == LBM_TYPE_SYMBOL) &&
103}
104
110bool lbm_check_number_all(lbm_value *args, lbm_uint argn);
116bool lbm_check_argn(lbm_uint argn, lbm_uint n);
124
125#define LBM_CHECK_NUMBER_ALL() if (!lbm_check_number_all(args, argn)) {return ENC_SYM_EERROR;}
126#define LBM_CHECK_ARGN(n) if (!lbm_check_argn(argn, n)) {return ENC_SYM_EERROR;}
127#define LBM_CHECK_ARGN_NUMBER(n) if (!lbm_check_argn_number(args, argn, n)) {return ENC_SYM_EERROR;}
128
130
131// Extension writing helpers
132
141extern lbm_value make_list(int num, ...);
142
148extern size_t strlen_max(const char *s, size_t maxlen);
149
150
158extern bool strmatch(const char *str1, const char *str2);
159
169extern bool dec_opt_uint(lbm_value *args, lbm_uint argn, lbm_uint idx,
170 size_t default_val, size_t *out);
171
178extern lbm_value span_to_lbm(const char *data, size_t len);
179
188static inline lbm_value mk_lam(lbm_value args, lbm_value body) {
189 return make_list(3, ENC_SYM_LAMBDA, args, body);
190}
191
200static inline lbm_value mk_call_cc(lbm_value body) {
201 return make_list(2, ENC_SYM_CALL_CC_UNSAFE, body);
202}
203
212static inline lbm_value mk_let(lbm_value bindings, lbm_value body) {
213 return make_list(3, ENC_SYM_LET, bindings, body);
214}
215
225static inline lbm_value mk_if(lbm_value cond, lbm_value tb, lbm_value fb) {
226 return make_list(4, ENC_SYM_IF, cond, tb, fb);
227}
228
236static inline lbm_value mk_inc(lbm_value v) {
237 return make_list(3, ENC_SYM_ADD, v, lbm_enc_i(1));
238}
239
248static inline lbm_value mk_lt(lbm_value a, lbm_value b) {
249 return make_list(3, ENC_SYM_LT, a, b);
250}
251
260static inline lbm_value mk_eq(lbm_value a, lbm_value b) {
261 return make_list(3, ENC_SYM_EQ, a, b);
262}
263
271static inline lbm_value mk_car(lbm_value a) {
272 return make_list(2, ENC_SYM_CAR, a);
273}
274
282static inline lbm_value mk_cdr(lbm_value a) {
283 return make_list(2, ENC_SYM_CDR, a);
284}
285
286#ifdef __cplusplus
287}
288#endif
289#endif
bool lbm_lookup_extension_id(char *sym_str, lbm_uint *ix)
Definition extensions.c:88
bool lbm_check_argn(lbm_uint argn, lbm_uint n)
Definition extensions.c:148
static bool lbm_is_extension(lbm_value exp)
Definition extensions.h:100
static lbm_value mk_call_cc(lbm_value body)
Definition extensions.h:200
static lbm_value mk_if(lbm_value cond, lbm_value tb, lbm_value fb)
Definition extensions.h:225
lbm_uint lbm_get_max_extensions(void)
Definition extensions.c:61
lbm_value make_list(int num,...)
Definition extensions.c:169
bool dec_opt_uint(lbm_value *args, lbm_uint argn, lbm_uint idx, size_t default_val, size_t *out)
Definition extensions.c:207
void lbm_extensions_set_next(lbm_uint i)
Definition extensions.c:35
static lbm_value mk_inc(lbm_value v)
Definition extensions.h:236
size_t strlen_max(const char *s, size_t maxlen)
Definition extensions.c:180
static lbm_value mk_car(lbm_value a)
Definition extensions.h:271
static lbm_value mk_lt(lbm_value a, lbm_value b)
Definition extensions.h:248
extension_fptr lbm_get_extension(lbm_uint sym)
Definition extensions.c:69
lbm_value lbm_extensions_default(lbm_value *args, lbm_uint argn)
Definition extensions.c:39
static lbm_value mk_lam(lbm_value args, lbm_value body)
Definition extensions.h:188
lbm_value(* extension_fptr)(lbm_value *, lbm_uint)
Definition extensions.h:36
bool strmatch(const char *str1, const char *str2)
Definition extensions.c:188
bool lbm_check_number_all(lbm_value *args, lbm_uint argn)
Definition extensions.c:140
bool lbm_check_argn_number(lbm_value *args, lbm_uint argn, lbm_uint n)
Definition extensions.c:157
bool lbm_extensions_init(lbm_extension_t *extension_storage, lbm_uint extension_storage_size)
Definition extensions.c:45
lbm_extension_t * extension_table
Definition extensions.c:33
bool lbm_add_extension(const char *sym_str, extension_fptr ext)
Definition extensions.c:102
static lbm_value mk_eq(lbm_value a, lbm_value b)
Definition extensions.h:260
static lbm_value mk_let(lbm_value bindings, lbm_value body)
Definition extensions.h:212
static lbm_value mk_cdr(lbm_value a)
Definition extensions.h:282
lbm_uint lbm_get_num_extensions(void)
Definition extensions.c:65
lbm_value span_to_lbm(const char *data, size_t len)
Definition extensions.c:219
bool lbm_clr_extension(lbm_uint sym_id)
Definition extensions.c:78
static lbm_uint lbm_dec_sym(lbm_value x)
Definition heap.h:800
static lbm_value lbm_enc_i(lbm_int x)
Definition heap.h:718
static lbm_type lbm_type_of(lbm_value x)
Definition heap.h:676
#define ENC_SYM_LT
Definition lbm_defines.h:544
#define EXTENSION_SYMBOLS_START
Definition lbm_defines.h:396
#define ENC_SYM_CALL_CC_UNSAFE
Definition lbm_defines.h:531
#define ENC_SYM_LET
Definition lbm_defines.h:489
#define ENC_SYM_IF
Definition lbm_defines.h:488
#define ENC_SYM_CAR
Definition lbm_defines.h:553
#define ENC_SYM_LAMBDA
Definition lbm_defines.h:487
#define ENC_SYM_ADD
Definition lbm_defines.h:535
#define ENC_SYM_CDR
Definition lbm_defines.h:554
#define LBM_TYPE_SYMBOL
Definition lbm_defines.h:82
#define ENC_SYM_EQ
Definition lbm_defines.h:540
uint32_t lbm_uint
Definition lbm_types.h:48
uint32_t lbm_value
Definition lbm_types.h:44
Definition extensions.h:40
extension_fptr fptr
Definition extensions.h:41
const char * name
Definition extensions.h:42