Нет видимых символов. Вообще. Есть видимая при определённых методах отображения символов интерпретация. Потому
>Нормальный язык не может задействовать их в своем синтаксисе
необосновано. Обьективно - язык может задействовать всё, что угодно - лишь бы был однозначный способ это прочесть и приемлемо-удобный способ это написать. Всё остальное - вопрос привычки.
>Напиши два уровня if-else вперемежку с while на одной строке
line='if True:\n if True:\n print "Ok"\n else:\n while True:\n print "Not Ok"\nelse:\n print "Ok again"'
А вообще, пока ехал понял вот что(применяя идеи Раскина про дизайн интерфейсов - т.к. синтаксис языка _является_ интерфейсом для программера):
Многие синтаксические элементы (в том числе начало/конец блока({}), конец выражения(;), "операторы подстановки"($%&*), '\' для продолжения на следующей строке) - _не_ _имеют_ отношения к обьектам решаемой программистом задачи. По этой причине для сознания любого достаточно опытного программиста они будут _невидимы_, к.т. локус внимания оного прикладная задача, а не синтаксис языка.
Неизбежный вывод - в грамотно спроектированом синтаксисе/интерфейсе эти символы _должны_ быть невидимы. Следовательно синтаксис языка _должен_ использовать "невидимые" символы для синтаксического мусора - чтобы последний меньше отвлекал внимание программистов от прикладной задачи.
Продолжая тему: то же относится к записи вызова функций function(arguments) - список аргументов функции не является обьектом прикладной области, потому его ограничители не должны быть видимы.
На этом изложение данной мысли заканчиваю, т.к. очевидное (и возможно неизбежное) следствие из последнего параграфа - необходимость выведения и проверки типов и curry-зации функций, что есть темой для отдельной священной войны:-)
В Haskell, кстати, табуляция играет ту же роль что и в питоне, только там это опционально и можно определять границы блоков явно. Это похоже на более правильный поход чем у питона. Но, в любом случае, как существенный недостаток питона я бы необходимую табуляцию расценивать не стал.
И ещё - как показали комменты, никто из противников perl c perl не знаком совсем. :))
>Спасибо, я там уже был - лучше по хаскелю почитаю:-)
"быть" мало - надо бы почитать:)
>Тормозишь. Всем пофиг как в твоём редакторе выглядят пробелы в началах строк. Лишь бы в файле было правильно.
Не Щ-editor мне не нравится, а в других редакторах не получается заставить вместо пробела рисовать Щ (и только если пробелы - ведущие).:)
>Мосье накогда не видел не-текстовых исходников? Мне приходилось.
Я ж и говорю - поподробнее, плиз:) Потому как я - не видел:)
>Кроме того, даже поддержка plaintext-а себе рознь. Часто ли ты пишешь в редакторе, не умеющем (например) искать соответствующие скобки?
Ну и как это связано: исходный текст программ и "редактор, умеющий искать соотв. скобки"? Ты опять редактор приплетаешь, как неотъемлемую часть текста программы?:)
> line='if True:\n if True:\n print "Ok"\n else:\n while True:\n print "Not Ok"\nelse:\n print "Ok again"'
Круто и очень читабельно. Только этот пример абсолютно не проходит компиляцию, к сожалению. И мы прекрасно знаем почему. А именно, потому, что Питон не предназначен для передачи в широко распространных медиумах, таких как форумы, где значимая для этого языка информация теряется с фатальным исходом (без возможности востановления). В языках с нормальным синтаксисом такого не происходит, значимая информация не теряется, и существует способ востановления (indent). Впрочем, всё это уже было не раз сказано.
Кроме того, использование "\n" в этом примере не годится, так как практически нигде (скажем в шелле) это не интерпретируется так как ты хотел бы.
Если ты выведешь его клиенту для "прочтения" в любом приличном текстовом читателе его читаемость сильно повысится. Попробуй сказать print line - он отлично читается.
>этот пример абсолютно не проходит компиляцию, И мы прекрасно знаем почему
Потому что я забыл поставить "preformatted text" при отправке текста. Кто мне виноват?
>таких как форумы
написаные людьми, убежденными в том, что они лучше знают, что можно выбросить из введенного клиентом текста.
>В языках с нормальным синтаксисом такого не происходит
В форумах с правильной обработкой переданого - тоже:-)
По правде говоря, текст программы есть сложная структура(дерево, что ли) записаная с использованием определённого "кода". Естественно, в средах, выбрасывающих часть этого кода, передача невозможна без определённого шаманства. Для питона внутри html-я дополнительно нужен <pre>.
Кстати, если ты проделаешь тот же трюк с форумом с текстом любой программы, использующий для каких-то целей несколько пробелов внутри строки, она так же невосстановимо испортится. Но ты об этом узнаешь не по ошибке разбора, а по неправильным результатам работы. Что может быть намного хуже. Пример для C: 'char *x=" "'; x[2]=1;' в _лучшем_ случае упадёт в корку.
>чем отличется a=b и a=$b
Тем, что первое компилится без ошибок?
perl -e '$b=2 ; a=$b;'
Can't modify constant item in scalar assignment at -e line 1, at EOF
Execution of -e aborted due to compilation errors.
> Если ты выведешь его клиенту для "прочтения" в любом приличном текстовом читателе
То есть всё-таки код намертво привязан к редактору, и отдельно от него обсуждению не подлежит. Понял. А к какому именно? Слышал, что Visual Studio хорош, и кнопочки там красивые.
> Попробуй сказать print line - он отлично читается.
Значит просто код текстом я не могу передать, его надо кодировать перед посылкой _любой_ программы. Хороший себе бинарный язык... Кстати, если бы ты использовал "\t" наряду с "\n" вместо начальных пробелов в своём примере, то хотя бы одной проблемой (из трех) было бы меньше.
> написаные людьми, убежденными в том, что они лучше знают, что можно выбросить из введенного клиентом текста.
Сколько еще примеров надо привести, чтобы было понятно, что сохранение нетронутым количества невидимых знаков не является нормой.
Это как если бы при телефонном разговоре нормой являлось бы подсчет пауз. Два отступа (2 секунды умноженные на 4) - один смысл, три отступа - другой.
> Кстати, если ты проделаешь тот же трюк с форумом с текстом любой программы, использующий для каких-то целей несколько пробелов внутри строки
Поправлю тебя: не внутри строки (синтаксиса языка), а внутри стринга (данных). Может для тебя будет откровением, но в языках с хорошо продуманным дизайном (Питон не является таким) никогда не требуется более одного смыслового пробела; существует множество других записей, специально решающих эту проблему, например "\040" в стринге.
В том-то и дело, что Питон не дает никаких возможностей разрешить ни один из своих двух фатальных дефектов - значимые начальные пробелы и невозможность обозначить границы блока.
Зачем же так мучать питониста (не ругайте пианиста, он играет как может). Тем более, что в контексте данной новости ты не совсем прав. В Perl 5, $ или @ с последующим var[] или var{} выполняют некую функцию, а в Perl 6 - уже нет. Скалярный или списочный контекст определяется по другому окружению, а иногда и вовсе откладываются во времени. Правда операторы приведения ${ ... }, @{ ... }, %{ ... } остались.
Наверное, более правильно всё же назвать $@% частью variable namespace, когда речь идет о $var, а не операторами.
Я кажется догадываюсь, какой редактор лучше всего использовать для текстов программ на пайтоне: что-то типа Excel или OOCalc (одинарный лгический отступ - одна ячейка) - значущее форматирование не потеряется ни в HTML формате, ни даже в CSV:)))
"Values are usually referred to by name, or through a named reference. The first character of the name tells you to what sort of data structure it refers."
"Scalar values are always named with '$', even when referring to a scalar that is part of an array or a hash. The '$' symbol works semantically like the English word "the" in that it indicates a single value is expected."
"Entire arrays (and slices of arrays and hashes) are denoted by '@', which works much like the word "these" or "those" does in English, in that it indicates multiple values are expected."
В принципе, признаю, что немного прогнал: в perl $ - не совсем то же самое, что в sh/bash/tcl:)
Который раз повторяю: ты не можешь его передать средствами, искажающими его синтаксические конструкции. Таких распространённых средств аж 1(класс) - всякие sgml-и (возможно я что-то упустил, например твой вим с s/ \+/ /:-)
>Сколько еще примеров надо привести, чтобы было понятно, что сохранение нетронутым количества невидимых знаков не является нормой.
Повторяю: я легко могу написать "форум", убирающий {}. После этого окажется, что синтаксис большинства языков программирования имеет 2 фатальных недостатка - { и }.
Это проблема _не_ языков, а писателя обработчика. Да, indent-синтаксис добавляет 1 проблему их писателям - необходимость оставить неизменными 3 символа. Совершенно неподьемная задача;-)
>при телефонном разговоре нормой являлось бы подсчет пауз
Известно, что внимательному слушателю длина пауз сообщает определённую информацию.
>в языках с хорошо продуманным дизайном никогда не требуется более одного смыслового пробела
1. Обоснование обратного было выше. 2. Несколько пробелов в _данных_, которые ты назвал "стрингами" - вполне корректное требование.
>ни один из своих двух фатальных дефектов
Есть подозрение, что эти дефекты фатальны для каких-то других языков:-) - они играют не последнюю роль в росте популярности питона.
Может занять некоторое время, чтобы произошел ментальный сдвиг. Просто абсолютно всё объекты. И $а может в себе содержать объект любого типа, Str, Array, Hash, Int, Pair, Person. А @а может содержать лишь объект Array, %а - лишь Hash.
> Таких распространённых средств аж 1(класс) - всякие sgml-и (возможно я что-то упустил)
Ты много чего упустил. Все публикационные языки, а не только sgml игнорируют повторяющийся whitespace, скажем TeX, Postscript. Это же относится к неэлектронным обработчикам художественного текста (печатные станки), там вообще нет литер для невидимых символов. Повторяющийся whitespace игнорируется во всех текстовых коммандно-ориентированных протоколах, начиная с коммандной строки шелла, и заканчивая smtp/ftp/irc.
Питон нагло нарушает общепринятые нормы и использует whitespace в крайне извращенной форме, не предоставляя никакой нормальной альтернативы. Причем проблем именно две, отсутствие необходимых символов (ограничителей) и присутствие символов использующихся не по назначению.
> 1. Обоснование обратного было выше.
Неправда твоя. При надобности, программа на C всегда может быть передана без потерь через такие носители, программа на Питон - никоим образом нет.
> Известно, что внимательному слушателю длина пауз сообщает определённую информацию.
Уговорил, на досуге попробую натренироваться, пока не наловчусь безошибочно отличать 5-и секундные паузы в разговоре от 6-и секундных. Следующим этапом будет понять семантическую разницу и тайны тао.
> играют не последнюю роль в росте популярности питона
Так я же с этим не спорю. Для тех, кому не нужна гибкость, Питон может и сгодится.
>Питон нагло нарушает общепринятые нормы...Повторяющийся whitespace игнорируется во всех текстовых коммандно-ориентированных протоколах
Предназначение кода программ несколько отличается от "быть напечатаным". Также питон/хаскель/оккам/прочие не является командно-ориентироваными протоколами.
Так почему их синтаксис должен соответствовать нормам, принятым в этих отраслях?
>программа на Питон - никоим образом нет
А вот тут неправда твоя. Контрпримеры: <pre> достаточно для передачи в html. Хаскель пользуется отступами почти так же, и при этом отлично встраивается в TeX-овые документы(т.н. literate haskell).
>Для тех, кому не нужна гибкость, Питон может и сгодится
Вот, пришла в голову аналогия. Использование электричества в качестве питания автомобилей является совершенно абсурдной идеей, т.к. все шланги заправочных станций крайне плохо его передают, часто даже взрываясь при этом.
>Все публикационные языки, а не только sgml игнорируют повторяющийся whitespace, скажем TeX, Postscript.
Ну, вобще-то Postscript немножко "из другой оперы" - это Forth-язык. Он не имеет ничего общего ни с языками разметки (HTML/XML/SGML/TeX), ни с классическими высокоуровневыми языками, ни с форматами типа dvi,cdr и т.п.:) Ближе всего он к ассемблеру стекового процессора, хотя и не совсем ассемблер:)
>пока не наловчусь безошибочно отличать 5-и секундные паузы в разговоре от 6-и секундных.
Размечтался!:) а 0.1- и 0.2-секндные паузы не хочешь? При том что они очень важны и смысл при применении тех или других КАРДИНАЛЬНО меняется (или вобще - "не компилируется"):)
>Для тех, кому не нужна гибкость, Питон может и сгодится.
Может... Только я, в своё время, именно из-за вышеуказанных причин "отвернулся" от пайтон :(. Пока есть Tcl, ИМХО пайтон толькодля тех, кто "неасилил" Tcl. А нишу перла пайтон практически не перекрывает.
>Предназначение кода программ несколько отличается от "быть напечатаным".
Текст программ на пайтоне даже не исполняется (как в классических интерпретаторах), так что - мимо:) У исходного текста программ предназначения: быть написанным, быть удобноредактируемым, быть прочитанным, быть напечатанным. А выполнять вместо компилятора работу - набивать и подсчитывать символы с кодом 32 - бред... ни один самый тупой язык ассемблера этого не требует...
>Предназначение кода программ несколько отличается от "быть напечатаным".
Любишь аналогии? Как тебе такая:
"При использовании правильного редактора, можно набирать программу прямо в машинных кодах (или в кодах .pyc, если хочешь) - редактор налету будет преобразовывать комбинации клавиш в коды":)
(*)Это не аналогия - это факт. Подозреваю, что всякие продвинутые IDE _парсят_ тексты и работают с ними на уровне AST-ов, откуда до кодогенерации не так уж далеко:-).
(*) я пользую вим - потому это только моё впечатление основаное на косвенной информации.
>а ты "спрыгнул" с заявленных тобою "не plain text исходных текстов программ"
Там я, пожалуй, ошибся. Пошел посмотрел - там есть вполне текстовое представление - просто оно не используется ни компилятором ни штатным редактором, понять, где начинается программа, без поллитры не получается, и в CVS их лучше запихивать с опцией binary - а так, вполне себе текст. Приношу свои извинения.