Minimize memory allocations by avoiding intermediate objects, sharing underlying buffers, and eliminating unnecessary array operations. This is particularly important in hot code paths and when processing large datasets.

Key strategies:

Example of optimization:

// Before: Creates unnecessary intermediate array
const results: Value[] = []
for (const arg of node.args) {
  results.push(await this.interpretNode(arg, queryable, scope, generators))
}
return results[results.length - 1]

// After: Only compute what's needed
let lastResult: Value
for (const arg of node.args) {
  lastResult = await this.interpretNode(arg, queryable, scope, generators)
}
return lastResult