>>> Говоря про Perl, в нем все есть строка, либо число. В зависимости
>>> от _контекста_ Perl выбирает, что взять за основу: число или строку.
>>Тут уже выше упоминали RTFM
> И что? К чему ты это сказал? Ты вообще понял фразу: In
> Perl, the operator determines what operation is performed? Давай вместе, оператор.
> определяет. какая. операция. будет. исполнена. Ты это понял? Ты не видишь разницу между контекстом и оператором? Оператор не зависит от контекста. Это не хак и не хинт, это так определено в языке. Или ты имел в виду «в контексте оператора»? Тогда причем тут «выбор основы»?
>>Хотя типизация в перловке предмет долголетних споров и про то, что у перла все же сильная типизация, упоминают намного более авторитетные источники, чем анонимы опеннета. Как впрочем и наоборот.
> Мне лично пофиг кто с кем спорит. Сейчас вот кто-то не может
> ответить по делу, но как лоровское дитя переходит на личности.
Чудило, я тоже вроде как из под анона пишу. Где ты переход на личности углядел? В том, что тот же Рандал Шварц, возможно, будет поавторитетнее группы анонимов опеннета?
>>И что? В питоне тоже все генерируется в рантайме. Динамическая типизация, как она есть.
> Пруф. Без пруфа это пустословие. Где такое же сообщение для Python? Может
> чему выучусь, хотя пистон мне до лампочки.
Пруф чего? Того что int не равен строке?
% python -c 'print 1 == "0"'
False
% python -c 'print 0 == ""'
False
% python -c 'print 0 == "0"'
False
О чем это должно говорить? О слабой типизации питона? Или просто другом подходе?
https://docs.python.org/2/library/stdtypes.html
> Objects of different types, except different numeric types and different string types,
> never compare equal; such objects are ordered consistently but arbitrarily (so that
> sorting a heterogeneous array yields a consistent result).
> Non-identical instances of a class normally compare as non-equal unless the class
> defines the __eq__() method or the __cmp__() method.
Или тебе нужны рантайм сообщения?
% python -c 'print 1+"0"'
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str
% python -c 'print int.__cmp__(1,"")'
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: int.__cmp__(x,y) requires y to be a 'int', not a 'str'
% python -c 'print str.__eq__("0",2)'
NotImplemented
А теперь фокус:
>>> class X(int):... def __add__(self, o): return X(int.__add__(self, int(o)))
...
...
>>> X(2) + 2 + 3
7
>>> X(2) + 2 + "3"
7
>>> X(2) + 2 + "3d"
Traceback (most recent call last):
File "<input>", line 1, in <module>
X(2) + 2 + "3d"
File "<input>", line 2, in __add__
def __add__(self, o): return X(int.__add__(self, int(o)))
ValueError: invalid literal for int() with base 10: '3d'
>>>
оператор внезапно зависит от контекста. Это теперь неявное преобразование?
>>Опять же, выше упоминали RTFM вместе со ссылочкой на код. Конкретно "0 but true" грязный хак на уровне интерпретатора, поэтому приводить его в качестве примера не очень удачная мысль.
> Пфффф. Мужик просто сделал греп по манам, по исходнику перла, ибо фраза
> заезженная. Попробуй вместо "0 but true" использовать "дураки на Волге" и
> эффект не изменится.
% perl -wle 'print 0 == 0 + "дураки на Волге"'
Argument "дураки на Волге" isn't numeric in addition (+) at -e line 1.
>>===
> Ого. Это оператор? Из PHP? Из Python? Из JavaScript? Да. Ведь, в
> Perl его нету! Для сравнения строк нужно юзать "eq", чудо.
Остынь, чудило. Это разделитель цитатируемых кусков текста. Пустые строки между цитатами движок опеннета проглатывает.
>>Это, извините, полиморфизм и не говорит ни о чем. Вроде как даже в хаскеле прокатывает.
> Что?! ПОЛИМОРФИЗМ? В сути динамического приведения типов? Ты серьезно, мээн?
Ты путаешь теплое с мягким. Возможность вызвать фунцию с разными типами аргументов и собственно, реализацию.
http://ideone.com/hiNBFn
#include <iostream>
using namespace std;
int x(int a) {return a + 3;}
int x(double a) {return (int)a;}
int main() {
// your code goes here
std::cout << "Hello, World!\n" << "x(3):" << x(3) << "\nx(3.0):" << x(3.0);
return 0;
}
поэтому и вызов функции в качестве примера ни о чем не говорит.