<?php 
namespace eMacros; 
 
class GenericList extends \ArrayObject implements Expression { 
    public function evaluate(Scope $scope) { 
        //empty list 
        if (!isset($this[0])) { 
            throw new \BadFunctionCallException("No operation found."); 
        } 
         
        //determine which function must be called 
        $function = $this[0]->evaluate($scope); 
                 
        if (is_callable($function) && is_object($function)) { 
            $parameters = array(); 
             
            foreach ($this->shift() as $arg) { 
                $parameters[] = $arg->evaluate($scope); 
            } 
     
            return call_user_func_array($function, $parameters); 
        } 
         
        if ($function instanceof Applicable) { 
            return $function->apply($scope, $this->shift()); 
        } 
         
        throw new \UnexpectedValueException(sprintf("Unexpected %s '%s' at the beginning of the list.", 
                                                    substr(strrchr(strtolower(get_class($this[0])), '\\'), 1), 
                                                    $this[0]->__toString())); 
    } 
     
    public function shift() { 
        if (!isset($this[0])) { 
            return; 
        } 
     
        return new self(array_slice($this->getArrayCopy(), 1)); 
    } 
     
    public function __toString() { 
        $sarr = array(); 
         
        foreach ($this as $expr) { 
            $sarr[] = $expr instanceof Expression ? $expr->__toString() : '...'; 
        } 
         
        return '(' . join(' ', $sarr) . ')'; 
    } 
} 
?>
 
 |