void OpHead::Apply(Expression *expression, Calculator *calculator, int32 recursions) { if(expression->LeafCount() != 1) throw ArgumentException("Head expects 1 argument."); Expression *leaf = expression->Leaf(0); if(leaf->IsAtom()) { Atom *atom = leaf->AtomHead(); expression->MoveNotCloned(ExprPtr(new Expression(atom->AtomName()))); } else { ExprPtr head(leaf->Head()->Clone()); expression->MoveNotCloned(head); } }
Expression *FunctionOperator::Group(PartsIterator part) { if(part.IsFirst()) throw ParseException("No operand on left side of infix operator."); if(part.IsLast()) throw ParseException("No operand on right side of infix operator."); PartsIterator prevItr = part.Prev(); PartsIterator nextItr = part.Next(); Expression *head = (*prevItr)->Group(prevItr); Expression *leaves = (*nextItr)->Group(nextItr); leaves->Head(head); prevItr.Erase(); nextItr.Erase(); delete this; *part = leaves; return leaves; }