Packages
kirala_l4u
0.1.1
An embedded lisp interpreter based on the gleam implementation of MAL lisp.
Current section
Files
Jump to
Current section
Files
src/l4u@l4u_obj.erl
-module(l4u@l4u_obj).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([process_get_env/1, generate_new_l4u_obj/2]).
-export_type([l4u_obj/0]).
-type l4u_obj() :: {l4u_obj,
binary(),
l4u@sys_bridge:pid_(),
fun(() -> l4u@l4u_type:env()),
fun((list(l4u@l4u_type:expr())) -> {ok, l4u@l4u_type:expr()} |
{error, binary()}),
fun((binary()) -> {ok, list(l4u@l4u_type:expr())} | {error, binary()}),
fun((l4u@l4u_type:expr()) -> binary())}.
-spec process_get_env(l4u@sys_bridge:pid_()) -> l4u@l4u_type:env().
process_get_env(Pid) ->
l4u@process:get_env(Pid).
-spec generate_new_l4u_obj(binary(), fun(() -> l4u@l4u_type:env())) -> l4u_obj().
generate_new_l4u_obj(Name, Initializer) ->
_assert_subject = l4u@process:new_process(Initializer),
{ok, Pid} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"l4u/l4u_obj"/utf8>>,
function => <<"generate_new_l4u_obj"/utf8>>,
line => 53})
end,
{l4u_obj,
Name,
Pid,
fun() -> l4u@process:get_env(Pid) end,
fun(Exprs) ->
F = fun(Env) ->
_assert_subject@1 = l4u@l4u_core:eval(Exprs, undefined, Env),
{with_env, Rexpr, New_env} = case _assert_subject@1 of
{with_env, _, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail@1,
module => <<"l4u/l4u_obj"/utf8>>,
function => <<"generate_new_l4u_obj"/utf8>>,
line => 62})
end
end,
case l4u@process:exec(Pid, F) of
{ok, Expr} ->
{ok, Expr};
{error, Err} ->
{error, Err}
end
end,
fun(S) ->
F@1 = fun(Env@1) ->
Exprs@1 = l4u@l4u_core:read(S, Env@1),
{with_env, {list, Exprs@1}, Env@1}
end,
case l4u@process:exec(Pid, F@1) of
{ok, {list, Rexprs}} ->
{ok, Rexprs};
{error, Err@1} ->
{error, Err@1};
Unhandable ->
l4u@sys_bridge_ffi:throw_err(
<<"unhandable exec error in l4u_obj: read"/utf8>>
),
{error, <<"unhandable"/utf8>>}
end
end,
fun(Expr@1) -> l4u@l4u_core:print(Expr@1) end}.