add repl.c
This commit is contained in:
parent
9b37437e53
commit
39fce5dcf6
4
fn.h
4
fn.h
@ -3,6 +3,10 @@
|
|||||||
Object* nextexpr(FILE*);
|
Object* nextexpr(FILE*);
|
||||||
void skipline(FILE*);
|
void skipline(FILE*);
|
||||||
|
|
||||||
|
/* repl.c */
|
||||||
|
void repl(Object *env, FILE*, char *pre);
|
||||||
|
void readlibs(char *argv[], Object *env);
|
||||||
|
|
||||||
/* eval.c */
|
/* eval.c */
|
||||||
Object* eval(Object *env, Object *expr);
|
Object* eval(Object *env, Object *expr);
|
||||||
|
|
||||||
|
|||||||
55
main.c
55
main.c
@ -1,37 +1,8 @@
|
|||||||
#include "dat.h"
|
#include "dat.h"
|
||||||
#include "fn.h"
|
#include "fn.h"
|
||||||
#include <setjmp.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
jmp_buf err;
|
|
||||||
GC *gc;
|
GC *gc;
|
||||||
|
|
||||||
void
|
|
||||||
panic(char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
error(char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
fprintf(stderr, "ERROR => ");
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
longjmp(err, 1);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SExprint(Object *obj)
|
SExprint(Object *obj)
|
||||||
{
|
{
|
||||||
@ -88,33 +59,11 @@ printexpr(Object *obj)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
loop(Object *env, FILE *f)
|
|
||||||
{
|
|
||||||
if(setjmp(err) == 1){
|
|
||||||
if(feof(f))
|
|
||||||
return;
|
|
||||||
skipline(f);
|
|
||||||
}
|
|
||||||
while(1){
|
|
||||||
printf(">> ");
|
|
||||||
Object *res = nextexpr(f);
|
|
||||||
res = eval(env, res);
|
|
||||||
printexpr(res);
|
|
||||||
printgc("status", gc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
gc = newgc(&argc, 400);
|
gc = newgc(&argc, 400);
|
||||||
Object *env = newenv(gc, &Nil, &Nil, &Nil);
|
Object *env = newenv(gc, &Nil, &Nil, &Nil);
|
||||||
for(int i = 1; i < argc; ++i){
|
readlibs(argv + 1, env);
|
||||||
FILE *f = fopen(argv[i], "r");
|
repl(env, stdin, ">> ");
|
||||||
if(f == 0)
|
|
||||||
panic("can't open %s", argv[i]);
|
|
||||||
loop(env, f);
|
|
||||||
}
|
|
||||||
loop(env, stdin);
|
|
||||||
}
|
}
|
||||||
|
|||||||
1
makefile
1
makefile
@ -1,6 +1,7 @@
|
|||||||
NAME=lisp
|
NAME=lisp
|
||||||
OFILES=\
|
OFILES=\
|
||||||
bltin.o\
|
bltin.o\
|
||||||
|
repl.o\
|
||||||
eval.o\
|
eval.o\
|
||||||
main.o\
|
main.o\
|
||||||
gc.o\
|
gc.o\
|
||||||
|
|||||||
63
repl.c
Normal file
63
repl.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#include "dat.h"
|
||||||
|
#include "fn.h"
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
jmp_buf *errptr;
|
||||||
|
|
||||||
|
void
|
||||||
|
panic(char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
error(char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "ERROR => ");
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
longjmp(*errptr, 1);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
repl(Object *env, FILE *f, char *pre)
|
||||||
|
{
|
||||||
|
jmp_buf err;
|
||||||
|
errptr = &err;
|
||||||
|
if(setjmp(err) == 1){
|
||||||
|
if(feof(f))
|
||||||
|
return;
|
||||||
|
skipline(f);
|
||||||
|
}
|
||||||
|
while(1){
|
||||||
|
printf(pre);
|
||||||
|
Object *res = nextexpr(f);
|
||||||
|
res = eval(env, res);
|
||||||
|
printexpr(res);
|
||||||
|
printgc("status", gc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
readlibs(char *argv[], Object *env)
|
||||||
|
{
|
||||||
|
for(;*argv; argv++){
|
||||||
|
FILE *f = fopen(*argv, "r");
|
||||||
|
if(f == 0)
|
||||||
|
panic("can't open %s", *argv);
|
||||||
|
repl(env, f, "");
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user