madlisp/src/LispFactory.php

48 lines
1.6 KiB
PHP
Raw Normal View History

2020-06-17 10:24:15 +00:00
<?php
namespace MadLisp;
class LispFactory
{
public function make(bool $safemode = false): Lisp
2020-06-17 10:24:15 +00:00
{
$tokenizer = new Tokenizer();
$reader = new Reader();
$printer = new Printer();
$eval = new Evaller($tokenizer, $reader, $printer, $safemode);
2020-06-17 10:24:15 +00:00
// Root environment
$env = new Env('root');
// Register core functions
(new Lib\Core($tokenizer, $reader, $printer, $eval, $safemode))->register($env);
2020-10-17 07:47:30 +00:00
2020-06-17 10:24:15 +00:00
// Register core libraries
(new Lib\Collections())->register($env);
(new Lib\Compare())->register($env);
2020-06-19 03:50:44 +00:00
(new Lib\Json())->register($env);
2020-06-17 10:24:15 +00:00
(new Lib\Math())->register($env);
2020-10-18 07:33:27 +00:00
(new Lib\Regex())->register($env);
2020-06-17 10:24:15 +00:00
(new Lib\Strings())->register($env);
(new Lib\Time())->register($env);
(new Lib\Types())->register($env);
// Register unsafe libraries if not in safemode
if (!$safemode) {
(new Lib\Database())->register($env);
(new Lib\Http())->register($env);
(new Lib\IO())->register($env);
2020-06-17 10:24:15 +00:00
}
$lisp = new Lisp($tokenizer, $reader, $eval, $printer, $env);
2020-06-17 10:24:15 +00:00
// Add some built-in macros
$lisp->readEval('(def defn (macro (name args body) (quasiquote (def (unquote name) (fn (unquote args) (unquote body))))))');
$lisp->readEval('(def defmacro (macro (name args body) (quasiquote (def (unquote name) (macro (unquote args) (unquote body))))))');
// Separate environment for user-defined stuff
$lisp->setEnv(new Env('user', $env));
return $lisp;
2020-06-17 10:24:15 +00:00
}
}