mirror of
https://github.com/carp-lang/Carp.git
synced 2024-10-11 20:49:05 +03:00
started working on 'match'
This commit is contained in:
parent
b631a185ef
commit
c06cd76d76
@ -5,6 +5,15 @@
|
|||||||
;;(reset! log-deps-when-baking-ast true)
|
;;(reset! log-deps-when-baking-ast true)
|
||||||
;;(reset! log-redefining-struct true)
|
;;(reset! log-redefining-struct true)
|
||||||
|
|
||||||
|
(def carp-core-macros (open "../lisp/core_macros.carp"))
|
||||||
|
(def carp-core (read (open "../lisp/core.carp")))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;(eb '(do (def x "yeah") (println x)))
|
;;(eb '(do (def x "yeah") (println x)))
|
||||||
;;(eb '(do (def f (fn [z] (* z z))) (f 3)))
|
;;(eb '(do (def f (fn [z] (* z z))) (f 3)))
|
||||||
;;(eb '(map (fn [x] (* x x)) (list 1 2 3)))
|
;;(eb '(map (fn [x] (* x x)) (list 1 2 3)))
|
||||||
@ -48,33 +57,17 @@
|
|||||||
;; (time (println (str "fibb 26: " (eb '(fibb 26)))))
|
;; (time (println (str "fibb 26: " (eb '(fibb 26)))))
|
||||||
;;(time (println (str "fibb 20: " (eb '(fibb 20)))))
|
;;(time (println (str "fibb 20: " (eb '(fibb 20)))))
|
||||||
|
|
||||||
(eb '(def make-counter (fn [start]
|
|
||||||
(let [value start]
|
|
||||||
(fn []
|
|
||||||
(do (reset! value (inc value))
|
|
||||||
value))))))
|
|
||||||
|
|
||||||
(eb '(def c1 (make-counter 10)))
|
;; (eb '(def make-counter (fn [start]
|
||||||
;;(eb '(def c2 (make-counter 10)))
|
;; (let [value start]
|
||||||
|
;; (fn []
|
||||||
|
;; (do (reset! value (inc value))
|
||||||
|
;; value))))))
|
||||||
|
|
||||||
(eb '(println (str "c1: " (c1))))
|
;; (eb '(def c1 (make-counter 10)))
|
||||||
|
;; (eb '(def c2 (make-counter 10)))
|
||||||
|
|
||||||
|
;; (eb '(println (str "c1: " (c1))))
|
||||||
|
;; (eb '(println (str "c1: " (c1))))
|
||||||
;; (eb '(println (str "c1: " (c1))))
|
;; (eb '(println (str "c1: " (c1))))
|
||||||
;; (eb '(println (str "c2: " (c2))))
|
;; (eb '(println (str "c2: " (c2))))
|
||||||
|
|
||||||
;; (eb '(def f (fn [a] (list a a a))))
|
|
||||||
;; (eb '(def l (f 5)))
|
|
||||||
|
|
||||||
;; (eb '(def make-f (fn [a]
|
|
||||||
;; (let [x a]
|
|
||||||
;; (fn [] (reset! x (inc x))
|
|
||||||
;; x)))))
|
|
||||||
|
|
||||||
;; (eb '(def f1 (make-f 100)))
|
|
||||||
|
|
||||||
;; (eb '(f1))
|
|
||||||
|
|
||||||
;; (eb '(def f (fn [x] (fn [] (* x 123)))))
|
|
||||||
;; (eb '(def x (f 3)))
|
|
||||||
|
|
||||||
;; (eb '(println (str "x: " (x))))
|
|
||||||
|
@ -12,13 +12,13 @@
|
|||||||
|
|
||||||
#define HEAD_EQ(str) (form->car->tag == 'Y' && strcmp(form->car->s, (str)) == 0)
|
#define HEAD_EQ(str) (form->car->tag == 'Y' && strcmp(form->car->s, (str)) == 0)
|
||||||
|
|
||||||
|
// 'a' push lambda <literal>
|
||||||
// 'c' call <argcount>
|
// 'c' call <argcount>
|
||||||
// 'd' def <literal>
|
// 'd' def <literal>
|
||||||
// 'e' discard
|
// 'e' discard
|
||||||
// 'i' jump if false
|
// 'i' jump if false
|
||||||
// 'j' jump (no matter what)
|
// 'j' jump (no matter what)
|
||||||
// 'l' push <literal>
|
// 'l' push <literal>
|
||||||
// 'm' push lambda <literal>
|
|
||||||
// 'n' not
|
// 'n' not
|
||||||
// 'o' do
|
// 'o' do
|
||||||
// 'p' push nil
|
// 'p' push nil
|
||||||
@ -43,7 +43,7 @@ void add_lambda(Obj *bytecodeObj, int *position, Obj *form) {
|
|||||||
Obj *literals = bytecodeObj->bytecode_literals;
|
Obj *literals = bytecodeObj->bytecode_literals;
|
||||||
char new_literal_index = literals->count;
|
char new_literal_index = literals->count;
|
||||||
obj_array_mut_append(literals, form);
|
obj_array_mut_append(literals, form);
|
||||||
bytecodeObj->bytecode[*position] = 'm';
|
bytecodeObj->bytecode[*position] = 'a';
|
||||||
bytecodeObj->bytecode[*position + 1] = new_literal_index + 65;
|
bytecodeObj->bytecode[*position + 1] = new_literal_index + 65;
|
||||||
*position += 2;
|
*position += 2;
|
||||||
}
|
}
|
||||||
@ -133,6 +133,15 @@ void add_while(Process *process, Obj *env, Obj *bytecodeObj, int *position, Obj
|
|||||||
*position += 1;
|
*position += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void add_match(Process *process, Obj *env, Obj *bytecodeObj, int *position, Obj *form) {
|
||||||
|
Obj *literals = bytecodeObj->bytecode_literals;
|
||||||
|
char new_literal_index = literals->count;
|
||||||
|
obj_array_mut_append(literals, form);
|
||||||
|
bytecodeObj->bytecode[*position] = 'm';
|
||||||
|
bytecodeObj->bytecode[*position + 1] = new_literal_index + 65;
|
||||||
|
*position += 2;
|
||||||
|
}
|
||||||
|
|
||||||
void add_do(Process *process, Obj *env, Obj *bytecodeObj, int *position, Obj *form) {
|
void add_do(Process *process, Obj *env, Obj *bytecodeObj, int *position, Obj *form) {
|
||||||
Obj *p = form->cdr;
|
Obj *p = form->cdr;
|
||||||
while(p && p->car) {
|
while(p && p->car) {
|
||||||
@ -232,6 +241,9 @@ void visit_form(Process *process, Obj *env, Obj *bytecodeObj, int *position, Obj
|
|||||||
else if(HEAD_EQ("while")) {
|
else if(HEAD_EQ("while")) {
|
||||||
add_while(process, env, bytecodeObj, position, form);
|
add_while(process, env, bytecodeObj, position, form);
|
||||||
}
|
}
|
||||||
|
else if(HEAD_EQ("match")) {
|
||||||
|
add_match(process, env, bytecodeObj, position, form);
|
||||||
|
}
|
||||||
else if(HEAD_EQ("do")) {
|
else if(HEAD_EQ("do")) {
|
||||||
add_do(process, env, bytecodeObj, position, form);
|
add_do(process, env, bytecodeObj, position, form);
|
||||||
}
|
}
|
||||||
@ -387,7 +399,7 @@ Obj *bytecode_eval_internal(Process *process, Obj *bytecodeObj, int steps) {
|
|||||||
stack_push(process, literal);
|
stack_push(process, literal);
|
||||||
process->frames[process->frame].p += 2;
|
process->frames[process->frame].p += 2;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'a':
|
||||||
i = bytecode[p + 1] - 65;
|
i = bytecode[p + 1] - 65;
|
||||||
literal = literals_array[i];
|
literal = literals_array[i];
|
||||||
Obj *lambda = obj_new_lambda(literal->cdr->car, form_to_bytecode(process,
|
Obj *lambda = obj_new_lambda(literal->cdr->car, form_to_bytecode(process,
|
||||||
@ -489,7 +501,7 @@ Obj *bytecode_eval_internal(Process *process, Obj *bytecodeObj, int steps) {
|
|||||||
function = stack_pop(process);
|
function = stack_pop(process);
|
||||||
arg_count = bytecode[p + 1] - 65;
|
arg_count = bytecode[p + 1] - 65;
|
||||||
|
|
||||||
printf("will call %s with %d args.\n", obj_to_string(process, function)->s, arg_count);
|
//printf("will call %s with %d args.\n", obj_to_string(process, function)->s, arg_count);
|
||||||
|
|
||||||
Obj **args = NULL;
|
Obj **args = NULL;
|
||||||
if(arg_count > 0) {
|
if(arg_count > 0) {
|
||||||
@ -497,7 +509,6 @@ Obj *bytecode_eval_internal(Process *process, Obj *bytecodeObj, int steps) {
|
|||||||
}
|
}
|
||||||
for(int i = 0; i < arg_count; i++) {
|
for(int i = 0; i < arg_count; i++) {
|
||||||
Obj *arg = stack_pop(process);
|
Obj *arg = stack_pop(process);
|
||||||
printf("popped %s\n", obj_to_string(process, arg)->s);
|
|
||||||
args[arg_count - i - 1] = arg;
|
args[arg_count - i - 1] = arg;
|
||||||
//shadow_stack_push(process, arg);
|
//shadow_stack_push(process, arg);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user