ml_eval($a, $env), $expr); // If the first item is a function, call it $fn = $expr[0] ?? null; if ($fn && $fn instanceof Closure) { $args = array_slice($expr, 1); return $fn(...$args); } } elseif (ml_is_symbol($expr)) { return $env->get(ml_strip_symbol($expr)); } return $expr; } function ml_print($a): string { if ($a instanceof Closure) { return ''; } elseif (is_array($a)) { return '(' . implode(' ', array_map('ml_print', $a)) . ')'; } elseif ($a === true) { return 'true'; } elseif ($a === false) { return 'false'; } elseif ($a === null) { return 'null'; } elseif (ml_is_symbol($a)) { return ml_strip_symbol($a); } elseif (is_string($a)) { return '"' . $a . '"'; } else { return $a; } } function ml_rep(string $input, Env $env): string { $expressions = ml_read($input); $results = array_map(fn ($expr) => ml_eval($expr, $env), $expressions); return implode(" ", array_map('ml_print', $results)); }