madlisp/src/Lisp.php

50 lines
1.2 KiB
PHP
Raw Normal View History

2020-05-28 04:55:58 +00:00
<?php
namespace MadLisp;
class Lisp
{
2020-05-28 10:10:00 +00:00
protected Tokenizer $tokenizer;
protected Reader $reader;
protected Evaller $eval;
protected Printer $printer;
2020-05-28 09:49:32 +00:00
2020-05-28 10:10:00 +00:00
public function __construct(Tokenizer $tokenizer, Reader $reader, Evaller $eval, Printer $printer)
2020-05-28 04:55:58 +00:00
{
2020-05-28 10:10:00 +00:00
$this->tokenizer = $tokenizer;
$this->reader = $reader;
$this->eval = $eval;
$this->printer = $printer;
2020-05-28 07:40:54 +00:00
}
public function rep(string $input, Env $env): void
{
2020-05-28 10:10:00 +00:00
$tokens = $this->tokenizer->tokenize($input);
2020-05-28 07:40:54 +00:00
2020-05-28 10:10:00 +00:00
$expressions = $this->reader->read($tokens);
2020-05-28 07:40:54 +00:00
2020-05-28 10:10:00 +00:00
$results = $this->eval->eval($expressions, $env);
2020-05-28 04:55:58 +00:00
2020-05-28 10:10:00 +00:00
$this->printer->print($results);
2020-05-28 04:55:58 +00:00
}
public function register(Env $env): void
{
$env->set('eval', new CoreFunc('eval', 'Evaluate arguments.', 1, -1,
function (...$args) use ($env) {
$results = $this->eval->eval($args, $env);
// Return last evaluated value
return $results[count($results) - 1];
}
));
$env->set('print', new CoreFunc('print', 'Print arguments.', 1, -1,
function (...$args) {
$this->printer->print($args);
return null;
}
));
}
2020-05-28 04:55:58 +00:00
}