Почему в Perl так много магии? - PullRequest
15 голосов
/ 18 февраля 2010

Просматривая страницы perlsub и perlop , я заметил, что там много ссылок на "магию" и "магию" (просто найдите любую из них на предмет "магия") ). Интересно, почему Perl так богат ими?

Некоторые примеры:

print ++($foo = 'zz')            # prints 'aaa'       
printf "%d: %s", $! = 1, $!      # prints '1: Operation not permitted'
while (my $line = <FH>) { ... }  # $line is tested for definedness, not truth
use warnings; print "0 but true" + 1  # "0 but true" is a valid number!

Ответы [ 6 ]

45 голосов
/ 18 февраля 2010

Когда функция Perl описывается как «волшебная»:

Это означает, что эта функция реализованный звездой НБА Мэджик Джонсон. Всякий раз, когда Perl выполняет «магию», это на самом деле отправка вызова RPC к дистанционный приемник, имплантированный в Magic сам. Он вычисляет ответ, и затем отправляет ответное сообщение. Использование мистера Джонсона за все сложные части Perl предоставляет отличную абстракцию слой и упрощает портирование на новый платформ. Это намного проще, чем, скажем, Apache Portable Runtime.

Источник: Perrin на Perl Monks

Это официально! Perl более волшебен.

Хиты из следующих поисков Google:

 25  site:ruby-doc.org     magic
 36  site:docs.python.org  magic
497  site:perldoc.perl.org magic
25 голосов
/ 18 февраля 2010

Magic, на языке Perl - это просто слово, данное атрибутам, применяемым к переменным / функциям, которые позволяют расширить их функциональность. Некоторые из этих функций доступны непосредственно из Perl, а некоторые требуют использования C api.

Прекрасным примером магии является интерфейс tie, который позволяет вам определять собственную реализацию переменной. Каждая операция, которая может быть выполнена для переменной (например, выборка или сохранение значения), подвергается повторной реализации, что позволяет создавать элегантные и логичные синтаксические конструкции, такие как хэш со значениями, хранящимися на диске, которые прозрачно загружаются и сохраняются за кадром.

Магия также может относиться к особым способам поведения некоторых встроенных функций, таким как, например, первый аргумент map или grep может быть либо блоком, либо выражением без выражения:

my @squares = map {$_**2} 1 .. 10;
my @roots   = map sqrt, 1 .. 10;

, который не является поведением, доступным для пользовательских подпрограмм.

Многие другие функции Perl, такие как перегрузка операторов или переменные, которые могут возвращать различные значения при использовании с числовыми или строковыми операторами, реализованы с помощью magic. Контекст также можно рассматривать как магию.

Короче говоря, магия - это любое время, когда конструкция Perl ведет себя не так, как предполагает наивная интерпретация, исключение из правила. Магия, конечно, очень сильна, и ее нельзя использовать без особой осторожности. Магия Джонсон, конечно, участвует в исполнении всей магии (см. Ответ FM), но это выходит за рамки этого объяснения.

14 голосов
/ 18 февраля 2010

Интересно, почему Perl так богат в них.

Чтобы было проще.

Вы обнаружите, что большинство "волшебства" в Perl - это упрощение синтаксиса для общих задач.

13 голосов
/ 18 февраля 2010

Потому что perl всегда D oes W hat I M ean для некоторых значений всегда .

3 голосов
/ 18 февраля 2010

Я думаю (мнение более чем факт), что это связано с точкой зрения органического роста, которую создатель Perl Ларри Уолл имеет с языком Perl.Python - исследование противоположного подхода, стиль которого часто заставляет Perl-хакеров съеживаться от ощущения, что вынужден соответствовать стилистическому режиму.

Некоторые из них связаны с существованием Perlразработан, чтобы быть «эффективным» при написании быстрых скриптов для выполнения Perl * -ish * задач, как во время настенных часов, так и при нажатии клавиш.Отчасти это связано с TMTOWTDI мантрой Perl и его последователей.

Программисты склонны считать, что Perl часто использует «магию», а для некоторых это утомительно.визуальная какофония хаоса и неуважения к порядку (которое восходит к временам компьютера священство в белых лабораторных халатах за стеклянным окном), для других это яркий пример эффективного выполнения задач, если не всегдаочевидно, для новичка или постороннего.

2 голосов
/ 18 февраля 2010

Философия дизайна Perl заключается в том, что простые вещи должны быть простыми. Это звучит хорошо, и в некоторой степени это так. Тем не менее, здесь есть компромисс: превращение каждой простой вещи в одну строку приводит к множеству хаков с особыми случаями для экономии нескольких строк кода. Разные люди имеют разные предпочтения относительно упрощения простых операций в языке по сравнению с упрощением спецификации языка. Perl в одной крайности. Java находится на другом, по крайней мере, среди языков, которые люди фактически используют. Python и C # находятся где-то посередине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...