Навеяно чьими-то сообщениями в темах про ООП, что прочел давно, но не было времени сформулировать проблему...
Итак предположим, что в нашем языке функции - это объекты, а объекты могут иметь методы. У функций есть специальный метод apply(call, operator(), etc.), который вызывается при вызове функции. В этом случае получается, что методы не могут являться first-class объектами и разновидностью функций, т.к. тогда у них должен быть метод apply, который в свою очередь должен иметь метод apply, который и т.д. и т.д.
Решения у нас могут быть примерно такие:
- или мы делаем как в крестах и получаем не first-class функции/методы, но имеем возможность сделать «объект-функцию»(в том числе через лямбды), если потребуется;
- или мы делаем как в scala и получаем довольно стройную систему, но отказываемся от простой очевидной концепции метода как частного вида функции и, как следствие, от first-class методов;
- или мы делаем «функции» особым видом объектов, который нельзя сделать в обход механизма создания функций(определив для объектов какого-то типа apply или operator());
Я правильно понимаю? Или можно таки разорвать цепочку красиво?