LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

как/почему без перегрузки обходятся в ракете

Потому же, почему и в Haskell'e. И в Си.

На самом деле есть Swindle: библиотека для Racket с полным CLOS. Соответственно defgeneric и всё такое.

Хотя на вопрос «почему» мне на ЛОРе отвечали. Чтобы не было как в C++, где «s << 2» может пишет в строку, а может умножает на 4. Или фееричное

string s = "Hello" + 2; // работает
string s2 = "Hello";
s2 = s2 + 2; // не работает

Дело в том, что в Scheme есть возможность локального переопределения функций. Поэтому если мне надо работать с матрицами, я лучше напишу with-matrix, который будет разворачиваться в (let ([+ matrix+] [* matrix*]) ...) чем буду глобально переопределять операции суммирования и умножения.

Более того, в своём модуле я могу даже написать (define (+ a b) ...) и пользователь моего модуля сможет использовать мой +. Но он будет делать это осознанно.

Даже твой пример с test (a,b) = a+b. В C++ я не могу получить гарантию, что + вернёт тот же тип, что и аргумент и что + является чистой функцией. И если пользователь моего test не знает, что внутри +, то могут быть неожиданные результаты.

Исходная версия monk, :

как/почему без перегрузки обходятся в ракете

Потому же, почему и в Haskell'e. И в Си.

На самом деле есть Swindle: библиотека для Racket с полным CLOS. Соответственно defgeneric и всё такое.

Хотя на вопрос «почему» мне на ЛОРе отвечали. Чтобы не было как в C++, где «s << 2» может пишет в строку, а может умножает на 4. Или фееричное

string s = "Hello" + 2; // работает
string s2 = "Hello";
s2 = s2 + 2; // не работает

Дело в том, что в Scheme есть возможность локального переопределения функций. Поэтому если мне надо работать с матрицами, я лучше напишу with-matrix, который будет разворачиваться в (let ([+ matrix+] [* matrix*]) ...) чем буду глобально переопределять операции суммирования и умножения.

Более того, в своём модуле я могу даже написать (define (+ a b) ...) и пользователь моего модуля сможет использовать мой +. Но он будет делать это осознанно.

Даже твоё пример с test (a,b) = a+b. В C++ я не могу получить гарантию, что + вернёт тот же тип, что и аргумент и что + является чистой функцией. И если пользователь моего test не знает, что внутри +, то могут быть неожиданные результаты.