prep for useing de bruijn
This commit is contained in:
145
partial_eval.kp
145
partial_eval.kp
@@ -31,7 +31,7 @@
|
|||||||
; It is possible to have a combiner without an actual function, but that's only generated when
|
; It is possible to have a combiner without an actual function, but that's only generated when
|
||||||
; we know it's about to be called and we won't have to strip-lower it
|
; we know it's about to be called and we won't have to strip-lower it
|
||||||
; ['prim_comb <handler_function>] - A primitive combiner! It has it's own special handler function to partial eval
|
; ['prim_comb <handler_function>] - A primitive combiner! It has it's own special handler function to partial eval
|
||||||
; ['env is_real [ ['symbol marked_value ]... <upper_marked_env> ]] - A marked env
|
; ['env is_real de_bruijn_idx_or_nil [ ['symbol marked_value ]... <upper_marked_env> ]] - A marked env
|
||||||
|
|
||||||
|
|
||||||
val? (lambda (x) (= 'val (idx x 0)))
|
val? (lambda (x) (= 'val (idx x 0)))
|
||||||
@@ -48,9 +48,10 @@
|
|||||||
.prim_comb (lambda (x) (idx x 1))
|
.prim_comb (lambda (x) (idx x 1))
|
||||||
marked_env? (lambda (x) (= 'env (idx x 0)))
|
marked_env? (lambda (x) (= 'env (idx x 0)))
|
||||||
marked_env_real? (lambda (x) (idx x 1))
|
marked_env_real? (lambda (x) (idx x 1))
|
||||||
.env_marked (lambda (x) (idx x 2))
|
.marked_env_idx (lambda (x) (idx x 2))
|
||||||
|
.env_marked (lambda (x) (idx x 3))
|
||||||
|
|
||||||
later? (rec-lambda recurse (x) (or (and (marked_array? x) (= false (.marked_array_is_val x)))
|
later? (rec-lambda recurse (x) (or (and (marked_array? x) (or (= false (.marked_array_is_val x)) (foldl (lambda (a x) (or a (recurse x))) false (.marked_array_values x))))
|
||||||
(and (marked_symbol? x) (= false (.marked_symbol_is_val x)))
|
(and (marked_symbol? x) (= false (.marked_symbol_is_val x)))
|
||||||
(and (marked_env? x) (not (marked_env_real? x)))
|
(and (marked_env? x) (not (marked_env_real? x)))
|
||||||
(and (comb? x) (let ([wrap_level de? se variadic params body] (.comb x)
|
(and (comb? x) (let ([wrap_level de? se variadic params body] (.comb x)
|
||||||
@@ -87,11 +88,14 @@
|
|||||||
stripped_values))
|
stripped_values))
|
||||||
(marked_symbol? x) (if (.marked_symbol_is_val x) ['quote (.marked_symbol_value x)]
|
(marked_symbol? x) (if (.marked_symbol_is_val x) ['quote (.marked_symbol_value x)]
|
||||||
(.marked_symbol_value x))
|
(.marked_symbol_value x))
|
||||||
(comb? x) (let ([wrap_level de? se variadic params body] (.comb x)) (str "<comb " wrap_level " " de? " <se " (recurse se) "> " params " " (recurse body) ">"))
|
(comb? x) (let ([wrap_level de? se variadic params body] (.comb x))
|
||||||
|
(str "<comb " wrap_level " " de? " <se> " params " " (recurse body) ">"))
|
||||||
|
;(str "<comb " wrap_level " " de? " <se " (recurse se) "> " params " " (recurse body) ">"))
|
||||||
(prim_comb? x) (idx x 2)
|
(prim_comb? x) (idx x 2)
|
||||||
(marked_env? x) (let (e (.env_marked x)
|
(marked_env? x) (let (e (.env_marked x)
|
||||||
|
index (.marked_env_idx x)
|
||||||
u (idx e -1)
|
u (idx e -1)
|
||||||
) (if u (str "<" (if (marked_env_real? x) "real" "fake") " ENV " (map (lambda ([k v]) [k (recurse v)]) (slice e 0 -2)) " upper: " (recurse u) ">")
|
) (if u (str "<" (if (marked_env_real? x) "real" "fake") " ENV idx: " (str index) ", " (map (lambda ([k v]) [k (recurse v)]) (slice e 0 -2)) " upper: " (recurse u) ">")
|
||||||
"<no_upper_likely_root_env>"))
|
"<no_upper_likely_root_env>"))
|
||||||
true (error (str "some other str_strip? |" x "|"))
|
true (error (str "some other str_strip? |" x "|"))
|
||||||
)
|
)
|
||||||
@@ -117,6 +121,7 @@
|
|||||||
) (if se_env (eval fe se_env) fe))
|
) (if se_env (eval fe se_env) fe))
|
||||||
(prim_comb? x) (idx x 2)
|
(prim_comb? x) (idx x 2)
|
||||||
; env emitting doesn't pay attention to real value right now, not sure if that makes sense
|
; env emitting doesn't pay attention to real value right now, not sure if that makes sense
|
||||||
|
; TODO: properly handle de Bruijn indexed envs
|
||||||
(marked_env? x) (let (_ (if (not (marked_env_real? x)) (error (str_strip "trying to emit fake env!" x)))
|
(marked_env? x) (let (_ (if (not (marked_env_real? x)) (error (str_strip "trying to emit fake env!" x)))
|
||||||
upper (idx (.env_marked x) -1)
|
upper (idx (.env_marked x) -1)
|
||||||
upper_env (if upper (recurse upper true) empty_env)
|
upper_env (if upper (recurse upper true) empty_env)
|
||||||
@@ -160,6 +165,7 @@
|
|||||||
(= x (idx a i)) true
|
(= x (idx a i)) true
|
||||||
true (recurse x a (+ i 1)))))
|
true (recurse x a (+ i 1)))))
|
||||||
(lambda (x a) (helper x a 0)))
|
(lambda (x a) (helper x a 0)))
|
||||||
|
; TODO: make this check for stop envs using de Bruijn indicies
|
||||||
contains_symbols (rec-lambda recurse (stop_envs symbols x) (cond
|
contains_symbols (rec-lambda recurse (stop_envs symbols x) (cond
|
||||||
(val? x) false
|
(val? x) false
|
||||||
(marked_symbol? x) (let (r (in_array (.marked_symbol_value x) symbols)
|
(marked_symbol? x) (let (r (in_array (.marked_symbol_value x) symbols)
|
||||||
@@ -180,25 +186,46 @@
|
|||||||
|
|
||||||
is_all_values (lambda (evaled_params) (foldl (lambda (a x) (and a (not (later? x)))) true evaled_params))
|
is_all_values (lambda (evaled_params) (foldl (lambda (a x) (and a (not (later? x)))) true evaled_params))
|
||||||
|
|
||||||
|
shift_envs (rec-lambda recurse (cutoff d x) (cond
|
||||||
|
(val? x) [true x]
|
||||||
|
(marked_env? x) (let ([_env is_real dbi meat] x
|
||||||
|
[nmeat_ok nmeat] (foldl (lambda ([ok r] [k v]) (let ([tok tv] (recurse cutoff d v)) [(and ok tok) (concat r [[k tv]])])) [true []] (slice meat 0 -2))
|
||||||
|
[nupper_ok nupper] (if (idx meat -1) (recurse cutoff d (idx meat -1)) [true nil])
|
||||||
|
ndbi (if (>= cutoff dbi) (+ dbi d) dbi)
|
||||||
|
) [(and nmeat_ok nupper_ok (>= ndbi 0)) ['env is_real ndbi (concat nmeat [nupper])]])
|
||||||
|
(comb? x) (let ([wrap_level de? se variadic params body] (.comb x)
|
||||||
|
[se_ok nse] (recurse cutoff d se)
|
||||||
|
[body_ok nbody] (recurse (+ cutoff 1) d body)
|
||||||
|
) [(and se_ok body_ok) ['comb wrap_level de? nse variadic params nbody]])
|
||||||
|
(prim_comb? x) [true x]
|
||||||
|
(marked_symbol? x) [true x]
|
||||||
|
(marked_array? x) (let ([insides_ok insides] (foldl (lambda ([ok r] tx) (let ([tok tr] (recurse cutoff d tx)) [(and ok tok) (concat r [tr])])) [true []] (.marked_array_values x)))
|
||||||
|
[insides_ok ['marked_array (.marked_array_is_val x) insides]])
|
||||||
|
true (error (str "impossible shift_envs value " x))
|
||||||
|
))
|
||||||
|
increment_envs (lambda (x) (idx (shift_envs 0 1 x) 1))
|
||||||
|
decrement_envs (lambda (x) (shift_envs 0 -1 x))
|
||||||
|
|
||||||
|
; TODO: instead of returning the later symbols, we could create a new value of a new type
|
||||||
|
; ['ref de_bruijn_index_of_env index_into_env] or somesuch. Could really simplify
|
||||||
|
; compiling, and I think make partial-eval more efficient. More accurate closes_over analysis too, I think
|
||||||
make_tmp_inner_env (lambda (params de? de)
|
make_tmp_inner_env (lambda (params de? de)
|
||||||
['env false (concat (map (lambda (p) [p ['marked_symbol false p]]) params) (if (= nil de?) [] [ [de? ['marked_symbol false de?]] ]) [de])])
|
; TODO: our de Bruijn index is 0, increment de's index
|
||||||
|
['env false 0 (concat (map (lambda (p) [p ['marked_symbol false p]]) params) (if (= nil de?) [] [ [de? ['marked_symbol false de?]] ]) [(increment_envs de)])])
|
||||||
|
|
||||||
|
|
||||||
partial_eval_helper (rec-lambda recurse (x env indent)
|
partial_eval_helper (rec-lambda recurse (x env env_stack indent)
|
||||||
(cond (val? x) x
|
(cond (val? x) x
|
||||||
|
; TODO: update from current environment stack based on de Bruijn index
|
||||||
|
; Note that we need to normalize indicies, I think - incrementing or decrmenting values in the env from env_stack
|
||||||
|
; to match what we have here, which can be calculated by the difference between the level the env thinks it is verses what it is
|
||||||
|
; note we do have to make sure that index is copied over as well.
|
||||||
(marked_env? x) x
|
(marked_env? x) x
|
||||||
;(comb? x) x
|
|
||||||
; ? this is legal because we don't allow expressions that close over symbols from outer envs to escape those envs,
|
|
||||||
; so by necessity this is being partially-evaled again in the same environment or sub-environment.
|
|
||||||
; GAH how do we make sure to avoid capture substitution stuff?
|
|
||||||
; Need to prevent evaluating calls where parameters close over symbols of the function being called
|
|
||||||
; or any user-input eval calls, note that we're replacing se below!
|
|
||||||
; honestly, it seems like we need a way to differentiate between re-partial-evaluating a vau in it's same context but
|
|
||||||
; with a more accurate environment, and passing around a partially-evaluated comb and calling it
|
|
||||||
(comb? x) (let ([wrap_level de? se variadic params body] (.comb x))
|
(comb? x) (let ([wrap_level de? se variadic params body] (.comb x))
|
||||||
(if (or (and (not (marked_env_real? env)) (not (marked_env_real? se))) ; both aren't real, re-evaluation of creation site
|
(if (or (and (not (marked_env_real? env)) (not (marked_env_real? se))) ; both aren't real, re-evaluation of creation site
|
||||||
(and (marked_env_real? env) (not (marked_env_real? se)))) ; new env real, but se isn't - creation!
|
(and (marked_env_real? env) (not (marked_env_real? se)))) ; new env real, but se isn't - creation!
|
||||||
['comb wrap_level de? env variadic params (recurse body (make_tmp_inner_env params de? env) (+ indent 1))]
|
(let (inner_env (make_tmp_inner_env params de? env))
|
||||||
|
['comb wrap_level de? env variadic params (recurse body inner_env (cons inner_env env_stack) (+ indent 1))])
|
||||||
x))
|
x))
|
||||||
(prim_comb? x) x
|
(prim_comb? x) x
|
||||||
(marked_symbol? x) (if (.marked_symbol_is_val x) x
|
(marked_symbol? x) (if (.marked_symbol_is_val x) x
|
||||||
@@ -208,20 +235,16 @@
|
|||||||
true (let (values (.marked_array_values x)
|
true (let (values (.marked_array_values x)
|
||||||
;_ (println (indent_str indent) "partial_evaling comb " (idx values 0))
|
;_ (println (indent_str indent) "partial_evaling comb " (idx values 0))
|
||||||
_ (print_strip (indent_str indent) "partial_evaling comb " (idx values 0))
|
_ (print_strip (indent_str indent) "partial_evaling comb " (idx values 0))
|
||||||
comb (recurse (idx values 0) env (+ 1 indent))
|
comb (recurse (idx values 0) env env_stack (+ 1 indent))
|
||||||
literal_params (slice values 1 -1)
|
literal_params (slice values 1 -1)
|
||||||
_ (println (indent_str indent) "Going to do an array call!")
|
_ (println (indent_str indent) "Going to do an array call!")
|
||||||
_ (print_strip (indent_str indent) " total is " x)
|
_ (print_strip (indent_str indent) " total is " x)
|
||||||
_ (print_strip (indent_str indent) " evaled comb is " comb)
|
_ (print_strip (indent_str indent) " evaled comb is " comb)
|
||||||
ident (+ 1 indent)
|
ident (+ 1 indent)
|
||||||
)
|
)
|
||||||
;;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
(cond (prim_comb? comb) ((.prim_comb comb) env env_stack literal_params (+ 1 indent))
|
||||||
;; With our new definition of later?, this prevents combiners without full se's from being called
|
|
||||||
;;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
(cond (later? comb) ['marked_array false (cons comb literal_params)]
|
|
||||||
(prim_comb? comb) ((.prim_comb comb) env literal_params (+ 1 indent))
|
|
||||||
(comb? comb) (let (
|
(comb? comb) (let (
|
||||||
rp_eval (lambda (p) (recurse p env (+ 1 indent)))
|
rp_eval (lambda (p) (recurse p env env_stack (+ 1 indent)))
|
||||||
[wrap_level de? se variadic params body] (.comb comb)
|
[wrap_level de? se variadic params body] (.comb comb)
|
||||||
ensure_val_params (map ensure_val literal_params)
|
ensure_val_params (map ensure_val literal_params)
|
||||||
[ok appropriatly_evaled_params] ((rec-lambda param-recurse (wrap cparams)
|
[ok appropriatly_evaled_params] ((rec-lambda param-recurse (wrap cparams)
|
||||||
@@ -244,45 +267,43 @@
|
|||||||
['marked_symbol false de?])] ]
|
['marked_symbol false de?])] ]
|
||||||
[])
|
[])
|
||||||
;_ (println (indent_str indent) "final_params params " final_params)
|
;_ (println (indent_str indent) "final_params params " final_params)
|
||||||
inner_env ['env (marked_env_real? se) (concat (zip params final_params) de_entry [se])]
|
inner_env ['env (marked_env_real? se) 0 (concat (zip params (map (lambda (x) (increment_envs x)) final_params)) de_entry [(increment_envs se)])]
|
||||||
;_ (println (indent_str indent) "going to eval " body " with inner_env is " inner_env)
|
|
||||||
_ (print_strip (indent_str indent) " with inner_env is " inner_env)
|
_ (print_strip (indent_str indent) " with inner_env is " inner_env)
|
||||||
_ (print_strip (indent_str indent) "going to eval " body)
|
_ (print_strip (indent_str indent) "going to eval " body)
|
||||||
|
|
||||||
|
tmp_func_result (recurse body inner_env (cons inner_env env_stack) (+ 1 indent))
|
||||||
func_result (recurse body inner_env (+ 1 indent))
|
_ (print_strip (indent_str indent) "evaled result of function call is " tmp_func_result)
|
||||||
|
[able_to_sub_env func_result] (decrement_envs tmp_func_result)
|
||||||
_ (print_strip (indent_str indent) "evaled result of function call is " func_result)
|
|
||||||
result_is_later (later? func_result)
|
result_is_later (later? func_result)
|
||||||
stop_envs ((rec-lambda ser (a e) (if e (ser (cons e a) (idx (.env_marked e) -1)) a)) [] se)
|
stop_envs ((rec-lambda ser (a e) (if e (ser (cons e a) (idx (.env_marked e) -1)) a)) [] se)
|
||||||
result_closes_over (contains_symbols stop_envs (concat params (if de? [de?] [])) func_result)
|
result_closes_over (contains_symbols stop_envs (concat params (if de? [de?] [])) func_result)
|
||||||
_ (println (indent_str indent) "func call result is later? " result_is_later " and result_closes_over " result_closes_over)
|
_ (println (indent_str indent) "func call able_to_sub: " able_to_sub_env " result is later? " result_is_later " and result_closes_over " result_closes_over)
|
||||||
; This could be improved to a specialized version of the function
|
; This could be improved to a specialized version of the function
|
||||||
; just by re-wrapping it in a comb instead if we wanted.
|
; just by re-wrapping it in a comb instead if we wanted.
|
||||||
; Something to think about!
|
; Something to think about!
|
||||||
result (if (and result_is_later result_closes_over)
|
result (if (or (not able_to_sub_env) (and result_is_later result_closes_over))
|
||||||
['marked_array false (cons comb (if (> wrap_level 0) (map rp_eval ensure_val_params)
|
['marked_array false (cons comb (if (> wrap_level 0) (map rp_eval literal_params)
|
||||||
literal_params))]
|
literal_params))]
|
||||||
func_result)
|
func_result)
|
||||||
) result)))
|
) result)))
|
||||||
true (error (str "Partial eval noticed that you will likely call not a function " comb " total is " x)))))
|
(later? comb) ['marked_array false (cons comb literal_params)])))
|
||||||
true (error (str "impossible partial_eval value " x))
|
true (error (str "impossible partial_eval value " x))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
needs_params_val_lambda (vau de (f_sym) (let (
|
needs_params_val_lambda (vau de (f_sym) (let (
|
||||||
actual_function (eval f_sym de)
|
actual_function (eval f_sym de)
|
||||||
handler (rec-lambda recurse (de params indent) (let (
|
handler (rec-lambda recurse (de env_stack params indent) (let (
|
||||||
_ (println "partial_evaling params in need_params_val_lambda for " f_sym " is " params)
|
_ (println "partial_evaling params in need_params_val_lambda for " f_sym " is " params)
|
||||||
evaled_params (map (lambda (p) (partial_eval_helper p de (+ 1 indent))) params)
|
evaled_params (map (lambda (p) (partial_eval_helper p de env_stack (+ 1 indent))) params)
|
||||||
)
|
)
|
||||||
(if (is_all_values evaled_params) (mark (lapply actual_function (map strip evaled_params)))
|
(if (is_all_values evaled_params) (mark (lapply actual_function (map strip evaled_params)))
|
||||||
['marked_array false (cons ['prim_comb recurse actual_function] evaled_params)])))
|
['marked_array false (cons ['prim_comb recurse actual_function] evaled_params)])))
|
||||||
) [f_sym ['prim_comb handler actual_function]]))
|
) [f_sym ['prim_comb handler actual_function]]))
|
||||||
give_up_eval_params (vau de (f_sym) (let (
|
give_up_eval_params (vau de (f_sym) (let (
|
||||||
actual_function (eval f_sym de)
|
actual_function (eval f_sym de)
|
||||||
handler (rec-lambda recurse (de params indent) (let (
|
handler (rec-lambda recurse (de env_stack params indent) (let (
|
||||||
_ (println "partial_evaling params in give_up_eval_params for " f_sym " is " params)
|
_ (println "partial_evaling params in give_up_eval_params for " f_sym " is " params)
|
||||||
evaled_params (map (lambda (p) (partial_eval_helper p de (+ 1 indent))) params)
|
evaled_params (map (lambda (p) (partial_eval_helper p de env_stack (+ 1 indent))) params)
|
||||||
)
|
)
|
||||||
['marked_array false (cons ['prim_comb recurse actual_function] evaled_params)]))
|
['marked_array false (cons ['prim_comb recurse actual_function] evaled_params)]))
|
||||||
) [f_sym ['prim_comb handler actual_function]]))
|
) [f_sym ['prim_comb handler actual_function]]))
|
||||||
@@ -290,21 +311,21 @@
|
|||||||
; !!!!!!
|
; !!!!!!
|
||||||
; ! I think needs_params_val_lambda should be combined with parameters_evaled_proxy
|
; ! I think needs_params_val_lambda should be combined with parameters_evaled_proxy
|
||||||
; !!!!!!
|
; !!!!!!
|
||||||
parameters_evaled_proxy (rec-lambda recurse (pasthr_ie inner_f) (lambda (de params indent) (let (
|
parameters_evaled_proxy (rec-lambda recurse (pasthr_ie inner_f) (lambda (de env_stack params indent) (let (
|
||||||
_ (println "partial_evaling params in parameters_evaled_proxy is " params)
|
_ (println "partial_evaling params in parameters_evaled_proxy is " params)
|
||||||
[evaled_params l] (foldl (lambda ([ac i] p) (let (p (partial_eval_helper p de (+ 1 indent)))
|
[evaled_params l] (foldl (lambda ([ac i] p) (let (p (partial_eval_helper p de env_stack (+ 1 indent)))
|
||||||
[(concat ac [p]) (+ i 1)]))
|
[(concat ac [p]) (+ i 1)]))
|
||||||
[[] 0]
|
[[] 0]
|
||||||
params)
|
params)
|
||||||
) (inner_f (lambda (& args) (lapply (recurse pasthr_ie inner_f) args)) de evaled_params indent))))
|
) (inner_f (lambda (& args) (lapply (recurse pasthr_ie inner_f) args)) de env_stack evaled_params indent))))
|
||||||
|
|
||||||
root_marked_env ['env true [
|
root_marked_env ['env true nil [
|
||||||
; Ok, so for combinators, it should partial eval the body.
|
; Ok, so for combinators, it should partial eval the body.
|
||||||
; It should then check to see if the partial-evaled body has closed over
|
; It should then check to see if the partial-evaled body has closed over
|
||||||
; any 'later values from above the combinator. If so, the combinator should
|
; any 'later values from above the combinator. If so, the combinator should
|
||||||
; evaluate to a ['later [vau de? params (strip partially_evaled_body)]], otherwise it can evaluate to a 'comb.
|
; evaluate to a ['later [vau de? params (strip partially_evaled_body)]], otherwise it can evaluate to a 'comb.
|
||||||
; Note that this 'later may be re-evaluated later if the parent function is called.
|
; Note that this 'later may be re-evaluated later if the parent function is called.
|
||||||
['vau ['prim_comb (rec-lambda recurse (de params indent) (let (
|
['vau ['prim_comb (rec-lambda recurse (de env_stack params indent) (let (
|
||||||
mde? (if (= 3 (len params)) (idx params 0))
|
mde? (if (= 3 (len params)) (idx params 0))
|
||||||
vau_mde? (if (= nil mde?) [] [mde?])
|
vau_mde? (if (= nil mde?) [] [mde?])
|
||||||
de? (if mde? (.marked_symbol_value mde?))
|
de? (if mde? (.marked_symbol_value mde?))
|
||||||
@@ -316,34 +337,34 @@
|
|||||||
body (if (= nil de?) (idx params 1) (idx params 2))
|
body (if (= nil de?) (idx params 1) (idx params 2))
|
||||||
inner_env (make_tmp_inner_env vau_params de? de)
|
inner_env (make_tmp_inner_env vau_params de? de)
|
||||||
_ (print_strip (indent_str indent) "in vau, evaluating body with 'later params - " body)
|
_ (print_strip (indent_str indent) "in vau, evaluating body with 'later params - " body)
|
||||||
pe_body (partial_eval_helper body inner_env (+ 1 indent))
|
pe_body (partial_eval_helper body inner_env (cons inner_env env_stack) (+ 1 indent))
|
||||||
_ (print_strip (indent_str indent) "in vau, result of evaluating body was " pe_body)
|
_ (print_strip (indent_str indent) "in vau, result of evaluating body was " pe_body)
|
||||||
_ (print_strip pe_body)
|
_ (print_strip pe_body)
|
||||||
) ['comb 0 de? de variadic vau_params pe_body]
|
) ['comb 0 de? de variadic vau_params pe_body]
|
||||||
)) vau]]
|
)) vau]]
|
||||||
|
|
||||||
['wrap ['prim_comb (parameters_evaled_proxy 0 (lambda (recurse de [evaled] indent)
|
['wrap ['prim_comb (parameters_evaled_proxy 0 (lambda (recurse de env_stack [evaled] indent)
|
||||||
(if (comb? evaled) (let ([wrap_level de? se variadic params body] (.comb evaled)
|
(if (comb? evaled) (let ([wrap_level de? se variadic params body] (.comb evaled)
|
||||||
wrapped_marked_fun ['comb (+ 1 wrap_level) de? se variadic params body]
|
wrapped_marked_fun ['comb (+ 1 wrap_level) de? se variadic params body]
|
||||||
) wrapped_marked_fun)
|
) wrapped_marked_fun)
|
||||||
['marked_array false [['prim_comb recurse wrap] evaled]]))
|
['marked_array false [['prim_comb recurse wrap] evaled]]))
|
||||||
) wrap]]
|
) wrap]]
|
||||||
['unwrap ['prim_comb (parameters_evaled_proxy 0 (lambda (recurse de [evaled] indent)
|
['unwrap ['prim_comb (parameters_evaled_proxy 0 (lambda (recurse de env_stack [evaled] indent)
|
||||||
(if (comb? evaled) (let ([wrap_level de? se variadic params body] (.comb evaled)
|
(if (comb? evaled) (let ([wrap_level de? se variadic params body] (.comb evaled)
|
||||||
unwrapped_marked_fun ['comb (- wrap_level 1) de? se variadic params body]
|
unwrapped_marked_fun ['comb (- wrap_level 1) de? se variadic params body]
|
||||||
) unwrapped_marked_fun)
|
) unwrapped_marked_fun)
|
||||||
['marked_array false [['prim_comb recurse wrap] evaled]]))
|
['marked_array false [['prim_comb recurse wrap] evaled]]))
|
||||||
) unwrap]]
|
) unwrap]]
|
||||||
|
|
||||||
['eval ['prim_comb (rec-lambda recurse (de params indent) (let (
|
['eval ['prim_comb (rec-lambda recurse (de env_stack params indent) (let (
|
||||||
self ['prim_comb recurse eval]
|
self ['prim_comb recurse eval]
|
||||||
eval_env (if (= 2 (len params)) (partial_eval_helper (idx params 1) de (+ 1 indent))
|
eval_env (if (= 2 (len params)) (partial_eval_helper (idx params 1) de env_stack (+ 1 indent))
|
||||||
de)
|
de)
|
||||||
eval_env_v (if (= 2 (len params)) [eval_env] [])
|
eval_env_v (if (= 2 (len params)) [eval_env] [])
|
||||||
) (if (not (marked_env? eval_env)) ['marked_array false (cons self params)]
|
) (if (not (marked_env? eval_env)) ['marked_array false (cons self params)]
|
||||||
(let (
|
(let (
|
||||||
_ (print_strip (indent_str indent) " partial_evaling_body the first time " (idx params 0))
|
_ (print_strip (indent_str indent) " partial_evaling_body the first time " (idx params 0))
|
||||||
body1 (partial_eval_helper (idx params 0) de (+ 1 indent))
|
body1 (partial_eval_helper (idx params 0) de env_stack (+ 1 indent))
|
||||||
_ (print_strip (indent_str indent) "after first eval of param " body1)
|
_ (print_strip (indent_str indent) "after first eval of param " body1)
|
||||||
|
|
||||||
; With this, we don't actually fail as this is always a legitimate uneval
|
; With this, we don't actually fail as this is always a legitimate uneval
|
||||||
@@ -351,7 +372,7 @@
|
|||||||
[ok unval_body] (try_unval body1 fail_handler)
|
[ok unval_body] (try_unval body1 fail_handler)
|
||||||
self_fallback (fail_handler body1)
|
self_fallback (fail_handler body1)
|
||||||
_ (print_strip "partial_evaling body for the second time in eval " unval_body)
|
_ (print_strip "partial_evaling body for the second time in eval " unval_body)
|
||||||
body2 (if (= self_fallback unval_body) self_fallback (partial_eval_helper unval_body eval_env (+ 1 indent)))
|
body2 (if (= self_fallback unval_body) self_fallback (partial_eval_helper unval_body eval_env env_stack (+ 1 indent)))
|
||||||
_ (print_strip (indent_str indent) "and body2 is " body2)
|
_ (print_strip (indent_str indent) "and body2 is " body2)
|
||||||
) body2))
|
) body2))
|
||||||
)) eval]]
|
)) eval]]
|
||||||
@@ -359,7 +380,7 @@
|
|||||||
;TODO: This could go a lot farther, not stopping after the first 'later, etc
|
;TODO: This could go a lot farther, not stopping after the first 'later, etc
|
||||||
; Also, GAH on odd params - but only one by one - a later odd param can't be imm_eval cuz it will
|
; Also, GAH on odd params - but only one by one - a later odd param can't be imm_eval cuz it will
|
||||||
; be frozen if an earlier cond is 'later....
|
; be frozen if an earlier cond is 'later....
|
||||||
['cond ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de evaled_params indent)
|
['cond ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack evaled_params indent)
|
||||||
(if (!= 0 (% (len evaled_params) 2)) (error (str "partial eval cond with odd evaled_params " evaled_params))
|
(if (!= 0 (% (len evaled_params) 2)) (error (str "partial eval cond with odd evaled_params " evaled_params))
|
||||||
((rec-lambda recurse_inner (i)
|
((rec-lambda recurse_inner (i)
|
||||||
(cond (later? (idx evaled_params i)) ['marked_array false (cons ['prim_comb recurse cond] (slice evaled_params i -1))]
|
(cond (later? (idx evaled_params i)) ['marked_array false (cons ['prim_comb recurse cond] (slice evaled_params i -1))]
|
||||||
@@ -373,7 +394,7 @@
|
|||||||
(needs_params_val_lambda int?)
|
(needs_params_val_lambda int?)
|
||||||
(needs_params_val_lambda string?)
|
(needs_params_val_lambda string?)
|
||||||
; not even a gah, but kinda!
|
; not even a gah, but kinda!
|
||||||
['combiner? ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de [evaled_param] indent)
|
['combiner? ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack [evaled_param] indent)
|
||||||
(cond (comb? evaled_param) ['val true]
|
(cond (comb? evaled_param) ['val true]
|
||||||
(prim_comb? evaled_param) ['val true]
|
(prim_comb? evaled_param) ['val true]
|
||||||
(later? evaled_param) ['marked_array false [['prim_comb recurse combiner?] evaled_param]]
|
(later? evaled_param) ['marked_array false [['prim_comb recurse combiner?] evaled_param]]
|
||||||
@@ -381,7 +402,7 @@
|
|||||||
)
|
)
|
||||||
)) combiner?]]
|
)) combiner?]]
|
||||||
; not even a gah, but kinda!
|
; not even a gah, but kinda!
|
||||||
['env? ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de [evaled_param] indent)
|
['env? ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack [evaled_param] indent)
|
||||||
(cond (marked_env? evaled_param) ['val true]
|
(cond (marked_env? evaled_param) ['val true]
|
||||||
(later? evaled_param) ['marked_array false [['prim_comb recurse env?] evaled_param]]
|
(later? evaled_param) ['marked_array false [['prim_comb recurse env?] evaled_param]]
|
||||||
true ['val false]
|
true ['val false]
|
||||||
@@ -391,34 +412,34 @@
|
|||||||
(needs_params_val_lambda bool?)
|
(needs_params_val_lambda bool?)
|
||||||
(needs_params_val_lambda str-to-symbol)
|
(needs_params_val_lambda str-to-symbol)
|
||||||
(needs_params_val_lambda get-text)
|
(needs_params_val_lambda get-text)
|
||||||
['array? ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de [evaled_param] indent)
|
['array? ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack [evaled_param] indent)
|
||||||
(cond
|
(cond
|
||||||
(later? evaled_param) ['marked_array false [['prim_comb recurse array?] evaled_param]]
|
(later? evaled_param) ['marked_array false [['prim_comb recurse array?] evaled_param]]
|
||||||
(marked_array? evaled_param) ['val true]
|
(marked_array? evaled_param) ['val true]
|
||||||
true ['val false]
|
true ['val false]
|
||||||
)
|
)
|
||||||
)) array?]]
|
)) array?]]
|
||||||
['array ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de evaled_params indent)
|
['array ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack evaled_params indent)
|
||||||
['marked_array true evaled_params]
|
['marked_array true evaled_params]
|
||||||
)) array]]
|
)) array]]
|
||||||
['len ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de [evaled_param] indent)
|
['len ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack [evaled_param] indent)
|
||||||
(cond (later? evaled_param) ['marked_array false [['prim_comb recurse len] evaled_param]]
|
(cond (later? evaled_param) ['marked_array false [['prim_comb recurse len] evaled_param]]
|
||||||
(marked_array? evaled_param) ['val (len (.marked_array_values evaled_param))]
|
(marked_array? evaled_param) ['val (len (.marked_array_values evaled_param))]
|
||||||
true (error (str "bad type to len " evaled_param))
|
true (error (str "bad type to len " evaled_param))
|
||||||
)
|
)
|
||||||
)) len]]
|
)) len]]
|
||||||
['idx ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de [evaled_array evaled_idx] indent)
|
['idx ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack [evaled_array evaled_idx] indent)
|
||||||
(cond (and (val? evaled_idx) (marked_array? evaled_array) (.marked_array_is_val evaled_array)) (idx (.marked_array_values evaled_array) (.val evaled_idx))
|
(cond (and (val? evaled_idx) (marked_array? evaled_array) (.marked_array_is_val evaled_array)) (idx (.marked_array_values evaled_array) (.val evaled_idx))
|
||||||
true ['marked_array false [['prim_comb recurse idx] evaled_array evaled_idx]]
|
true ['marked_array false [['prim_comb recurse idx] evaled_array evaled_idx]]
|
||||||
)
|
)
|
||||||
)) idx]]
|
)) idx]]
|
||||||
['slice ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de [evaled_array evaled_begin evaled_end] indent)
|
['slice ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack [evaled_array evaled_begin evaled_end] indent)
|
||||||
(cond (and (val? evaled_begin) (val? evaled_end) (marked_array? evaled_array) (.marked_array_is_val evaled_array))
|
(cond (and (val? evaled_begin) (val? evaled_end) (marked_array? evaled_array) (.marked_array_is_val evaled_array))
|
||||||
['marked_array true (slice (.marked_array_values evaled_array) (.val evaled_begin) (.val evaled_end))]
|
['marked_array true (slice (.marked_array_values evaled_array) (.val evaled_begin) (.val evaled_end))]
|
||||||
true ['marked_array false [['prim_comb recurse slice] evaled_array evaled_idx evaled_begin evaled_end]]
|
true ['marked_array false [['prim_comb recurse slice] evaled_array evaled_idx evaled_begin evaled_end]]
|
||||||
)
|
)
|
||||||
)) slice]]
|
)) slice]]
|
||||||
['concat ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de evaled_params indent)
|
['concat ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack evaled_params indent)
|
||||||
(cond (foldl (lambda (a x) (and a (and (marked_array? x) (.marked_array_is_val x))) true evaled_params) ['marked_array true (lapply concat (map (lambda (x)
|
(cond (foldl (lambda (a x) (and a (and (marked_array? x) (.marked_array_is_val x))) true evaled_params) ['marked_array true (lapply concat (map (lambda (x)
|
||||||
(.marked_array_values x))
|
(.marked_array_values x))
|
||||||
evaled_params))]
|
evaled_params))]
|
||||||
@@ -442,7 +463,7 @@
|
|||||||
(needs_params_val_lambda >=)
|
(needs_params_val_lambda >=)
|
||||||
|
|
||||||
; these could both be extended to eliminate other known true values except for the end and vice-versa
|
; these could both be extended to eliminate other known true values except for the end and vice-versa
|
||||||
['and ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de evaled_params indent)
|
['and ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack evaled_params indent)
|
||||||
((rec-lambda inner_recurse (i)
|
((rec-lambda inner_recurse (i)
|
||||||
(cond (= i (- (len evaled_params) 1)) (idx evaled_params i)
|
(cond (= i (- (len evaled_params) 1)) (idx evaled_params i)
|
||||||
(later? (idx evaled_params i)) ['marked_array false (cons ['prim_comb recurse and] (slice evaled_params i -1))]
|
(later? (idx evaled_params i)) ['marked_array false (cons ['prim_comb recurse and] (slice evaled_params i -1))]
|
||||||
@@ -451,7 +472,7 @@
|
|||||||
) 0)
|
) 0)
|
||||||
)) and]]
|
)) and]]
|
||||||
; see above for improvement
|
; see above for improvement
|
||||||
['or ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de evaled_params indent)
|
['or ['prim_comb (parameters_evaled_proxy nil (lambda (recurse de env_stack evaled_params indent)
|
||||||
((rec-lambda inner_recurse (i)
|
((rec-lambda inner_recurse (i)
|
||||||
(cond (= i (- (len evaled_params) 1)) (idx evaled_params i)
|
(cond (= i (- (len evaled_params) 1)) (idx evaled_params i)
|
||||||
(later? (idx evaled_params i)) ['marked_array false (cons ['prim_comb recurse or] (slice evaled_params i -1))]
|
(later? (idx evaled_params i)) ['marked_array false (cons ['prim_comb recurse or] (slice evaled_params i -1))]
|
||||||
@@ -476,11 +497,11 @@
|
|||||||
(give_up_eval_params slurp)
|
(give_up_eval_params slurp)
|
||||||
(give_up_eval_params get_line)
|
(give_up_eval_params get_line)
|
||||||
(give_up_eval_params write_file)
|
(give_up_eval_params write_file)
|
||||||
['empty_env ['env true [nil]]]
|
['empty_env ['env true nil [nil]]]
|
||||||
nil
|
nil
|
||||||
] root_env]
|
] root_env]
|
||||||
|
|
||||||
partial_eval (lambda (x) (partial_eval_helper (mark x) root_marked_env 0))
|
partial_eval (lambda (x) (partial_eval_helper (mark x) root_marked_env [] 0))
|
||||||
)
|
)
|
||||||
(provide partial_eval strip print_strip)
|
(provide partial_eval strip print_strip)
|
||||||
))
|
))
|
||||||
|
|||||||
Reference in New Issue
Block a user