public SubLList assoc(SubLObject item, BinaryFunction test, UnaryFunction key) { SubLObject currentItem = null; SubLList result = SubLNil.NIL; SubLListListIterator iter = null; Resourcer resourcer = Resourcer.getInstance(); SubLList curAssoc; try { iter = resourcer.acquireSubLListListIterator(this); while (iter.hasNext()) { curAssoc = iter.nextSubLObject().toList(); if (SubLNil.NIL != test.processItem(item, key.processItem(curAssoc.first()))) { result = curAssoc; break; } } } finally { resourcer.releaseSubLListListIterator(iter); } return result; }
private final SubLList mapResult( SubLFunction function, SubLObject[] moreLists, boolean returnConsedResults) { ArrayList<SubLObject> results = new ArrayList<SubLObject>(); SubLListListIterator[] iterators = new SubLListListIterator[1 + moreLists.length]; // @todo get rid of call to new -APB int iteratorCount = iterators.length; SubLObject[] args = null; Resourcer resourcer = Resourcer.getInstance(); try { args = resourcer.acquireSubLObjectArray(iteratorCount); iterators[0] = resourcer.acquireSubLListListIterator(this); for (int i = 0, size = moreLists.length; i < size; i++) { iterators[i + 1] = resourcer.acquireSubLListListIterator(moreLists[i].toList()); } SubLListListIterator iter = null; SubLObject curResult = null; while (true) { for (int i = 0; i < iteratorCount; i++) { iter = iterators[i]; if (!iter.hasNext()) { return SubLObjectFactory.makeList(results); } if (iter.isNextImproperElement()) { Errors.error("Unexpected improper list: " + ((i == 0) ? this : moreLists[i - 1])); } args[i] = iter.nextSubLObject(); } curResult = Functions.funcall(function, args); if (results != null) { results.add(curResult); } } } finally { resourcer.releaseSubLObjectArray(args); for (int i = 0, size = iterators.length; i < size; i++) { resourcer.releaseSubLListListIterator(iterators[i]); } } }
public String toString() { if (PrintLow.shouldPrintAtCurrentLevel()) { final SubLObject oldLevel = PrintLow.maybeIncreasePrintLevel(); try { if (this == SubLNil.NIL) { return "NIL"; } SubLListListIterator iter = null; Resourcer resourcer = Resourcer.getInstance(); try { final StringBuilder buf = new StringBuilder("("); final boolean checkLength = PrintLow.controlPrintLength(); final int printLength = PrintLow.maxPrintLength(); int counter = 0; boolean terminatedEarly = false; iter = resourcer.acquireSubLListListIterator(this); while (iter.hasNext() && (!iter.isNextImproperElement())) { buf.append(iter.next()); if (checkLength) { counter++; if (counter >= printLength) { buf.append(" ... "); terminatedEarly = true; break; } } if (iter.hasNext()) { buf.append(" "); } } if (!terminatedEarly && iter.isNextImproperElement()) { buf.append(" . ").append(iter.getDottedElement()); } buf.append(")"); return buf.toString(); } finally { resourcer.releaseSubLListListIterator(iter); } } finally { PrintLow.maybeDecreasePrintLevel(oldLevel); } } else { return "( # )"; } }
public int hashCode(int currentDepth) { if (currentDepth < MAX_HASH_DEPTH) { SubLListListIterator iter = null; Resourcer resourcer = Resourcer.getInstance(); int hashCode = 0; try { int index = 0; iter = resourcer.acquireSubLListListIterator(this); while (iter.hasNext() && (!iter.isNextImproperElement()) && (index++ < MAX_HASH_LENGTH)) { hashCode ^= iter.nextSubLObject().hashCode(currentDepth + 1); index++; } if (iter.isNextImproperElement()) { hashCode ^= iter.getDottedElement().hashCode(currentDepth + 1); } return hashCode; } finally { resourcer.releaseSubLListListIterator(iter); } } else { return DEFAULT_EXCEEDED_HASH_VALUE; } }
public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } SubLObject sublObj = (SubLObject) obj; if (!sublObj.isList()) { return false; } SubLList otherCons = sublObj.toList(); SubLListListIterator iter1 = null; SubLListListIterator iter2 = null; Resourcer resourcer = Resourcer.getInstance(); try { iter1 = resourcer.acquireSubLListListIterator(this); iter2 = resourcer.acquireSubLListListIterator(otherCons); while (iter1.hasNext() && (!iter1.isNextImproperElement())) { if ((!iter2.hasNext()) || (iter2.isNextImproperElement())) { return false; } if (!iter1.next().equals(iter2.next())) { return false; } } if (iter1.isNextImproperElement()) { if (iter2.isNextImproperElement()) { return iter1.getDottedElement().equals(iter2.getDottedElement()); } return false; } else if (iter2.hasNext()) { // iter1 is prefix of iter2 case return false; } // they should be equal at this point return true; } finally { resourcer.releaseSubLListListIterator(iter1); resourcer.releaseSubLListListIterator(iter2); } }