2013-10-09 03:58:35 -04:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2013-10-10 03:15:41 -04:00
|
|
|
#include "picrin.h"
|
|
|
|
|
2013-10-17 04:08:33 -04:00
|
|
|
#if PIC_ENABLE_READLINE
|
2013-10-17 04:57:12 -04:00
|
|
|
# include <string.h>
|
|
|
|
# include <stdlib.h>
|
2013-10-17 04:08:33 -04:00
|
|
|
# include <readline/readline.h>
|
|
|
|
# include <readline/history.h>
|
|
|
|
#endif
|
|
|
|
|
2013-10-10 04:48:37 -04:00
|
|
|
void
|
|
|
|
test_object_creation(pic_state *pic)
|
|
|
|
{
|
|
|
|
pic_value v;
|
|
|
|
|
|
|
|
{
|
|
|
|
v = pic_intern_cstr(pic, "symbol");
|
|
|
|
pic_debug(pic, v);
|
|
|
|
puts(" [should be `symbol`]");
|
|
|
|
}
|
|
|
|
{
|
|
|
|
v = pic_nil_value();
|
|
|
|
pic_debug(pic, v);
|
|
|
|
puts(" [should be `()`]");
|
|
|
|
}
|
|
|
|
{
|
|
|
|
v = pic_cons(pic, pic_intern_cstr(pic, "foo"), pic_intern_cstr(pic, "bar"));
|
|
|
|
pic_debug(pic, v);
|
|
|
|
puts(" [should be `(foo . bar)`]");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-09 04:14:48 -04:00
|
|
|
#define LINE_MAX_LENGTH 256
|
|
|
|
|
2013-10-09 03:58:35 -04:00
|
|
|
int
|
|
|
|
main()
|
|
|
|
{
|
2013-10-10 03:15:41 -04:00
|
|
|
pic_state *pic;
|
2013-10-17 04:08:33 -04:00
|
|
|
char line[LINE_MAX_LENGTH], last_char, *read_line;
|
2013-10-09 04:10:32 -04:00
|
|
|
int char_index;
|
2013-10-11 02:20:53 -04:00
|
|
|
pic_value v;
|
2013-10-11 23:55:05 -04:00
|
|
|
struct pic_proc *proc;
|
2013-10-14 05:29:30 -04:00
|
|
|
int ai;
|
2013-10-09 04:10:32 -04:00
|
|
|
|
2013-10-10 03:15:41 -04:00
|
|
|
pic = pic_open();
|
|
|
|
|
2013-10-14 20:14:34 -04:00
|
|
|
#if OBJECT_CREATION_DEBUG
|
|
|
|
test_object_creation(pic);
|
|
|
|
#endif
|
2013-10-10 04:48:37 -04:00
|
|
|
|
2013-10-14 05:29:30 -04:00
|
|
|
ai = pic_gc_arena_preserve(pic);
|
|
|
|
|
2013-10-09 04:10:32 -04:00
|
|
|
while (1) {
|
2013-10-17 04:08:33 -04:00
|
|
|
|
|
|
|
#if PIC_ENABLE_READLINE
|
|
|
|
read_line = readline("> ");
|
|
|
|
if (read_line == NULL) {
|
|
|
|
line[0] = '\0';
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
strncpy(line, read_line, LINE_MAX_LENGTH - 1);
|
|
|
|
add_history(read_line);
|
|
|
|
free(read_line);
|
|
|
|
}
|
|
|
|
#else
|
2013-10-09 04:10:32 -04:00
|
|
|
printf("> ");
|
|
|
|
|
|
|
|
char_index = 0;
|
|
|
|
while ((last_char = getchar()) != '\n') {
|
|
|
|
if (last_char == EOF)
|
|
|
|
goto eof;
|
2013-10-09 04:14:48 -04:00
|
|
|
if (char_index == LINE_MAX_LENGTH)
|
|
|
|
goto overflow;
|
2013-10-09 04:10:32 -04:00
|
|
|
line[char_index++] = last_char;
|
|
|
|
}
|
|
|
|
line[char_index] = '\0';
|
2013-10-17 04:08:33 -04:00
|
|
|
#endif
|
2013-10-09 04:10:32 -04:00
|
|
|
|
2013-10-12 00:06:02 -04:00
|
|
|
/* read */
|
2013-10-11 02:20:53 -04:00
|
|
|
v = pic_parse(pic, line);
|
2013-10-09 04:10:32 -04:00
|
|
|
|
2013-10-14 20:08:10 -04:00
|
|
|
#if DEBUG
|
|
|
|
printf("[read: ");
|
|
|
|
pic_debug(pic, v);
|
|
|
|
printf("]\n");
|
|
|
|
#endif
|
|
|
|
|
2013-10-17 04:57:12 -04:00
|
|
|
if (pic_undef_p(v)) {
|
|
|
|
pic_gc_arena_restore(pic, ai);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2013-10-12 00:06:02 -04:00
|
|
|
/* eval */
|
2013-10-11 23:55:05 -04:00
|
|
|
proc = pic_codegen(pic, v, pic->global_env);
|
|
|
|
v = pic_run(pic, proc, pic_nil_value());
|
2013-10-12 00:06:02 -04:00
|
|
|
|
|
|
|
/* print */
|
2013-10-15 06:12:33 -04:00
|
|
|
printf("=> ");
|
2013-10-11 23:55:05 -04:00
|
|
|
pic_debug(pic, v);
|
2013-10-09 04:10:32 -04:00
|
|
|
printf("\n");
|
2013-10-14 05:29:30 -04:00
|
|
|
|
|
|
|
pic_gc_arena_restore(pic, ai);
|
2013-10-09 04:10:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
eof:
|
|
|
|
puts("");
|
2013-10-09 04:14:48 -04:00
|
|
|
goto exit;
|
|
|
|
|
|
|
|
overflow:
|
|
|
|
puts("** [fatal] line input overflow");
|
|
|
|
goto exit;
|
2013-10-09 04:10:32 -04:00
|
|
|
|
2013-10-09 04:14:48 -04:00
|
|
|
exit:
|
2013-10-10 03:15:41 -04:00
|
|
|
pic_close(pic);
|
|
|
|
|
2013-10-09 03:58:35 -04:00
|
|
|
return 0;
|
|
|
|
}
|