mirror of
https://github.com/peklaiho/madlisp.git
synced 2024-11-22 21:35:03 +00:00
48 lines
1.5 KiB
PHP
48 lines
1.5 KiB
PHP
<?php
|
|
/**
|
|
* MadLisp language
|
|
* @link http://madlisp.com/
|
|
* @copyright Copyright (c) 2020 Pekka Laiho
|
|
*/
|
|
|
|
namespace MadLisp;
|
|
|
|
use Closure;
|
|
|
|
class CoreFunc extends Func
|
|
{
|
|
protected string $name;
|
|
protected int $minArgs;
|
|
protected int $maxArgs;
|
|
|
|
public function __construct(string $name, string $doc, int $minArgs, int $maxArgs, Closure $closure)
|
|
{
|
|
parent::__construct($closure, $doc);
|
|
|
|
$this->name = $name;
|
|
$this->minArgs = $minArgs;
|
|
$this->maxArgs = $maxArgs;
|
|
}
|
|
|
|
public function call(array $args)
|
|
{
|
|
$this->validateArgs(count($args));
|
|
|
|
return ($this->closure)(...$args);
|
|
}
|
|
|
|
private function validateArgs(int $count)
|
|
{
|
|
if ($this->minArgs == $this->maxArgs && $count != $this->minArgs) {
|
|
throw new MadLispException(sprintf("%s requires exactly %s argument%s", $this->name, $this->minArgs,
|
|
$this->minArgs == 1 ? '' : 's'));
|
|
} elseif ($count < $this->minArgs) {
|
|
throw new MadLispException(sprintf("%s requires at least %s argument%s", $this->name, $this->minArgs,
|
|
$this->minArgs == 1 ? '' : 's'));
|
|
} elseif ($this->maxArgs >= 0 && $count > $this->maxArgs) {
|
|
throw new MadLispException(sprintf("%s requires at most %s argument%s", $this->name, $this->maxArgs,
|
|
$this->maxArgs == 1 ? '' : 's'));
|
|
}
|
|
}
|
|
}
|