can handle * in function names

This commit is contained in:
Erik 2016-03-04 11:50:03 +01:00
parent 53f0e0128d
commit d1f2966c81
8 changed files with 34 additions and 18 deletions

View File

@ -4,7 +4,7 @@ LDLIBS=-lffi
SOURCE_FILES=src/main.c src/obj.c src/gc.c src/obj_string.c src/reader.c src/eval.c src/env.c src/primops.c src/repl.c src/obj_array.c
all: src/main.o
clang $(SOURCE_FILES) -g -O0 -Wall -rdynamic -o ./bin/carp-repl -ldl $(CFLAGS) $(LDFLAGS) $(LDLIBS)
clang $(SOURCE_FILES) -g -O2 -Wall -rdynamic -o ./bin/carp-repl -ldl $(CFLAGS) $(LDFLAGS) $(LDLIBS)
run:
./bin/carp

View File

@ -284,6 +284,7 @@
(map (fn [dep] (add-function-dependency! (str dep) func-name)) total-dependencies)
(def ast ast-annotated)
(def c c-program-string)
;;(println (str "Will save and compile: '" func-name "' with c-func-name '" c-func-name "' and signature: " t))
(save-and-compile func-name t c-func-name c-file-name c-program-string proto total-dependencies exe)
(meta-set! (eval (symbol func-name)) :code func-code))))
@ -300,8 +301,10 @@
(def out-lib (load-dylib (str out-dir c-func-name (:dylib-extension platform-specifics))))
(register out-lib c-func-name arg-types return-type)
(add-func! func-name proto out-lib)
(let [f (eval (read func-name))]
(do (def s (pretty-signature (signature f)))
(let [f (eval (read func-name))
sig (signature f)]
(do (when (nil? sig) (error (str "No signature on function " f)))
(def s (pretty-signature sig))
(when echo-signature-after-bake (println (str func-name " : " s)))
f)))))
_ (error "Must bake function with type (:fn ...)")))

View File

@ -248,6 +248,7 @@
(register-builtin "substring" '(:string :int) :string)
(register-builtin "file_path_component" '(:string) :string)
(register-builtin "get_input" '() :string)
(register-builtin "mod" '(:int :int) :int)
(register-builtin "call" '((:fn () :void)) :void)
(register-builtin "call1" '((:fn (:int) :void)) :void)

View File

@ -130,7 +130,7 @@
(defn mapping []
(map x2 [1 2 3 4 5]))
(bake mapping)
;;(bake mapping)
(defn x2f [x]
(* x 2.0))
@ -147,4 +147,10 @@
(defn mapping-strings []
(map exclaim [(string-copy "hej") (string-copy "san") (string-copy "svej") (string-copy "san")]))
;;(bake mapping)
(defn even-i? [x]
(if (even? x)
1
0))
(defn map-even []
(map even-i? [1 2 3 4 5 6 7]))

View File

@ -193,6 +193,10 @@ EXPORT void printret(int (*f)()) {
printf("ret = %d\n", x);
}
EXPORT int mod(int x, int y) {
return x % y;
}
#ifdef WIN32
EXPORT void sleep(int millis) {
carp_sleep(millis);

View File

@ -177,16 +177,16 @@ Obj *p_div(Obj** args, int arg_count) {
}
}
Obj *p_mod(Obj** args, int arg_count) {
if(arg_count == 0) {
return obj_new_int(1);
}
int prod = args[0]->i;
for(int i = 1; i < arg_count; i++) {
prod %= args[i]->i;
}
return obj_new_int(prod);
}
/* Obj *p_mod(Obj** args, int arg_count) { */
/* if(arg_count == 0) { */
/* return obj_new_int(1); */
/* } */
/* int prod = args[0]->i; */
/* for(int i = 1; i < arg_count; i++) { */
/* prod %= args[i]->i; */
/* } */
/* return obj_new_int(prod); */
/* } */
Obj *p_eq(Obj** args, int arg_count) {
if(arg_count < 2) {
@ -1267,9 +1267,11 @@ char *lispify(char *name) {
char *s0 = str_replace(name, "_", "-");
char *s1 = str_replace(s0, "BANG", "!");
char *s2 = str_replace(s1, "QMARK", "?");
char *s3 = str_replace(s2, "PTR", "*");
free(s0);
free(s1);
return s2;
free(s2);
return s3;
}
ffi_type **make_arg_type_array(Obj *args, int arg_count, char *func_name) {

View File

@ -12,7 +12,7 @@ Obj *p_add(Obj** args, int arg_count);
Obj *p_sub(Obj** args, int arg_count);
Obj *p_mul(Obj** args, int arg_count);
Obj *p_div(Obj** args, int arg_count);
Obj *p_mod(Obj** args, int arg_count);
//Obj *p_mod(Obj** args, int arg_count);
Obj *p_eq(Obj** args, int arg_count);
Obj *p_list(Obj** args, int arg_count);
Obj *p_str(Obj** args, int arg_count);

View File

@ -160,7 +160,7 @@ void env_new_global() {
register_primop("-", p_sub);
register_primop("*", p_mul);
register_primop("/", p_div);
register_primop("mod", p_mod);
//register_primop("mod", p_mod);
register_primop("=", p_eq);
register_primop("list", p_list);
register_primop("str", p_str);