| 
<?phpnamespace 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) . ')';
 }
 }
 ?>
 |