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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
/* Definitions for Lisp objects in Xconq.
Copyright (C) 1989, 1991-1997 Stanley T. Shebs.
Xconq is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version. See the file COPYING. */
#ifndef LISP_H
#define LISP_H
/* Lisp objects in Xconq are pretty basic, since they are used only for
game definition and (usually) not the core computations. */
/* The different types of Lisp objects. */
enum lisptype {
NIL,
CONS,
NUMBER,
STRING,
SYMBOL,
UTYPE,
MTYPE,
TTYPE,
POINTER,
EOFOBJ
};
/* Declaration of a cons cell. */
struct a_cons {
struct a_obj *car;
struct a_obj *cdr;
};
/* A symbol includes its index and a pointer to its binding. */
struct a_symbol {
struct a_symentry *symentry;
struct a_obj *value;
};
/* A pointer is an address with associated name. Interpretation
and usage is up to the context. */
struct a_pointer {
struct a_obj *sym;
char *data;
};
/* The basic Lisp object. This should be small. */
typedef struct a_obj {
enum lisptype type; /* type of the object */
union {
int num; /* numeric value */
char *str; /* string value */
struct a_symbol sym;
struct a_cons cons;
struct a_pointer ptr;
} v; /* the "content" of the object */
} Obj;
/* The symbol table is the way to map names into symbols. */
typedef struct a_symentry {
char *name;
struct a_obj *symbol;
char constantp;
struct a_symentry *next;
} Symentry;
/* A stream is just a union of string pointer and file pointer. */
#define CONTEXTSIZE 129
enum strmtype { stringstrm, filestrm };
typedef struct a_strm {
enum strmtype type;
union {
char *sp;
FILE *fp;
} ptr;
char lastread[CONTEXTSIZE];
int numread;
} Strm;
/* Enum of all the random keywords. */
enum keywords {
#undef DEF_KWD
#define DEF_KWD(name,CODE) CODE,
#include "keyword.def"
LAST_KEYWORD
};
#define match_keyword(ob,key) \
(symbolp(ob) && strcmp(c_string(ob), keyword_name(key)) == 0)
#define for_all_list(lis,rest) \
for (rest = (lis); rest != lispnil; rest = cdr(rest))
#define for_both_lists(lis1,lis2,rest1,rest2) \
for (rest1 = (lis1), rest2 = (lis2); \
rest1 != lispnil && rest2 != lispnil; \
rest1 = cdr(rest1), rest2 = cdr(rest2))
/* All the Lisp interface declarations. */
extern Obj *lispnil;
extern Obj *lispeof;
extern void init_lisp PARAMS ((void));
extern Obj *read_form PARAMS ((FILE *fp, int *p1, int *p2));
extern Obj *read_form_from_string PARAMS ((char *str, int *p1, int *p2, char **endstr));
extern int length PARAMS ((Obj *list));
extern Obj *new_string PARAMS ((char *str));
extern Obj *new_number PARAMS ((int num));
extern Obj *new_utype PARAMS ((int u));
extern Obj *new_mtype PARAMS ((int r));
extern Obj *new_ttype PARAMS ((int t));
extern Obj *new_pointer PARAMS ((Obj *sym, char *ptr));
extern Obj *cons PARAMS ((Obj *x, Obj *y));
extern void type_warning PARAMS ((char *funname, Obj *x, char *typename, Obj *subst));
extern Obj *car PARAMS ((Obj *x));
extern Obj *cdr PARAMS ((Obj *x));
extern Obj *cadr PARAMS ((Obj *x));
extern Obj *cddr PARAMS ((Obj *x));
extern Obj *caddr PARAMS ((Obj *x));
extern Obj *cdddr PARAMS ((Obj *x));
extern void set_cdr PARAMS ((Obj *x, Obj *v));
extern char *c_string PARAMS ((Obj *x));
extern int c_number PARAMS ((Obj *x));
extern Obj *intern_symbol PARAMS ((char *str));
extern Obj *symbol_value PARAMS ((Obj *sym));
extern Obj *setq PARAMS ((Obj *sym, Obj *x));
extern void makunbound PARAMS ((Obj *sym));
extern void flag_as_constant PARAMS ((Obj *sym));
extern int constantp PARAMS ((Obj *sym));
extern int numberp PARAMS ((Obj *x));
extern int stringp PARAMS ((Obj *x));
extern int symbolp PARAMS ((Obj *x));
extern int consp PARAMS ((Obj *x));
extern int utypep PARAMS ((Obj *x));
extern int mtypep PARAMS ((Obj *x));
extern int ttypep PARAMS ((Obj *x));
extern int pointerp PARAMS ((Obj *x));
extern int boundp PARAMS ((Obj *sym));
extern int numberishp PARAMS ((Obj *x));
extern int listp PARAMS ((Obj *x));
extern int equal PARAMS ((Obj *x, Obj *y));
extern int member PARAMS ((Obj *x, Obj *lis));
extern Obj *elt PARAMS ((Obj *lis, int n));
extern Obj *reverse PARAMS ((Obj *lis));
extern Obj *find_at_key PARAMS ((Obj *lis, char *key));
extern Obj *replace_at_key PARAMS ((Obj *lis, char *key, Obj *newval));
extern void fprintlisp PARAMS ((FILE *fp, Obj *obj));
extern void fprint_list PARAMS ((FILE *fp, Obj *obj));
extern void sprintlisp PARAMS ((char *buf, Obj *obj, int maxlen));
extern void sprint_list PARAMS ((char *buf, Obj *obj, int maxlen));
extern void dlisp PARAMS ((Obj *x));
extern void print_form_and_value PARAMS ((FILE *fp, Obj *form));
extern Obj *append_two_lists PARAMS ((Obj *x1, Obj *x2));
extern Obj *append_lists PARAMS ((Obj *lis));
extern Obj *remove_from_list PARAMS ((Obj *elt, Obj *lis));
extern void push_binding PARAMS ((Obj **lis, Obj *key, Obj *val));
extern void push_cdr_binding PARAMS ((Obj **lis, Obj *key, Obj *val));
extern void push_int_binding PARAMS ((Obj **lis, Obj *key, int val));
extern void push_key_binding PARAMS ((Obj **lis, int key, Obj *val));
extern void push_key_cdr_binding PARAMS ((Obj **lis, int key, Obj *val));
extern void push_key_int_binding PARAMS ((Obj **lis, int key, int val));
extern Obj *eval PARAMS ((Obj *x));
extern Obj *eval_symbol PARAMS ((Obj *x));
extern Obj *eval_list PARAMS ((Obj *x));
extern int eval_boolean_expression PARAMS ((Obj *expr, int (*fn)(Obj *), int dflt));
extern int interpolate_in_list PARAMS ((int val, Obj *lis, int *rslt));
extern int interpolate_in_list_ext PARAMS ((int val, Obj *lis,
int mindo, int minval, int minrslt,
int maxdo, int maxval, int maxrslt,
int *rslt));
/* Functions that the Lisp code needs to have defined. */
extern void init_warning PARAMS ((char *str, ...));
extern void low_init_warning PARAMS ((char *str));
extern void init_error PARAMS ((char *str, ...));
extern void low_init_error PARAMS ((char *str));
extern void run_warning PARAMS ((char *str, ...));
extern void low_run_warning PARAMS ((char *str));
extern void run_error PARAMS ((char *str, ...));
extern void low_run_error PARAMS ((char *str));
extern void announce_read_progress PARAMS ((void));
extern int keyword_code PARAMS ((char *str));
extern char *keyword_name PARAMS ((enum keywords k));
extern int lazy_bind PARAMS ((Obj *sym));
extern void init_predefined_symbols PARAMS ((void));
#endif /* LISP_H */
|