Eval doesn't do any good unless you want to parse a string to represent the equations - and even then you need some way to represent the equations as data (i.e. be able to manipulate it).
Your misunderstanding is to assume that I know the equation. I don't know the equation, I know one or more forms of the equation that I'd like to solve for (i.e. find the coefficients and r-square values). In your example, you are using of: x = "23 + b" - meaning that the a0 coefficient is 23 and the a1 coefficient is 1. The regression is designed to input some numbers [0,23], [1,24], [2,25], and figure out the coefficients (23,1). That just happens to be a simple linear equation that can be done without resorting to closures. However, what if wanted to solve the coefficients for:
y = a0 + a1*x + a2*x*x + a3*x*x*x
and just had a bunch of (x,y) data points. Or how about throwing in some additional exogenous variables:
y = a0 + a1*x + a2*z + a3*x*z + a4*x*x + a5*z*z
Now, how do you propose to solve for these coefficients given a series of data points? Having done this in a version of Pascal that does not have closures, my solution was to build a parser that allowed you to represent the form of the equation as a string. Problem is that a parser becomes a mini-language and occupies a good amount of space and requires an attention to detail. Whereas, by using closures in Python or code blocks in Smalltalk, I can sling together equation forms (i.e. lambda functions or anonymous functions).