Здравствуйте, samius, Вы писали:
S>>>Во всех известных мне языках (их не так много) вряд ли пользуются ТВОИМ определением чистоты. ARK>>"pure" функция в D может в некоторых случаях делать ввод-вывод. Хотя в википедии написано, что pure function не может делать ввод-вывод. S>Ну и может, что из этого? Это не значит, что твое определение известно разработчикам D.
Ну, разработчики D как минимум не используют определение чистоты из википедии.
На мой взгляд, тот подход, который у них, вполне соответствует моему пониманию чистоты. Впрочем, я не настаиваю, это для меня не очень важно. Важнее отказ от википедийного определения.
S>>>Какой вообще смысл в проверки чистоты виртуальной машиной, если виртуальная машина может сделать грязным даже пустой файл/лист без функций вовсе? ARK>>Это не "проверка чистоты", а демонстрация как минимум неполноты определения чистоты из википедии, если оно претендует на статус формального определения. S>Какое отношение к чистоте функции имеет твоя демонстрация грязного вычислителя?
Это не демонстрация грязного вычислителя. Это демонстрация влияния окружения. Отношение к определению чистоты оно имеет самое прямое, поскольку это определение непосредственно опирается на эффекты окружения.
S>>>Немного не так. Я смотрю на контракт, чист ли он? Если синус отличается от своего контракта, то это проблема частной реализации синуса, а не контракта. Если это так — возьму другой. ARK>>Под словом "контракт" ты понимаешь здесь сигнатуру конкретной функции, описание конкретной функции или что-то иное? S>В том числе сигнатуру, описание, не портит ли функция GetLastError()?
Функций в мире много. Ты всегда проверяешь все инварианты всех функций? Соответствует ли название функции тому, что она делает? Не перепутаны ли местами x и y в функции DrawPoint?
Или, может, ты доверяешь сигнатуре и/или документации?
S>>>Ну как, ты же судишь по виртуальной машине! ARK>>Нет, я использую виртуальную машину для демонстрации того, что определение чистоты из википедии при написании кода является не слишком полезным. Оно неформальное и общего характера. S>Так это лишь пример того, что чистота функции не распространяется автоматом на вычислитель.
Это окружение, а не вычислитель. Если бы это был вычислитель, то и в С все функции были бы чистыми. Окружение "работает" всегда, и до вычислителя (если он есть), и во время, и после.
S>>>А в какой момент action получит строку для вывода, сгенерированную в рантайме? ARK>>"Сгенерированную в рантайме" — это возвращенную в рантайме другим грязным action, который сгенерирован функцией, например, "scanf"? Ну, в соответствующий момент в рантайме и получит. Не очень понял этого вопроса. Все как в хаскеле же. S>Нет, не как в хаскеле. В хаскеле генерация действия отделена от его выполнения. Это и позволяет кэшировать результаты IO функций, и потом выполнять их.
Ты пока не продемонстрировал этого отделения. То, что ты продемонстрировал, может быть повторено на любом грязном императивном языке.
UPD. ОК, я подумал и соглашусь, что отделение в каком-то смысле есть. Но, на мой взгляд, это отделение эквивалентно созданию обертки и по форме, и по сути — просто обертка создается внутри, а не снаружи.