Pull to refresh

Comments 2

Хочу отметить: почти все советы Джона очень хороши, кроме совета 8, в той его части, что касается Block. Использовать Block для локализации переменных — опасная и в целом вредная практика, так как Block реализует динамическое, а не лексическое связывание. Block — более специальная конструкция, полезная и мощная, но требующая полного понимания, зачем и почему он используется.

Вот доп. ссылки на эту тему

mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs/569#569

mathematica.stackexchange.com/questions/11579/what-are-some-advanced-uses-for-block/11585#11585
В дополнение к предыдущему комментарию: это высказывание «По моему опыту, Block и Module взаимозаменяемы, по крайней мере в 95% случаев, с которыми я сталкиваюсь, но Block, как правило, работает быстрее, а в некоторых случаях With (фактически Block с переменными, доступными лишь для чтения) ещё быстрее.» просто неверно.

Во-первых, Block и Module *не* взаимозаменяемы. Это принципиально разные конструкции с очень различной семантикой. Замена одной на другую приведет в общем случае к существенной разнице в том, как будет выполняться код. Тот факт, что во многих случаях Block будет *вроде бы* работать в 95% случаев, делает ситуацию только хуже, так как создает обширное поле для совершенно неочевидных и трудно-уловимых багов.

Во-вторых, описание With как «Block с переменными, доступными лишь для чтения» весьма далеко от реальности. Если With к чему-то и близок по сематнике, так это к правилам трансформации выражений (Rule, RuleDelayed), но никак не к Block.

Эти ошибки вполне простительны для Джона (являющегося сугубым практиком, чьи примеры остроумного применения Mathematica в самых разных областях вызывают только восхищение, и достигшего в этом больших высот), но их необходимо отметить, чтобы не создавать неправильного понимания и вредных привычек у начинающих пользователей.
Sign up to leave a comment.