А не обращали ли вы внимания на такой любопытный факт. Мы можем определять свои функции eval, которые специализируют, или «затирают» способы обработки входных данных, примерно таким вот образом
myEval1 = function(expression){
if(somePredicat1(expression)) return doSomething1
eval(expression)
}
//далее
myEval2 = function(expression){
if(somePredicat2(expression)) return doSomething2
myEval1(expression)
}
eval<-Eval1<-Eval2
— тут eval является верхним класом, анологичным Object во многих яп, а expression - сообщением. Тут только нет диспетчеризации на уровне интерпретатора, но это, тем не менее, семантика Ъ-ООП языков в первозданном виде! Eval — это объект. Правильнее его было бы назвать Evaluator. Все его наследники — объекты. Если, скажем, со старых лиспов снять мишуру, они будут ООП языками! И очевидно, что в основе их именно ООП-подход, а вовсе не ФП, как это принято считать. Просто тогда не было этого слова.Под мишурой я тут понимаю в первую очередь quote. На самом деле, я думаю, именно это соображение повлияло на идеи Алана Кея. За основу он брал не Eval, а фекспры, но это, тащемта, анлогично. Он говорил что-то типа: «я много раз задавал вопрос, почему нужно энергично вычислять аргументы? почему бы все не вычислять принимающей стороной? И никогда не получал на это внятного ответа...» Если бы у нас все выражения выполнялись лениво, у нас бы не было необходимости что-либо квотировать, однако мы не потеряли бы в выразительности. Функция quote — является пятым колесом. Если бы ее не было, нам достаточно было бы для всех вычислений что-то типа ULAMBDA и НЕквотированных строк (или списков), которые в контексте ООП — сообщения. Мы смогли бы выбросить из элементарного лиспа lambda и quote и eval(заменив его ULAMBDA) абсолютно безболезненно, а так же еще кучу связаной с этим мишуры. Лисп Маккарти — это не простой концептуально язык, он попадает под бритву Оккама!