mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-21 14:49:18 +02:00
switching to SRFI-22 semantics.
-s is no longer needed, only the first non-option argument is loaded (though you can use -- if the script name begins with a -). main is then called automatically if defined. -u was changed to -m.
This commit is contained in:
parent
2810fb8b1b
commit
007c3f07fe
5 changed files with 63 additions and 53 deletions
20
Makefile
20
Makefile
|
@ -81,10 +81,10 @@ endif
|
||||||
all: chibi-scheme$(EXE) libs
|
all: chibi-scheme$(EXE) libs
|
||||||
|
|
||||||
COMPILED_LIBS := lib/srfi/27/rand$(SO) lib/srfi/33/bit$(SO) \
|
COMPILED_LIBS := lib/srfi/27/rand$(SO) lib/srfi/33/bit$(SO) \
|
||||||
lib/srfi/69/hash$(SO) lib/srfi/98/env$(SO) lib/chibi/ast$(SO) \
|
lib/srfi/69/hash$(SO) lib/srfi/98/env$(SO) \
|
||||||
lib/chibi/net$(SO) lib/chibi/filesystem$(SO) lib/chibi/process$(SO) \
|
lib/chibi/ast$(SO) lib/chibi/net$(SO) lib/chibi/filesystem$(SO) \
|
||||||
lib/chibi/time$(SO) lib/chibi/system$(SO) lib/chibi/heap-stats$(SO) \
|
lib/chibi/process$(SO) lib/chibi/time$(SO) lib/chibi/system$(SO) \
|
||||||
lib/chibi/disasm$(SO)
|
lib/chibi/heap-stats$(SO) lib/chibi/disasm$(SO)
|
||||||
|
|
||||||
libs: $(COMPILED_LIBS)
|
libs: $(COMPILED_LIBS)
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ chibi-scheme-static$(EXE): main.o eval.o sexp.o
|
||||||
$(CC) $(XCFLAGS) $(STATICFLAGS) -o $@ $^ $(XLDFLAGS)
|
$(CC) $(XCFLAGS) $(STATICFLAGS) -o $@ $^ $(XLDFLAGS)
|
||||||
|
|
||||||
%.c: %.stub $(GENSTUBS)
|
%.c: %.stub $(GENSTUBS)
|
||||||
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) $(GENSTUBS) $<
|
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) PATH=.:$(PATH) $(GENSTUBS) $<
|
||||||
|
|
||||||
lib/%$(SO): lib/%.c $(INCLUDES)
|
lib/%$(SO): lib/%.c $(INCLUDES)
|
||||||
-$(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< -L. -lchibi-scheme
|
-$(CC) $(CLIBFLAGS) $(XCPPFLAGS) $(XCFLAGS) -o $@ $< -L. -lchibi-scheme
|
||||||
|
@ -141,19 +141,19 @@ test-basic: chibi-scheme$(EXE)
|
||||||
test-build:
|
test-build:
|
||||||
./tests/build/build-tests.sh
|
./tests/build/build-tests.sh
|
||||||
|
|
||||||
test-numbers: all
|
test-numbers: chibi-scheme$(EXE)
|
||||||
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/numeric-tests.scm
|
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/numeric-tests.scm
|
||||||
|
|
||||||
test-hash: all
|
test-hash: chibi-scheme$(EXE)
|
||||||
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/hash-tests.scm
|
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/hash-tests.scm
|
||||||
|
|
||||||
test-match: all
|
test-match: chibi-scheme$(EXE)
|
||||||
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/match-tests.scm
|
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/match-tests.scm
|
||||||
|
|
||||||
test-loop: all
|
test-loop: chibi-scheme$(EXE)
|
||||||
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/loop-tests.scm
|
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/loop-tests.scm
|
||||||
|
|
||||||
test: all
|
test: chibi-scheme$(EXE)
|
||||||
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/r5rs-tests.scm
|
LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ./chibi-scheme$(EXE) tests/r5rs-tests.scm
|
||||||
|
|
||||||
install: chibi-scheme$(EXE)
|
install: chibi-scheme$(EXE)
|
||||||
|
|
6
README
6
README
|
@ -72,10 +72,10 @@ The essential functions to remember are:
|
||||||
A minimal module system is provided by default. Currently you can
|
A minimal module system is provided by default. Currently you can
|
||||||
load the following SRFIs with (import (srfi N)):
|
load the following SRFIs with (import (srfi N)):
|
||||||
|
|
||||||
0, 1, 2, 6, 8, 9, 11, 16, 26, 27, 33, 46, 62, 69, 98
|
0, 1, 2, 6, 8, 9, 11, 16, 22, 23, 26, 27, 33, 46, 62, 69, 98
|
||||||
|
|
||||||
although 0, 46 and 62 are built into the default environment so
|
although 0, 22, 23, 46 and 62 are built into the default environment
|
||||||
there's no need to import them.
|
so there's no need to import them.
|
||||||
|
|
||||||
LOAD is extended to accept an optional environment argument, like
|
LOAD is extended to accept an optional environment argument, like
|
||||||
EVAL. You can also LOAD shared libraries in addition to Scheme source
|
EVAL. You can also LOAD shared libraries in addition to Scheme source
|
||||||
|
|
84
main.c
84
main.c
|
@ -13,7 +13,7 @@
|
||||||
#ifdef PLAN9
|
#ifdef PLAN9
|
||||||
#define exit_failure() exits("ERROR")
|
#define exit_failure() exits("ERROR")
|
||||||
#else
|
#else
|
||||||
#define exit_failure() exit(1)
|
#define exit_failure() exit(70)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void repl (sexp ctx) {
|
static void repl (sexp ctx) {
|
||||||
|
@ -66,21 +66,23 @@ static sexp check_exception (sexp ctx, sexp res) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define sexp_load_init() if (! init_loaded++) do { \
|
#define init_context() if (! ctx) do { \
|
||||||
ctx = sexp_make_eval_context(NULL, NULL, NULL, heap_size); \
|
ctx = sexp_make_eval_context(NULL, NULL, NULL, heap_size); \
|
||||||
env = sexp_context_env(ctx); \
|
env = sexp_context_env(ctx); \
|
||||||
|
sexp_gc_preserve2(ctx, tmp, args); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define load_init() if (! init_loaded++) do { \
|
||||||
|
init_context(); \
|
||||||
check_exception(ctx, sexp_load_standard_env(ctx, env, SEXP_FIVE)); \
|
check_exception(ctx, sexp_load_standard_env(ctx, env, SEXP_FIVE)); \
|
||||||
sexp_gc_preserve2(ctx, str, args); \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
void run_main (int argc, char **argv) {
|
void run_main (int argc, char **argv) {
|
||||||
char *arg, *impmod, *p;
|
char *arg, *impmod, *p;
|
||||||
sexp env, out=NULL, res=SEXP_VOID, ctx=NULL;
|
sexp env, out=SEXP_FALSE, res=SEXP_VOID, ctx=NULL;
|
||||||
sexp_sint_t i, len, quit=0, print=0, init_loaded=0;
|
sexp_sint_t i, j, len, quit=0, print=0, init_loaded=0;
|
||||||
sexp_uint_t heap_size=0;
|
sexp_uint_t heap_size=0;
|
||||||
sexp_gc_var2(str, args);
|
sexp_gc_var2(tmp, args);
|
||||||
|
|
||||||
out = SEXP_FALSE;
|
|
||||||
args = SEXP_NULL;
|
args = SEXP_NULL;
|
||||||
|
|
||||||
/* parse options */
|
/* parse options */
|
||||||
|
@ -88,9 +90,9 @@ void run_main (int argc, char **argv) {
|
||||||
switch (argv[i][1]) {
|
switch (argv[i][1]) {
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'p':
|
case 'p':
|
||||||
|
load_init();
|
||||||
print = (argv[i][1] == 'p');
|
print = (argv[i][1] == 'p');
|
||||||
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
||||||
sexp_load_init();
|
|
||||||
res = check_exception(ctx, sexp_read_from_string(ctx, arg));
|
res = check_exception(ctx, sexp_read_from_string(ctx, arg));
|
||||||
res = check_exception(ctx, sexp_eval(ctx, res, env));
|
res = check_exception(ctx, sexp_eval(ctx, res, env));
|
||||||
if (print) {
|
if (print) {
|
||||||
|
@ -103,13 +105,13 @@ void run_main (int argc, char **argv) {
|
||||||
i++;
|
i++;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
|
load_init();
|
||||||
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
||||||
sexp_load_init();
|
|
||||||
check_exception(ctx, sexp_load_module_file(ctx, argv[++i], env));
|
check_exception(ctx, sexp_load_module_file(ctx, argv[++i], env));
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'm':
|
||||||
|
load_init();
|
||||||
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
||||||
sexp_load_init();
|
|
||||||
len = strlen(arg)+strlen(sexp_import_prefix)+strlen(sexp_import_suffix);
|
len = strlen(arg)+strlen(sexp_import_prefix)+strlen(sexp_import_suffix);
|
||||||
impmod = (char*) malloc(len+1);
|
impmod = (char*) malloc(len+1);
|
||||||
strcpy(impmod, sexp_import_prefix);
|
strcpy(impmod, sexp_import_prefix);
|
||||||
|
@ -122,52 +124,63 @@ void run_main (int argc, char **argv) {
|
||||||
free(impmod);
|
free(impmod);
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
if (! ctx) {
|
init_context();
|
||||||
ctx = sexp_make_eval_context(NULL, NULL, NULL, heap_size);
|
if (! init_loaded++) sexp_load_standard_parameters(ctx, env);
|
||||||
env = sexp_context_env(ctx);
|
|
||||||
sexp_gc_preserve2(ctx, str, args);
|
|
||||||
}
|
|
||||||
if (! init_loaded++)
|
|
||||||
sexp_load_standard_parameters(ctx, env);
|
|
||||||
break;
|
break;
|
||||||
case 'A':
|
case 'A':
|
||||||
|
init_context();
|
||||||
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
||||||
sexp_add_module_directory(ctx, str=sexp_c_string(ctx,arg,-1), SEXP_TRUE);
|
sexp_add_module_directory(ctx, tmp=sexp_c_string(ctx,arg,-1), SEXP_TRUE);
|
||||||
break;
|
break;
|
||||||
case 'I':
|
case 'I':
|
||||||
|
init_context();
|
||||||
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
||||||
sexp_add_module_directory(ctx, str=sexp_c_string(ctx,arg,-1), SEXP_FALSE);
|
sexp_add_module_directory(ctx, tmp=sexp_c_string(ctx,arg,-1), SEXP_FALSE);
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
for (argc=argc-1; argc>i+1; argc--)
|
|
||||||
args = sexp_cons(ctx, str=sexp_c_string(ctx,argv[argc],-1), args);
|
|
||||||
argc++;
|
|
||||||
break;
|
break;
|
||||||
|
case '-':
|
||||||
|
i++;
|
||||||
|
goto done_options;
|
||||||
case 'h':
|
case 'h':
|
||||||
heap_size = atol(argv[++i]);
|
arg = ((argv[i][2] == '\0') ? argv[++i] : argv[i]+2);
|
||||||
len = strlen(argv[i]);
|
heap_size = atol(arg);
|
||||||
if (heap_size && isalpha(argv[i][len-1])) {
|
len = strlen(arg);
|
||||||
switch (tolower(argv[i][len-1])) {
|
if (heap_size && isalpha(arg[len-1])) {
|
||||||
|
switch (tolower(arg[len-1])) {
|
||||||
case 'k': heap_size *= 1024; break;
|
case 'k': heap_size *= 1024; break;
|
||||||
case 'm': heap_size *= (1024*1024); break;
|
case 'm': heap_size *= (1024*1024); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'V':
|
||||||
|
printf("chibi-scheme 0.3\n");
|
||||||
|
exit(0);
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "unknown option: %s\n", argv[i]);
|
fprintf(stderr, "unknown option: %s\n", argv[i]);
|
||||||
exit_failure();
|
exit_failure();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done_options:
|
||||||
if (! quit) {
|
if (! quit) {
|
||||||
sexp_load_init();
|
load_init();
|
||||||
|
if (i < argc)
|
||||||
|
for (j=argc-1; j>i; j--)
|
||||||
|
args = sexp_cons(ctx, tmp=sexp_c_string(ctx,argv[j],-1), args);
|
||||||
|
else
|
||||||
|
args = sexp_cons(ctx, tmp=sexp_c_string(ctx,argv[0],-1), args);
|
||||||
sexp_env_define(ctx, env, sexp_intern(ctx, sexp_argv_symbol), args);
|
sexp_env_define(ctx, env, sexp_intern(ctx, sexp_argv_symbol), args);
|
||||||
sexp_eval_string(ctx, sexp_argv_proc, env);
|
sexp_eval_string(ctx, sexp_argv_proc, env);
|
||||||
if (i < argc)
|
if (i < argc) { /* script usage */
|
||||||
for ( ; i < argc; i++)
|
check_exception(ctx, sexp_load(ctx, tmp=sexp_c_string(ctx, argv[i], -1), env));
|
||||||
check_exception(ctx, sexp_load(ctx, str=sexp_c_string(ctx, argv[i], -1), env));
|
tmp = sexp_intern(ctx, "main");
|
||||||
else
|
tmp = sexp_env_ref(env, tmp, SEXP_FALSE);
|
||||||
|
if (sexp_procedurep(tmp)) {
|
||||||
|
args = sexp_list1(ctx, args);
|
||||||
|
check_exception(ctx, sexp_apply(ctx, tmp, args));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
repl(ctx);
|
repl(ctx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sexp_gc_release2(ctx);
|
sexp_gc_release2(ctx);
|
||||||
|
@ -178,4 +191,3 @@ int main (int argc, char **argv) {
|
||||||
run_main(argc, argv);
|
run_main(argc, argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ i=0
|
||||||
|
|
||||||
for opts in `cat ${BUILDDIR}/build-opts.txt`; do
|
for opts in `cat ${BUILDDIR}/build-opts.txt`; do
|
||||||
make cleaner 2>&1 >/dev/null
|
make cleaner 2>&1 >/dev/null
|
||||||
if make $opts 2>&1 >${BUILDDIR}/build${i}-make.out; then
|
if make $opts chibi-scheme 2>&1 >${BUILDDIR}/build${i}-make.out; then
|
||||||
if make test 2>&1 | tee ${BUILDDIR}/build${i}-test.out | grep -q -E 'FAIL|ERROR'; then
|
if make test 2>&1 | tee ${BUILDDIR}/build${i}-test.out | grep -q -E 'FAIL|ERROR'; then
|
||||||
echo "[FAIL] ${i}: tests failed with $opts"
|
echo "[FAIL] ${i}: tests failed with $opts"
|
||||||
FAILURES=$((FAILURES + 1))
|
FAILURES=$((FAILURES + 1))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#! chibi-scheme -s
|
#! /usr/bin/env chibi-scheme
|
||||||
|
|
||||||
;; Note: this evolved as a throw-away script to provide certain core
|
;; Note: this evolved as a throw-away script to provide certain core
|
||||||
;; modules, and so is a mess. Tread carefully.
|
;; modules, and so is a mess. Tread carefully.
|
||||||
|
@ -1152,5 +1152,3 @@
|
||||||
(with-output-to-file (cadr args) (lambda () (generate (car args))))))
|
(with-output-to-file (cadr args) (lambda () (generate (car args))))))
|
||||||
(else
|
(else
|
||||||
(error "usage: genstubs <file.stub> [<output.c>]"))))
|
(error "usage: genstubs <file.stub> [<output.c>]"))))
|
||||||
|
|
||||||
(main (command-line-arguments))
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue