Нам не нужен ваш кофе

Original author: Nicolas Bevacqua
  • Translation


Это открытое письмо CoffeeScript-сообществу.
Вы можете присоединиться к дискуссии на Hacker News.

Эта тирада, возможно, также справедлива для TypeScript и ему подобных. Чёрт, да даже для asm.js. Я знаю, что asm.js впечатляет в теории, но вы сами пытались пройтись по написанному на нём коду? Это мусор, и вам явно не придётся писать такое в ваших обычных каждодневных исходниках.

Теперь не поймите меня неправильно, меня полностью устраивает то, что вы потягиваете свой модный кофе сами. Проблемы начинаются тогда, когда вы брызгаете этим кофе на всё, чем занимаетесь, или пытаетесь напоить им всех вокруг. Ваш кофе становится заразной болезнью, и вам нужно остановить её распространение. Такие языки, как CoffeeScript, представляет собой проблему сообщества в целом не потому, что язык плох по своей природе, а потому, что вы считаете, что все остальные понимают эту ахинею.
Что? Это не ахинея, это прекрасно! Это JavaScript.
Специальный выпуск новостей: это не JavaScript, он просто компилируется в него. Перестаньте пытаться поработить людей на StackOverflow, отвечая на их JavaScript-вопросы кодом на CoffeeScript. Перестаньте пытаться получить помощь по JavaScript, выкладывая код на Coffee, который мы не понимаем.

Проблема не в самом языке. Хоть мне и не нравится язык сам по себе, я поддерживаю разнообразие, как, впрочем, и все остальные. Проблема в таких как вы, те, кто постит что-либо в сеть так, будто все вокруг знают, как работает CoffeeScript. Конечно, он компилируется в JavaScript. Мы поняли. Но мы не собираемся изучать ваш чудной язык.

(прим. пер.) Далее автор цитирует отрывок из фильма «Телесеть» (Network, 1976), перевод отрывка приведён далее под спойлером.
Мне не нужно говорить вам, что всё плохо, все и так знают, что всё плохо. Будто всё на свете сходит с ума, и поэтому мы больше не выходим на улицы. Мы сидим дома, а мир, в котором мы живём, постепенно сжимается, и всё, что мы говорим, это «пожалуйста, оставьте нас в покое хотя бы в наших гостиных».

Итак, я хочу, чтобы вы сейчас встали.

http://www.youtube.com/watch?v=5o2YUDzXHNM
Перевод отрывка
Мне не нужно говорить вам, что всё плохо, все и так знают, что всё плохо.
Это депрессия. Люди остаются без работы либо боятся её потерять. Доллар идёт по цене пятицентовой монеты, банки закрываются. Продавцы держат стволы за прилавками. Шпана бесчинствует на улицах. Никто нигде не знает, что делать, и этому нет конца. Мы знаем, что воздух стал непригоден для дыхания, а еда — для питания. Мы сидим и смотрим телевизор, в то время как какой-нибудь репортёр рассказывает нам, что произошло 15 убийств и 63 тяжких преступления, как будто так и положено! Мы знаем, что всё плохо. Даже хуже, чем плохо. Они сошли с ума. Всё на свете сходит с ума, и поэтому мы больше не выходим на улицы. Мы сидим дома, а мир, в котором мы живём, постепенно сжимается, и всё, что мы говорим, это:

Пожалуйста, оставьте нас в покое хотя бы в наших гостиных. Оставьте мне мой тостер, мой телевизор и антенну. Я ничего не скажу, просто оставьте нас в покое.

А я не оставлю вас в покое. Я хочу, чтобы вы вышли из себя! Я не хочу, чтобы вы протестовали или бунтовали. Не пишите вашему конгрессмену. Я не знаю, что вам ему написать. Я не знаю, что делать с депрессией, с инфляцией, с русскими, с преступностью на улицах. Всё, что я знаю, это то, что вам нужно рассердиться! Вам нужно сказать: «Я человек, чёрт побери! Моя жизнь имеет ценность!»

Итак, я хочу, чтобы вы сейчас встали. Я хочу, чтобы вы все встали со своих стульев и кресел. Я хочу, чтобы вы встали и подошли к окну, открыли его, высунули в него свою голову и прокричали: «Я зол как чёрт, и я не буду больше это терпеть!».

Вы знали, что некоторые компании на самом деле отворачиваются от Coffee просто потому, что люди по сути не знают языка? Проблема, с которой столкнулись Discourse, состояла в том, что они не получали ожидаемой отдачи от разработчиков просто потому, что их JavaScript был обфусцирован Coffee. Этой причины было достаточно для того, чтобы щёлкнуть выключателем и больше не притрагиваться к CoffeeScript. Проблема ясна: люди, знающие Coffee, должны знать JavaScript, если хотят писать хороший код. В обратную сторону это утверждение уже не так правдиво, у остальной части Вселенной нет причин изучать Coffee, и те из нас, кто не купился на его ощутимые преимущества, остались за бортом.

Я даже не вдаюсь в дебаты «кто лучше?». Мне не очень нравится синтаксис, и опять же, мне всё равно, что кому-то он нравится. Более того, кое-кто пишет довольно длинные статьи на эту тему. Кроме того, первым непроцедурным языком, с которым я познакомился, был Visual Basic, у которого был такой же «человекопонятный» синтаксис, который мы видим в CoffeeScript, чьи перлы вроде one isnt two напоминают мне о временах, когда я тоже отказывался от качества кода в пользу того, чтобы слепо передавать компилятору On Error Resume Next, непонятную конструкцию в VB, которая вела себя, как если бы каждая строка была обёрнута в блок try…catch. Ах, эта радость слепой и наивной отладки.

Проблема с «детским» синтаксисом состоит в том, что он слишком много скрывает, делая код практически недоступным для понимая таких парней как я, не сидящих на кофеине. Не этого мы хотим. Это проблема всех языков, которые компилируются в «веб-языки» (HTML, JS, CSS).

Jade, например, выдаёт чистый HTML, который просто использует CSS-селекторы, с помощью синтаксиса, близкого к тому, что мы знаем как Zen Coding. Сравнивая Jade с чрезвычайно многословной природой HTML (или XML), преимущества становятся видны невооружённым глазом.

Вот немного Jade:

ul#crocodile-items
  li(ng-repeat='foo in bar')
    div {{name}}
    div.details
      div
        span Description
        span {{desc}}
      div
        span Price
        span {{price}}

Набор «руками» такого HTML занял у меня немного больше времени:

<ul id="crocodile-items">
  <li ng-repeat="foo in bar">
    <div>{{name}}</div>
    <div class="details">
      <div>
        <span>Description</span>
        <span>{{desc}}</span>
      </div>
      <div>
        <span>Price</span>
        <span>{{price}}</span>
      </div>
    </div>
  </li>
</ul>

Преимущества использования Jade начинают накапливаться, если принять во внимание такие вещи, как наследование, примеси, JavaScript, ну и тот факт, что вы больше не будете забывать закрывать теги.

Тем временем с Coffee всё наоборот. Что за фигня происходит в скомпилированном JavaScript-коде? Я понятия не имею. Для меня это чёрный ящик. Я не люблю чёрные ящики. Они чёрные и в форме куба. И это всё, что я знаю о чёрных ящиках, они ничего не говорят мне о том, что происходит внутри. Написание JavaScript-кода автоматически означает, что у нас есть полный контроль над тем, что мы делаем, и это дорогого стоит. И напоследок ещё кое-что. Как вы собираетесь использовать ES6, когда он выйдет? Насколько я знаю, он сломает CoffeeScript таким, каким мы знаем его сейчас, и это как бы отстой. Это значит, что вы либо застрянете в языке, который не может использовать последние возможности JavaScript, либо вам придётся перелопатить тонны кода и вернуться к тому, с чего начали. Что касается меня, я лучше не буду запирать себя на замок языком, старающимся помочь мне писать хороший код.

Моё предложение к вам состоит даже не в том, чтобы перестать использовать CoffeeScript, но быть более внимательными к тем, кто ничего не знает о вашем прелестном языке. Всегда компилируйте свой код в JavaScript перед тем, как задавать вопрос на StackOverflow, или отвечать на пост в блоге. Возможно, вы даже узнаете что-то о самом JavaScript.
Share post

Comments 445

    +26
    А отличная идея — в более широком смысле — вообще запретить окружающим: говорить непонятные мне слова, т.к. «я их не понимаю», оперировать непонятными мне концепциями, т.к. «они мне не знакомы» и т.д. Далеко пойдет автор :)
      +66
      По-моему в контексте статьи ( вопросы и ответы на SO) аналогия не вполне корректна. Ведь если вы спрашиваете о правилах построения предложений на русском, то ответ о таких правилах на языке эсперанто вас не очень устроит. Особенно если их будут пытаться выдать за правила для русского языка.
        –18
        Но автор-то даже и спрашивать на эсперанто запрещает. Это вообще, по-моему, за гранью.

        Насчет ответов — с одной стороны, соглашусь, на js общепонятнее будет.

        С другой стороны — ответ на SO дело добровольное, как и чтение такого ответа. И если человек хочет потратить свое время на ответ, и в качестве «платы» желает популяризовать что-то, например, любимый диалект, почему он не вправе? Не понимаете coffee/typescript/… — пропускайте этот, читайте другие ответы. Давший ответ ничем не обязан вам, чтобы вы ему условия ставили, правда ведь?
          +21
          … и в качестве «платы» желает популяризовать ...

          в качестве платы на SO — рейтинг, кстати купите слона, а? (в качестве платы за коммент)

          Автор запрещает спрашивать о JS приводя пример на CS и наоборот, потому что JS isnt CS.
            –14
            Ну может этот гипотетический популяризатор готов обменять свой рейтинг (который ему не поставят coffee-
              –9
              Ну может этот наш гипотетический популяризатор готов пожертвовать своим рейтингом (который ему не поставят нелюбители coffee) на эту фразу. А может, ему любители кофе еще и добавят, кто знает. Слава Богу, это решает сообщество, плюсуя, а не авторитарные личности с призывами «запретить». Спасибо, слон уже есть :)

              А как можно спрашивать о JS, приводя пример на CS? Ведь такой вопрос можно автоматом считать про CS, да и все.
                +19
                Ну судя по тому, что автор пишет:
                Перестаньте пытаться поработить людей на StackOverflow, отвечая на их JavaScript-вопросы кодом на CoffeeScript. Перестаньте пытаться получить помощь по JavaScript, выкладывая код на Coffee, который мы не понимаем.
                такие случаи имеют место быть.
                  0
                  Слава Богу, это решает сообщество, плюсуя, а не авторитарные личности с призывами «запретить».

                  Вот были бы минуса…
                +2
                Эсперанто, в данном случае, — это JavaScript.
              +36
              В статье указана конкретная проблема — не нужно пытаться поить и брызгаться. Я лично сталкивался с этой проблемой, и полностью поддерживаю. Не имею ничего против кофе, но уместно его использовать когда остальные члены команды владеют ним, а не когда один человек начинает навязывать. И почему то часто, люди, его использующие, фанатеют и пытаются сделать из других членов команды фанатов, чем тормозят процесс разработки.
                –1
                Согласен, в команде конечно же нужно следовать общим политикам, тут и говорить нечего.
                  +4
                  В целом верно — но есть одно но: Следуя вашей логике как мы вообще получили ЯВУ(языки высокого уровня)? Условно говоря вся команда пишет с 0 и 1 А я тут такой раз и на ассемблере что-то написал и начал всем говорить что это круто. Это и стало круто — и на вопросы 1010101010101 ??? Мне стали все отвечать ассемблером. А потом прошло время и появился С — и все пошло по тойже схеме. Таким образом я думаю и появляются новые языки программирования, которые мы все сейчас знаем. Так что если сообществу нравится и оно пишет на чем-то — то почему люди не должны писать на кофе? Другой вопрос если человек пишет на кофе и не представляет кто-такой js, НО причем тут coffeescript? Если кто-то чего-то не знает — не надо валить на плохия языки, и вообще соседа — знать или не знать решаешь сам. И многие из нас стали забывать как выглядит в ассемблере написанный нами код…
                    +9
                    Неверный принцип выбора технологий, совсем неверный.

                    Выбирать технологии под знания *всей* команды — это прямой путь к отставанию от прогресса. «Мы этого не знаем» — это вообще не аргумент. Аргумента может быть два:

                    — Нам эта технология подходит (и тогда мы ее изучаем и используем)
                    — Нам эта технология не подходит (и тогда мы ее в этом проекте не используем, даже если знаем)

                    Команда, которая будет пытаться иметь равные компетенции и избегать вещей, непонятных хоть кому-то из ее членов будет хранически на несколько лет отставать от актуальных технологий, т.к. пока нечто новое узнают и освоят (без пинков, как я понимаю) *все* — пройдет очень много времени.

                    Специалистов нужно слегка подталкивать к развитию своих знаний и навыков, даже если им этого не особо-то и хочется, но в проекте это нужно.
                      +1
                      А какие есть проекты где js подходит а кофескрипт внезапно не подходит? Имхо кофескрипт это просто удобная штука, которая заменяет чистый js. Я так понимаю что кофескрипт это не технология а просто удобство, вдобавок к технологии js(в данном контексте)
                        +2
                        Вопрос в том, действительно ли она удобная. А если удобная, то не достигается ли это удобство ценой (значимой) потери эффективности. Не забываем, что в подавляющем большинстве случаев речь идёт о выполнении в неконтролируемой среде, даже минимальные требования обычно не можем заявить.
                          0
                          Вопрос в том, действительно ли она удобная

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

                          Конечно любой интерпритатор на выходе напишет == или хуже чем знающий человек ручками. Этот момент даже и не оспаривается. С другой стороны а на сколько хуже(время отработки кода с учетом что его стало больше на пару килобайт, байт) js, который выдаст coffeescript? Я пологаю в 99% случаев разница пренебрежительна мала и действильно не играет роли на данном этапе развития хардваре и скорости интернета. Возможно у меня не такие проекты были за время существования кофескрипта, но ниразу проблем с его использованием не было в плане эффективности(Конечно никто не говорит о минифицированных js библиотеках и тому подобных вещах — просто обычные веб проект со своей внутренней логикой)
                            0
                            Ну раз народ использует — то наверное удобная.

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

                            Как минимум есть нетоповые смартфоны и планшеты с медленной мобильной связью.

                            Ну и я не только про эффективность выполнения, но и про цикл разработки. Писать может быть и удобно, и эффективно, но усложняются процессы деплоя и обновления.
                        +2
                        Выбирать технологии под знания *всей* команды — это прямой путь к отставанию от прогресса. «Мы этого не знаем» — это вообще не аргумент. <...>
                        Специалистов нужно слегка подталкивать к развитию своих знаний и навыков, даже если им этого не особо-то и хочется, но в проекте это нужно.

                        А нельзя ли тот же принцип применить и к читабельности кода? Чтобы не заставлять каждого писать так, чтобы было с первого взгляда понятно любому дураку, а «слегка подталкивать» остальных к умению быстро понять код любой сложности?
                      +5
                      У меня такие же чувства были когда я пытался изучить JavaScript в поиске примеров для тех или иных решений. Я и так ничерта не понимал, а мне постоянно «подсовывали» код для jQuery и это уже совсем добивало. С тех пор стараюсь по максимуму делать все самостоятельно без всяких «черных ящиков». С этого имею большой плюс — полный контроль над собственной разработкой.
                        –1
                        Простите а комп вы сами собирали? Ну чтоб уж был полный контроль без черных ящиков( конечно можно не знать как собрать руду и выплавить необходимы сплавы — но уж архитектура, пайка сборка и тд это я надеюсь вы сами ) Я это к тому что черных ящиков хватает и если уж предоставляют достатчно хороший ящик так почему бы его не использовать. А если есть желаение убрать черный ящик — можно в него и заглянуть и прояснить что к чему в нем(зачастую ящики пишут несколько человек и не за один два дня, а вы один — отсюда можно заключить что без яшиков сложновато будет)
                          0
                          Еще не вечер :) Вот подучусь, еще и его соберу :)
                            0
                            Но суть не изменится ) Элементы платы будут покупаться и вообще надо творить материей — ведь предметы это тот же черный ящик))
                              0
                              Я свои чипы спроэктирую) А творить материю, измерения и другие вселенные в следующей жизни)
                                0
                                ОК — При первом результате фотки в студию )) А слудующую жизнь можно классифицировать как черный ящик — надо свою изобретать ))
                                  0
                                  Как скажете)
                      +12
                      Меня зовут Артур, и я поставил "+" Жду камней.
                        +7
                        Держите нас в курсе.
                          –4
                          Карма -3 :)
                        +6
                        Ну конечно не так категорично как заявляет автор, и не сказать что я прям супер-пупер-гуру разработчик, но мне тоже ненравится идея «кофеина»
                          +11
                          [offtop] еще бы «не» было написано отдельно, а то только с третьего раза понял, что все-таки «не нравится», а не «нравится» [/offtop]
                          а в чем его идея?
                          –11
                          > Нам не нужен ваш кофе
                          Отлично, переходите на чай =)

                          > Как вы собираетесь использовать ES6, когда он выйдет?
                          Пару коммитов быстро решат проблему, останется только пересобрать все asset. А вообще, просто внезапно ES6 не вкатится, в любом случае его нужно будет включать руками или наоборот отключать специально.

                          > Что за фигня происходит в скомпилированном JavaScript-коде? Я понятия не имею.
                          1-2 недели разработки на Coffe сделают вашу жизнь проще, а ящик прозрачней.

                          > Моё предложение к вам состоит даже не в том, чтобы перестать использовать CoffeeScript
                          Вообще стоит перестать использовать JS, там больше кода, нужно дольше печатать, тунельный синдром одобряет.
                            +12
                            Пару коммитов быстро решат проблему, останется только пересобрать все asset. А вообще, просто внезапно ES6 не вкатится, в любом случае его нужно будет включать руками или наоборот отключать специально.

                            CoffeeScript, с вероятностью 99%, никогда не будет поддерживать блочную область видимости (let) и разряженные шаблоны деструктуризации (let [a,, b] = [1, 2, 3]; a==1, b == 3), т.к. символ запятой "," означает в CS совсем другое нежели в JS.

                            А если копнуть глубже, то выясняется, что конструкции for-of из ES6 и for-of из CS сильно отличаются. for-of из ES6 итерируется по объекту используя его встроенное свойство «iterator», тогда как for-of из CS это скорее сахар для for-in. Сильно сомневаюсь, что без ввода дополнительных конструкций языка в CS появится аналог for-of из ES6.

                            Да и аналога генераторов, по крайней мере в доке на coffeescript.org, я найти не могу.

                            В таком случае, после внедрения ES6, CS останется в роли догоняющего, и не факт, что майнтейнеры захотят сильно менять язык и быстро вводить новые фичи. В своё время, люди не довольные скоростью развития CS создали LiveScript, а это о многом говорит.

                            CoffeeScript хороший язык, но я лично предпочту TypeScript или EcmaScript6
                              +4
                              Часто используете for-of? Я за два года разработки на коффе ни одного раза, есть удобный each, другого и не надо. И если у объекта есть свойство iterator, то функции перебора будут его использовать. И вообще перебор редко используется, чаще всякие map, every, reduce…

                              let [a,, b] = [1, 2, 3]
                              не сильно отличается от CoffeeScript
                              [a, _, b] = [1, 2, 3]
                              [a, t, b] = [1, 2, 3] (eсли _ занято underscope.js)
                                +1
                                [a, _, b] = [1, 2, 3]

                                Согласен, но всё-таки смысл в том, что синтаксис деструктуризации отличается в CS и ES6. И это печалит.
                                Часто используете for-of?

                                В ES6 for-of /будет/ очень полезный. Особенно в сочетании с итераторами и генераторами. Так что я буду всё больше и больше его использовать.
                            +21
                            1. Обфусцирован? Компилятор CoffeeScript генерирует код, который отличается от кода, который напишет человек, но он вполне читабельный. Но обфусцированный?! Неа:)

                            2. Полностью согласен с утверждением, что код на CS нужно дублировать кодом на JS.
                            Впрочем, не везде, на рельсах например CS есть по умолчанию, и большинство девелоперов-рельсовиков его знает :)

                            3. Странный наезд на алиас isnt(!==) и конструкцию из VB. Какой то консерватизм, как аргументы против выделения кодом отступами. JS сам по себе не самый легкочитаемый и вообще простой язык с классным синтаксисом. Благо, это исправляется новыми версиями
                            isnt добавлен в язык для придачи ему большей человечности (пожалуй, как и конструкция из VB), и легко читается, если девелопер хоть чуть-чуть знает английский, это разумная эволюция, а если ваш глаз привык цепляться за = , то любой редактор выделяет isnt совершенно тем же цветом. Ну а то, что автор пихал конструкцию из VB куда не надо и потом весело дебагил — его проблемы.

                            4. Не знаю где автор увидел черный ящик. Используя диалект языка, предполагается, что девелопер знает этот самый язык, и то, во что выльется подслащенная конструкция. Документация у Coffee очень понятная, читается буквально за пару часов, и даже в IDE лезть не надо, на сайте уже есть интерактивный shell.

                            Короче, единственный нормальный аргумент — дублируйте код на CS кодом на JS.
                              +20
                              5. Наезд на ASM.JS показывает непрофессиональность автора: ASM.JS не для написания кода ручками, а для транслирования кода из других языков, например.
                                +2
                                Для написания тоже. Иногда есть отдельные небольшие куски, которые имеет смысл писать на asm.js ради оптимизации.
                                  +1
                                  Это извращение, поверьте. Сам писал, десяток подводных камней, скорость выросла, но не существенно.
                                  Для написания он предназначен так же, как ваза для забивания гвоздей)
                                +6
                                Этот последний нормальный аргумент можно продолжить: а раз уж всё равно вам придётся писать на JS, зачем вообще заморачиваться с CS?
                                  +1
                                  Используя диалект языка

                                  Разве это диалект, а не другой язык?
                                  +16
                                  Одна из самых ужасных статей, которые попадали на HN с того времени, как я на него подписан. Для тех кто работал с большими проектами на JS очевидно, что язык проектировался не на такие масштабы.

                                  А автор оригинальной статьи настолько невежествен, что даже не знает, что на диалекте asm.js не предполагается ничего писать и уж тем более изучать код транслированный из него. Автор просто ленится потратить от силы две недели на изучение такого просто языка как Coffee. Что уж тогда обвинять людей в том, что они не хотят выучить хоть один функциональный язык для разнообразия.
                                    +7
                                    Автор просто ленится потратить от силы две недели на изучение такого просто языка как Coffee.

                                    Не хочу показаться бахвальным, но за три вечера переписал проект на CS, хотя до этого никогда его в глаза не видел. Практика, практика и эта инструкция вам в помощь ;)
                                    P.S.: Чем ему isnt не угодил? Не часто встречаемая конструкция, но вот is not — действительно круто и ёмко выглядит!
                                      +2
                                      Во-первых, его никто не заставляет использовать ее в CS, во-вторых, очень сомневаюсь, что наличие isnt хоть как-то затрудняет чтение кода. Это просто ханжество по поводу синтаксического захара.
                                        +2
                                        На самом деле is и isnt очень крутая штука, она оберегает от случающихся даже у опытных программистов проблем с написанием = вместо ==.
                                          +3
                                          ага, а
                                          struct?.substruct?.field
                                          экономит нервные клетки
                                            +1
                                            От проблем с написанием «=» вместо «==» можно и другим способом избавиться, не переходя с JavaScript на другой язык.

                                            Я, например, для этой цели прогоняю джаваскриптовый код через JSHint до тех пор, пока JSHint не перестанет находить ошибки в коде.
                                              +2
                                              как говорится, «от перестановки слагаемых»…
                                              if (5=q) — опа, ошибка синтаксиса, lvalue нельзя присвоить
                                              if (5==q) — то, что мы хотели написать
                                                +2
                                                А вот этой RTL-практики я избегаю, потому что меняется шило на мыло. (Ценою ловли ошибок становится некоторое падение читаемости.)

                                                Конечно, если кто принадлежит к такому народу, которому читать справа налево сызмальства привычно, то у него может другое быть впечатление о читаемости.

                                                Но это не мой случай, так что продолжу уж лучше JSHint пробавляться.
                                                  0
                                                  От перестановки мест слагаемых сумма не изменяется. К «читать справа налево» это отношения не имеет. А, имхо, читаемость даже повышается, если вместо q стоит сложное выражение.
                                                    0
                                                    Ставить сложные выражения прямо в условный оператор — моветон. Всё равно лучше вынести в отдельную переменную с содержательным именем. Что касается условий Yoda-style, то я их не использую, т.к.:
                                                    1) Никогда не ошибаюсь с = вместо ==
                                                    2) Если всё же ошибусь, компилятор ругнётся
                                                    3) Снижается читабельность: всё же приучать себя читать «5 равно x» как «x равно 5» — это как дать себе в глаз, а потом класть туда лёд
                                                  0
                                                  if(b = a) { ... }
                                                  

                                                  вместо
                                                  if(b == a) { ... }
                                                  

                                                  и всё…

                                                  Yoda-expressions помогают только пока одним из элементов сравнения не является lvalue.
                                                  +1
                                                  У меня частенько написано if(а=б), и это именно то, что я имею в виду, так что Хинт не всегда поможет.
                                                    0
                                                    Зря вы так пишете.
                                                      0
                                                      Ну как. Я просто знаю, что у меня в коде на CS только 'is' и 'isnt', и знак равенства может обозначать только присваивание, и у меня нет рефлекса воспринимать это как сравнение.
                                                        0
                                                        Это потому, что вы один работаете над проектом. Когда разработчиков несколько, приходишь к выводу, что лучше написать три строки, но в которых ошибка видна сразу, чем одну мудрёную и вот с такими неочевидными местами.
                                            +23
                                            А автор оригинальной статьи настолько невежествен, что даже не знает, что на диалекте asm.js не предполагается ничего писать и уж тем более изучать код транслированный из него.
                                            Неа. Автор статьи настолько невежественен, что начинает своё повествование со ссылки на реальный код из реального проекта, который реально руками написано на asm.js.

                                            Но тут приходит мегагуру весь в белом и объясняет, что того, что мы видим на экране в природе не бывает, просто у всех коллективная галлюцинация — и всем становится леко на душе. Ну действительно, зачем на факты из реального мира? Давайте лучше теоретически обсуждать столетиями сколько ног у мухи, вместо того, чтобы их взять и посчитать.
                                              +2
                                              А вы в С-коде ассемблерные вставки никогда не встречали?
                                              Надо заметить, что повествующий автор указал ссылку на асм.js реализацию математического по сути алгоритма, который без асм.js был бы записан в том коде абсолютно точно так же (за исключением специфичных определений типов переменных).
                                                0
                                                Ага. И обращения к элементам массива тоже писались бы как H[j<<2>>2]? Ню-ню.
                                                  0
                                                  Хм, а как бы вы по-другому записали это выражение?
                                                    0
                                                    В нормальных языках как бы принято его записывать как H[j] всё-таки. Или если уж так хотите указать тип, то H[j|0]. Но H[j<<2>>2], извините, ни в какие ворота не лезет.
                                                      0
                                                      Я, если честно, не очень понял смысл этой операции в контексте индекса массива, но похоже на сброс двух старших битов.
                                                      В спеках asm.js указано, что таким маневром можно привести выражение к signed, однако это делается и через |0.
                                                      Сомневаюсь, что алгоритм вычисления хэша использует массив на 4 гигабайта и в старших двух битах может оказаться что-то существенное.
                                                      Может кто знает в чем тайный смысл?
                                                        0
                                                        Вопрос в том, какого типа j. Если знаковый — то это распространение старшего бита на два следующих. В применении к индексу массива — довольно бессмысленная операция. Если беззнаковый, то на не RISC платформах дешевле написать эквивалент H[j&0x3FFFFFFF].
                                                        Кстати, кто-нибудь понял, что там за константы? 1518500249 = sqrt(2)*2^30, 1859775393 = sqrt(3)*2^30. Но что такое 1894007588 и 899497514?
                                                        Я немного сомневаюсь, что код был написан руками. В лучшем случае — отредактирован. Впрочем, я не знаю JS, так что, возможно, всё не так.
                                                          0
                                                          Но что такое 1894007588 и 899497514

                                                          Вопрос снимается, всё очевидно… но почему они такие? В описании алгоритма даются без объяснения.
                                                            0
                                                            Потому что это константы из определения SHA-1?
                                                              0
                                                              Хорошо, но в более развёрнутом виде вопрос выглядит так. Почему в определении SHA-1 выбрали именно константы sqrt(k)*2^30 для k=2,3,5,10? Есть ли за этим какие-нибудь математические доводы, или просто разработчикам это показалось хорошей идеей? Приводится ли где-нибудь выражение этих констант через квадратные корни, или люди должны догадываться сами? Быстрый поиск ничего про происхождение констант не дал.
                                                                +2
                                                                Википедия говорит, потому что какие-то константы были нужны, а если константы брать «с потолка», могут возникнуть подозрения на бэкдор.
                                                                The constant values used are chosen as nothing up my sleeve numbers: the four round constants k are 230 times the square roots of 2, 3, 5 and 10.
                                                                  +1
                                                                  Спасибо. Не заметил этой фразы. Надо будет взять это объяснение на вооружение — тогда никому не придёт в голову искать секретные соотношения между параметрами.
                                                          0
                                                          Я, если честно, не очень понял смысл этой операции в контексте индекса массива, но похоже на сброс двух старших битов.
                                                          Неа. Похоже на asm.js. Вот тут же уже писали: если этого не сделать, то asm.js будет считать, что вы обращаетесь к байтам, а не к 32битным int'ам.
                                                            0
                                                            Это ещё один довод в пользу того, что код писался не вручную. Если бы его писал человек, то сразу бы работал с учетверёнными переменными i,j,k и константами смещений, и не пришлось бы каждый раз писать <<2. Код стал бы несколько понятнее.
                                                              0
                                                              О боги! Я понимаю, что «доктор сказал в морг — значит в мог», но есть же какие-то пределы. Вот как раз написание кода человеком к таким ужасам и проводит.

                                                              Компилятор автоматически порождает учетверённые переменные потому как у него это не индекс в масиве, а совсем даже наоборот: «адрес переменной». А чтобы получить-таки индекс в мессиве адрес переменной положено делить на 4 (комиляторы в asm.js обычно складывают все переменные в один массив). На чём в результате и настаивает asm.js.

                                                              А человеку, знаете ли, свойственно оперировать индексами, а не учетверёнными индексами. Louter (с хабра) написал точно такой же код, только с <<3>>3 вместо <<2>>2) в своей статье.
                                                                0
                                                                Если человек полез на этот уровень оптимизации, то работать с учетверёнными индексами ему ничего не стоит. Когда в ассемблере ещё не было этих новомодных [eax+ebx*4], то люди нормально работали и с удвоенными-учетверенными индексами, и с адресами — в отличие от компиляторов, которые по любому поводу тупо считали адрес через сдвиги и сложения.
                                                                  0
                                                                  Если человек полез на этот уровень оптимизации, то работать с учетверёнными индексами ему ничего не стоит.
                                                                  Ок, понял. Значит Louter не человек. Сообщите администрации, чтобы его забанили или посмотрим как долго этому роботу удастся вводить людей в заблуждение?

                                                                  в отличие от компиляторов, которые по любому поводу тупо считали адрес через сдвиги и сложения.
                                                                  Вы бы ещё про компиляторы Фортрана 60х годов вспомнили! Современные компиляторы, как бы, самую малось поумнели и уже давным-давно такого не делают.

                                                                    0
                                                                    Так современные процессоры сами умеют умножать индекс на 4 в пределах одной команды. И компиляторам работать с адресами больше не нужно, они предпочитают индексы. И получается эффективнее.
                                                                    А что касается той статьи — вы что, серьёзно думаете, что там приведена настоящая программа? С такой строчкой:
                                                                    tp[(i << 3) >> 2] = +(+2 * tp[((i - 1) << 3) >> 3]);
                                                                    

                                                                    Судя по тексту статьи, на неё будет выдан type error с требованием сдвига на 3 бита.

                                                                      0
                                                                      В ссылке на настоящую программу этой ошибки уже нет. Тогда непонятно, почему было не пустить циклы с шагом 8. И быстрее, и кода набирать меньше.
                                                                        0
                                                                        Именно потому что что это человек писал! Он сначала написал это на JavaScript'е, а потом начал переписывать на asm.js. Получилось то, что получилось. А для того, чтобы писать нормально прямо на asm.js нужно гораздо дольше с ним общаться и эти программы будут ещё дальше от JavaScript'а — об чём, собственно, и статья.
                                                                        0
                                                                        Смотря какие процессоры. ARM и MIPS, к примеру, не умеют. Насчёт индексов — по разному бывает, иногда компилятору удаётся от них избавиться.

                                                                        А в статье — да, там есть в конце настоящая программа.
                                                +13
                                                Если батхерт по поводу Кофе еще как-то обоснован, то при чем тут asm.js, вообще не понятно.
                                                  +3
                                                  Вы на ссылку кликали? Там asm.js написанный руками. И как вы, спрашивается, будете подобный проект поддерживать? И сильно вам помогут заявляния о том, что asm.js — это просто подмножество JS, если у вас в проекте такое встретится?

                                                  Ну откуда берётся мода критиковать статьи их не читая?
                                                    +1
                                                    Ну наверное кто-то пишет руками asm.js, разработчики трансляторов в него, например. Какое это имеет отношение к coffescript и прочим? Что, на stackoverflow кто-то ответы на asm.js оставляет?
                                                      0
                                                      Пока нет, ну так со времени его создания не прошло ещё и года.
                                                      0
                                                      Это примерно так же, как, увидев рукописную ассемблерую вставку, заявить что «С++ — говно, смотрите во что он транслируется! Как вы будете это поддерживать?!!!111».
                                                      Автор элементарно не понял к чему там это.
                                                        0
                                                        Автор как раз понял, это вы не поняли. Я не видел ни одного человека, который бы считал, что C с ассемблерными вставками — это просто C. Нет, это другой язык и для его понимания нужны другие книжки (нужна документация на ассемблер, как минимум). Но я видел кучу народу, которые «бьют себя пяткой в грудь» и вопят, что asm.,js — это «всего-навсего JavaScript» и потому можно одновременно катить баллоны на Google за то, что он добавляет в Chrome свои вещи, которые никто больше не поддерживает (например HTML5 filesystem) и при этом добавлять поделки подобные asm.js в свой браузер ни с кем ни о чём не советуясь.
                                                  • UFO just landed and posted this here
                                                      –4
                                                      если на SO ответить на вопрос с CoffeeScript кодом на JS, то вопрошающий будет удовлетворён

                                                      То есть вы предполагаете, что тот, кто пишет на CS обязан знать JS?
                                                      • UFO just landed and posted this here
                                                          –4
                                                          Думаю, такие люди есть уже. Те, кто, скажем, начал учиться (веб-)программировать недавно и начал с RoR.
                                                            –1
                                                            Если человек освоил такую не самую легковесную платформу, как RoR, документация к которой занимает мегабайты текста, описывающие тысячи методов, неужто он не способен прочесть один листок доков про CS за 15 минут?

                                                            Кофи это не фреймворк, не язык и не диалект, это препроцессор, он не вводит никакой семантики, он просто даёт вам написать то, что вы имеете в виду, а не подсчитывать скобки. Изучить его можно за время, заметно меньшее потраченного автором на этот рант, а переводчиком на его перевод.

                                                            Прошёл год, пока я более или менее уверенно стал себя ощущать в экосистеме RoR. За это время успела смениться мажорная версия. А вот когда появился CS, я переписал все свои клиентские части на нём и подумал, а ведь жаваскрипт-то классный язык, как оказалось! И ушёл с RoR на ноде.
                                                              +2
                                                              Все мимо. Разговор про людей, знающий cs, но не знающих js.
                                                              • UFO just landed and posted this here
                                                                  0
                                                                  Мне все равно. Я лишь указал, что комментарий bubuq был не по адресу.
                                                                0
                                                                Я про людей, которые начали изучение программирования с RoR, включая CS, а ни строчки на JS и не написали ни разу.
                                                          +1
                                                          Это Вы еще Ember.js не видели, там сплошная магия.
                                                          • UFO just landed and posted this here
                                                            • UFO just landed and posted this here
                                                              • UFO just landed and posted this here
                                                                • UFO just landed and posted this here
                                                                  • UFO just landed and posted this here
                                                                    • UFO just landed and posted this here
                                                            +29
                                                              +9
                                                              Тем временем с Coffee всё наоборот. Что за фигня происходит в скомпилированном JavaScript-коде? Я понятия не имею. Для меня это чёрный ящик. Я не люблю чёрные ящики. Они чёрные и форме куба. И это всё, что я знаю о чёрных ящиках, они ничего не говорят мне о том, что происходит внутри. Написание JavaScript-кода автоматически означает, что у нас есть полный контроль над тем, что мы делаем, и это дорогого стоит

                                                              Я бы предложил автору статьи срочно выкинуть свою Linux/Windows/Mac, ведь это чёрные ящики. JavaScript тоже надо выкинуть, ведь v8/spidermonkey/любой_другой_движок написаны на C/C++, которые тоже чёрные ящики, ведь они генерят непонятный ассемблерный код. В общем, всегда же есть сердцу любимый ассемблер, на нём и надо писать, как в старые времена. И ассемблер запускать с магнитной ленты из монитора, никаких ОС.
                                                                +1
                                                                некоторые могут не доверять даже ассемблерам и писать в машинных кодах.
                                                                +6
                                                                В выходные как раз переводил проект с JS на TypeScript. Получилось быстро и код, генерируемый компилятором, весьма чистый и аккуратный. Плюс нормальный тайп чекинг и интеллисенс. Единственное, что пока не хватает это protected при наследовании.
                                                                Причем если уж смотреть на ES6, то порт будет просто элементарным… но это имхо канешн…
                                                                  +5
                                                                  > Вот немного Jade:

                                                                  Пусть нажмёт DEL в начале произвольной строки, пусть за него это сделает кто-то другой.
                                                                  Не надо говорить, что такого не бывает, потому что не бывает никогда, такое случается, потому что может случиться.

                                                                  Незакрытый тег найдёт IDE, а кто исправит порушенную структуру?
                                                                    +6
                                                                    git bisect?
                                                                    
                                                                      0
                                                                      неужели IDE не научились контролировать отступы? Одним пробелом ведь не обойдется, надо либо 2 либо 4.
                                                                        +5
                                                                        Пайтоновские IDE очень даже научились контролировать отступы :) как и те, которые поддерживают yaml, jade и прочие подобные языки.
                                                                        0
                                                                        смените ваш текстовый редактор на человеческую IDE
                                                                        image
                                                                          0
                                                                          Можно поинтересоваться, что это за IDE/редактор?
                                                                            +1
                                                                            Pycharm. Подозреваю что остальные от IDEA (WebStorm, PHPStorm etc) имеют ту-же функциональность.
                                                                              0
                                                                              Угу, имеют.
                                                                        –15
                                                                        Если автор не может осилить такой простой язык, то ему явно не место в индустрии.
                                                                          +5
                                                                          I am as mad as hell, and I am not gonna take this anymore!
                                                                          +8
                                                                          Немного не согласен с тем что JavaScript это такой белый ящик, а CoffeeScript это такой черненький. Если у coffee нет проблем с синтаксисом, то черным ящиком он может быть только с точки зрения производительности, но вообще говоря сам JavaScript является таким черным ящиком где разные браузеры показывают разную производительность (например есть две альтернативные конструкции для достижения одной цели, в разных браузера будет выигрывать либо одна либо другая конструкция).

                                                                          С основным тезисом я правда согласен, т.к. сам я кстати coffeescript решил не осиливать.
                                                                            –1
                                                                            Автор, а что в вашем понимании черный ящик?
                                                                              +14
                                                                              Не думаю, что Nicolas Bevacqua читáет Хабрахабр.
                                                                                0
                                                                                Позволю себе ответить за него — не очевидные: поведение компилятора, внутреннее устройство функций, конструкций языка и т.д. (Это не упрек в сторону кофе, я его не знаю чтобы судить, но это то, от чего мне становиться страшно, когда я слышу его критиков и причина моего незнания)
                                                                                  +4
                                                                                  Извиняюсь, пропустил первые строчки поста.

                                                                                  В оригинале забавен вот этот комментарий:
                                                                                  well, since javascript is the new assembler, no wonder people HAVE to use something more sane :)
                                                                                    +3
                                                                                    Очень правильный подход, браузеры считай сменили ОСи, так что javascript вполне себе язык ядра, чтобы нечто выше уровнем было признано это нечто должно быть не хуже С, про кофе такого впечатления нет.
                                                                                +6
                                                                                Я не понял, как ES6 должен сломать coffeescript. Все спецификации ecmascript обратно совместимы, и уже это гарантирует, что с кодом на coffeescript ничего не случится.

                                                                                Ну а в целом странный пост. Язык завоевал популярность, по читаемости сгенерированного js-кода он один из лучших, там нечего расшифровывать. И как бы ни хотелось автору или кому-то еще, coffeescript есть и будет. Постить скомпилированный coffeescript — тоже не самая хорошая идея, т.к. не очень красиво будет, и уж тем более не очень понятно, т.к. наружу вылезет куча внутренних переменных.

                                                                                По поводу «не заставляйте меня учить ваш язык». Возможно и стоило поучить, благо спецификация у языка миниатюрная, заодно стало бы понятно, почему другие программисты его использовать любят.
                                                                                  –1
                                                                                  Так и не смог понять то ли это тонкий стёб, то ли дань невежеству.
                                                                                    –1
                                                                                    Прочитайте про автора: «I started building all kinds of web applications using C#, and developed a great interest in JavaScript,» человека который пришел в фронтенд через Си сложно заподозрить в слепом невежестве, скорее наоборот он подозревает фанатов кофе в таковом и боится, что они побегут по граблям которые уже давно известны в других языках и решил потроллить чутка, чтоб решить стоит обратить на этот кофе внимание или он исключительно для дикарей, которым не интересны perfomance, отладка, поддержка и т.п.
                                                                                      +1
                                                                                      пришел в фронтенд через Си


                                                                                      Сишарп — это не Си, не надо путать. ;)
                                                                                    +10
                                                                                    Согласен с автором статьи.
                                                                                    Почему большенство пишет, что он не хочет учить CoffeeScript? Мне кажется идея его поста не в этом. Любой хороший разработчик побежит учить новый диалект если это сохранит ему время и поможет ему (все мы лентяи). Мне кажется большенство js-разработчиков интересовались и пробовали Coffee, но не всем нравится его синтаксис и не всем он полезен. И я один из них. Я сделал несколько проектов на Coffee, но я все же предпочту чистый JS (я говорю о синтаксисе, а не использовании библиотек и фреймворков).

                                                                                    <вброс>
                                                                                    Когда только начал интересоваться Coffee. Меня до глубины души поразила конструкция вида:
                                                                                    # Conditions:
                                                                                    number = -42 if opposite
                                                                                    

                                                                                    она мне до сих пор снится в кошмарах.
                                                                                    </вброс>

                                                                                    Очень интересно было бы посмотреть на результаты такого опроса (поиском не нашел):

                                                                                    В проектах используется преимущественно:
                                                                                    — TypeScript
                                                                                    — CoffeeScript
                                                                                    — Другой диалект (Caffeine) например
                                                                                    — Только Хардкор! JavaScript

                                                                                    Если я буду начинать проект буду писать на:
                                                                                    — TypeScript
                                                                                    — CoffeeScript
                                                                                    — Другой диалект (Caffeine) например
                                                                                    — Только Хардкор! JavaScript

                                                                                    У кого есть это самое, сделайте пожалуйста.
                                                                                      –5
                                                                                      JQuery забыли, как раз по моему успех, о котором и мечтает кофе. JavaScript топики на StackOverflow полны его и никому не приходит в голову ругаться.
                                                                                        +5
                                                                                        не путайте диалекты языка с библиотеками и фреймворками. jQuery тут не причем.
                                                                                          +7
                                                                                          Де-юре это библиотека, но де-факто, судя по размеру влияния оказываемого на исходный код — вполне себе диалект.
                                                                                            +2
                                                                                            JS, написанный в расчете на использование jQuery остается им же… это не что-то, что преображается во что-то неведомое, и только потом исполняется.
                                                                                              +1
                                                                                              В этом и есть часть претензии автора: «What? It's not non-sense, it's beautiful! It's JavaScript.», что его позиционируют именно как тот же JS, а не как что-то неведомое. Так что если уж сравнивать, то должен быть этот пункт.
                                                                                          +4
                                                                                          Я может быть сейчас скажу что-то крамольное, но, по моему, jQuery больше не нужен. По крайней мере в новых проектах, где используется декларативный подход, jQuery только мешает. Да, я понимаю, что во многих декларативных фреймворках jQuery используется «по капотом» — ну так пусть он там и остаётся. Раздражает, когда люди продолжают использовать $.proxy, $.each, $.inArray и иже с ними.
                                                                                            0
                                                                                            Что значит не нужен, что опять по пол страницы для создания XMLHttpRequest писать? $.each мне не нужен, но я не могу представить современный сайт, в которой можно обойтись без jQuery, не переписывая существующих там функций для всяких полезных свистелок.
                                                                                              –1
                                                                                              Что значит не нужен, что опять по пол страницы для создания XMLHttpRequest писать?

                                                                                              Ну зачем вы так утрируете?
                                                                                              let xhr = new XMLHttpRequest({anon: true});//anonymous request
                                                                                              xhr.open("GET", "api.site.com");
                                                                                              xhr.responseType = "json";
                                                                                              xhr.onload = function(){
                                                                                                  xhr.response;//this is JSON object
                                                                                              }
                                                                                              xhr.send();
                                                                                              

                                                                                              Посылает анонимный запрос и получает ответ в JSON формате. Да, я согласен, что этот код без полифилов работать не будет, да и вызов `open` избыточен, но это не пол страницы.

                                                                                              В современных web-приложениях больше необходим socket.io и подобные, чем $.ajax.

                                                                                              Что ещё остаётся?
                                                                                              $.css — менять стили в js-коде это быдлокод, нужно пользоваться css-классами
                                                                                              $.[add/remove/toggle]Class — node.classList.[add/remove/toggle] удобнее и быстрее, да и менять классы в js-коде это моветон — нужно использовать БЭМ модификаторы, методов работы с которыми в jQuery нету.
                                                                                              $.bind и $.trigger — это полный провал и в версии 2.0 они их не улучшили. Можно продолжать использовать только по привычке, и то, с декларативным подходом, вам не понадобится /часто/ использовать $.bind
                                                                                              Выбор ($.find) и манипулирование DOM-элементами ($.append, $.after и т.д.) — эти функции должен предоставлять Декларативный фреймворк, а то, что он «по капотом» использует jQuery не должно вас волновать.

                                                                                              Остаётся только $.Deferred, но его хотят добавить в следующую версию DOM4 API, поэтому он будет поддерживаться браузерами нативно.

                                                                                              Я не говорю, что нужно прекратить использовать jQuery, нет. Просто большинство декларативных фреймворком предоставляют API отличное от jQuery и говорить, что jQuery это неотъемлемая часть языка (тут я утрирую и преувеличиваю, но всё же) это неправильно.
                                                                                                +3
                                                                                                Понятно, вопрос только в терминологии, просто ваше: «Давайте использовать фреймворк, у которого jQuery внутри» для меня не значит: «jQuery больше не нужен».
                                                                                                  +2
                                                                                                  XMLHttpRequest не кроссбраузерный. Сейчас, конечно, времена не те, но изначально приходилось два разных объекта создавать. Кроме того, если необходимо создавать два разных запроса, то необходимо создавать два разных экземпляра класса, в каждом из которых используется свой XMLHttpRequest.
                                                                                                  В общем, там подводных камней то ещё количество. Решением может быть своя мини-библиотека, да, но jQuery сейчас весит меньше некуда.
                                                                                            +4
                                                                                            В дополнение к опросу, еще было бы не плохо видеть, кроме использования, в проектах вопрос:

                                                                                            Я знаю синктаксис и могу писать проекты на: (Checkbox'ы)
                                                                                            — JavaScript (просто для сравнения, а вдруг кто-то может только на Coffee писать)
                                                                                            — CoffeeScript
                                                                                            — TypeScript
                                                                                            — другой диалект

                                                                                              +2
                                                                                              А что не так с конструкцией? Издавна используется в руби и всех там радует, собственно оттуда и перешла в CS. Если не знаете в каких случаях ее применяют, не значит, что она плоха.
                                                                                                –3
                                                                                                Я писал на Pascal, C/C++, Delphi, PHP, JS, сейчас начинаю учить Python. Могу ошибаться но ни в одном из этих языков я не видел подобных конструкций. Для меня вобще дико видеть в ЯП конструкцию вида: определение-условие (statement-condition). Для меня более логично выглядит условие-определение. Никто не мешает не использовать такие конструкции, но наверное именно по этому мне Ruby тоже не нравится. мое субъективное мнение

                                                                                                Назовите еще один ЯП, где используется такая конструкция?
                                                                                                  0
                                                                                                  Ну, это вы читая видите определение-условие, транслятор видит как условие-определение. Пример применения, собираем длинную строку, предположим uri:
                                                                                                  uri  = "http://"
                                                                                                  uri += site_name
                                                                                                  uri += "/"
                                                                                                  uri += resource
                                                                                                  uri += utm_source unless admin?
                                                                                                  


                                                                                                  Удобно, код читаемый и простой (даже unless), легко поддерживается.

                                                                                                  Собственно определение (присвоение, биндинг и т.д.) это тоже действие, и ничем не отличается от:
                                                                                                  do_this if that
                                                                                                    +6
                                                                                                    Ну мы же с вами не трансляторы. Транслятору можно скормить и такое:
                                                                                                    ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
                                                                                                    .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
                                                                                                    ------.--------.>+.>.
                                                                                                    А ну да...

                                                                                                    По поводу удобства использования, давайте наверное оставим эту тему, вам удобно мне нет.

                                                                                                    Включая C, Python, PHP, JS.

                                                                                                    Можно примеры такого кода на перечисленных языках?
                                                                                                    JS:
                                                                                                     var a = some || "data";
                                                                                                    

                                                                                                    не в счет, это не тоже самое что var a = some if(some)
                                                                                                    Когда видишь конструкцию c if инстинктивно понимаешь что дальше должен быть код условия.
                                                                                                    Один из минусов такого кода: В не знакомом коде я вижу вашу конструкцию:

                                                                                                    uri  = "http://"
                                                                                                    uri += site_name
                                                                                                    uri += "/"
                                                                                                    
                                                                                                    ... еще много строк
                                                                                                    
                                                                                                    uri += resource
                                                                                                    uri += utm_source unless admin?
                                                                                                    

                                                                                                    но по коду мне нужна была только ветка которая отработает при не определенном admin. Возникает вопрос, на кой я это читал, и зачем было так писать.

                                                                                                    тернарный условный оператор

                                                                                                    даже Wiki дает определение логическое выражение ? выражение 1 : выражение 2
                                                                                                      –1
                                                                                                      Зависит от кода, тут вам ветки не нужны. Admin тут вполне определен (true или false).
                                                                                                        0
                                                                                                        Мне кажется, что я, наверное, неточно выразился, раз не только вы меня неправильно понимаете. Смотрите, классическое определение: логическое выражение ? выражение 1 : выражение 2, вы просто убираете выражение 2 и у вас остается логическое выражение ? выражение 1, формой чего и является do_this if that. Варианта выражение 2 нету, ни null, ни false, ни undef. Выражение 1 просто не выполняется.
                                                                                                          +1
                                                                                                          вы даже неправильно понимаете эту конструкцию

                                                                                                          > Выражение 1 просто не выполняется.
                                                                                                          Дак в этом и проблема. Потому что до того, как «вы просто убираете выражение 2» Выражение 1 всегда выполняется.
                                                                                                            +1
                                                                                                            Если логическое выражение правдиво, если ложно, выполняется выражение 2.
                                                                                                              +1
                                                                                                              Вы правы, тут я фигню написал. «that ? do_this» и «do_this if that» отличаются порядком следования выражений.
                                                                                                        +6
                                                                                                        В чем удобство? В том, что выглядит красиво, все ровно в столбик? Любой человек, бегло взглянув на этот кусок, будет уверен, что url всегда собирается из 5 частей. Это очень опасная конструкция.
                                                                                                          –9
                                                                                                          Ага, в этом удобство. И если не перегружать этим код, то все очень приятно и всем понятно. Не вижу причины не использовать это.
                                                                                                            +14
                                                                                                            > Ага, в этом удобство.
                                                                                                            Дак это не удобство, а красота. Вам лучше заняться рисованием, в таком случае.

                                                                                                            > и всем понятно
                                                                                                            При беглом взгляде непонятно.
                                                                                                              –8
                                                                                                              Взрослые слова, взрослого мужчины!
                                                                                                        –4
                                                                                                        О, да, на вопрос где еще. Везде где синтаксис разрешает использовать тернарный условный оператор. Включая C, Python, PHP, JS. Только это не везде считается хорошей практикой из-за возможной неоднозначности. В Руби неоднозначность просто разрешают убрать (else).
                                                                                                          +7
                                                                                                          Ну вот видите, вы даже неправильно понимаете эту конструкцию. Это не тернарный оператор с опущенным else, это вывернутое на изнанку условный оператор. Т.е.
                                                                                                          a = b if that
                                                                                                          означает
                                                                                                          if that a = b
                                                                                                          а не
                                                                                                          a = that ? b : null

                                                                                                          Такого нет в перечисленных вами языках.
                                                                                                            –4
                                                                                                            Python:
                                                                                                            a = "b" if 1 > 0 else "c"
                                                                                                            
                                                                                                              +4
                                                                                                              Езе раз: вы даже неправильно понимаете эту конструкцию.

                                                                                                               a = b if that

                                                                                                              означает
                                                                                                              if that
                                                                                                                a = b

                                                                                                              а не
                                                                                                              a = (b if that else null)
                                                                                                                –5
                                                                                                                Поменяйте null на undefined, и будет ровно то же самое.
                                                                                                                  +6
                                                                                                                  А так?
                                                                                                                  a = c
                                                                                                                  a = b if that

                                                                                                                  И так?
                                                                                                                  killAllHumans() if that

                                                                                                                  Что, ровно то же самое?
                                                                                                                  –4
                                                                                                                  Собственно выбросьте else, потому что если do_this if that, если that не истинно ничего не выполниться. Я изначально не говорил, что это тернарный оператор, это был пример определение-условие.
                                                                                                                    +4
                                                                                                                    > Собственно выбросьте else

                                                                                                                    Откуда? Из вашего примера на Питоне?
                                                                                                                    >>> a = "b" if 1 > 0
                                                                                                                    SyntaxError: invalid syntax


                                                                                                                    >>> Назовите еще один ЯП, где используется такая конструкция?
                                                                                                                    >> Везде где синтаксис разрешает использовать тернарный условный оператор.
                                                                                                                    > Я изначально не говорил, что это тернарный оператор.

                                                                                                                    Что, простите?
                                                                                                                      –5
                                                                                                                      Вопрос изначально стоял в том, что: a = b if that больно уж дивно, а = b if that else this, нет. Я не совсем понимаю, почему первый вариант это странно и ужасно, а второй с гораздо более сложной логикой, очень даже ок.
                                                                                                                        +6
                                                                                                                        Ну потому что вы не понимаете принципиальных различий этих конструкций.

                                                                                                                        Во втором варианте написано «а ровно». Справа написано чему: «тому или тому». При любом исходе выражение «а ровно» будет исполнено.

                                                                                                                        В первом варианте тоже написано «а ровно», но на самом деле «а может и не равно, и вообще я передумал, эта строчка ничего не делает». Хорошо когда выражение состоит из трех слов. Но потом оно разростается, условие переносится на вторую или третью строчку.

                                                                                                                        Никто не спорит, что «а ровно тому или тому» это проще и удобнее чем «если что-то то а равно тому, иначе а ровно другому», но тут другая история.
                                                                                                                          –2
                                                                                                                          Я понимаю, просто я, наверное, не правильно выразился. Суть была не в том, что это одно и тоже, а в том, что это выглядит похоже и помещается в одну строчку и что оба варианта имеют право на жизнь. Вот, более развернутый ответ.
                                                                                                                            +6
                                                                                                                            Эти выржаения похожи и делают принципиально разные действия. Это кстати еще одна проблема, в том, что эток кошмар с условным оператором после выражения похож на безобидный тернарный оператор.
                                                                                                                              –2
                                                                                                                              Ну как по мне, так оба этих выражения одинаково предсказуемы. Я никогда не испытывал проблем ни с одним из них.
                                                                                                                                +4
                                                                                                                                А вам надо неприменно испытать проблемы? У конструкции есть объективный недостаток: она затрудняет чтение кода. Выше я вам написал «Любой человек, бегло взглянув на этот кусок кода, будет уверен, что url всегда собирается из 5 частей». Это просто есть, спорить тут бесполезно. Разве этого недостаточно, чтобы её не использовать?
                                                                                                                                  +2
                                                                                                                                  Если вы пишете на руби, то ничего подобного вам в голову не прийдет. Потому что руббист отлично понимает, что если do_this if that, то это trailing conditional или statement modifier (простите, не уверен как правильно перевести). С вполне предсказуемым поведением. Ничем не хуже:

                                                                                                                                  if that
                                                                                                                                    do_this
                                                                                                                                  end
                                                                                                                                  
                                                                                                                                  • UFO just landed and posted this here
                                                                                                                                      –3
                                                                                                                                      Ну если вы не пишете на языке который позволяет использовать trailing conditional'ы вы и не увидите такого кода.
                                                                                                                                        +6
                                                                                                                                        Вы всё время апеллируете к руби в духе «раз в руби есть, значить и в других можно».

                                                                                                                                        Тут проблем две: во-первых, не факт, что то, что хорошо в руби, хорошо в других случаях. А во-вторых, не факт, что это хорошо в руби.

                                                                                                                                        Вообще я лично не принимаю никак апелляцию к руби. Я нахожу его синтаксис трудно воспринимаемым. Ну, т.е. «в руби отлично видно» — неправда, ничего там не видно.

                                                                                                                                        Можно, пожауйста, видеть обоснование нереального удобства этой фичи (с trailing conditional) без привлечения руби?
                                                                                                                                          –1
                                                                                                                                          Потому как CoffeeScript изначально писался с оглядкой на опыт Руби. И то что вы при этом не принимаете апелляцию к Руби, лично ваша проблема. Автор CS (не забываем, что он еще и автор Backbone с Underscore) когда создавал язык, решил перенести все, что он считает хорошим из Руби в CS.

                                                                                                                                          Я и Джереми Ашкеназ считаем, что все отлично видно, как и десятки тысяч других людей. Никто вам ничего не навязывает, никто не всучивает вам CS и не проплачивает это, сообщество само решает принимать технологию или нет.

                                                                                                                                          Удобство в том, чтобы писать одну строку вместо трех. Неужели это так трудно принять и понять?
                                                                                                                                            +5
                                                                                                                                            if (cond) x=y

                                                                                                                                            Где здесь три строки? А это — как раз точная копия вашего x=y if(cond). Только здесь сразу видно, с первых двух символов, что это условие. А теперь сравнте с x=y.lf(cond). Легко визуально отличить от trailing-условия? В нормальном случае такой путаницы вообще возникнуть не могло.
                                                                                                                                            Я вообще не понимаю, почему в этой ветке появилось сравнение с тернарным оператором, когда trailing condition являются обычным условным выражением.

                                                                                                                                            Представьте себе, как один человек диктует номер телефона другому, а тот его сразу же набирает: «один… два… два… три… семёрки...» — в подавляющем большинстве случаев будет набрана неправильная тройка. «Семёрки» и есть «trailing» выражение, меняющее смысл предыдущего выражения. Плохо, никто в здравом уме так не делает даже в обычной речи, где некоторые вольности допускаются. Зачем же это допускать в языке программирования, где вольностей хотелось бы поменьше?
                                                                                                                                              –4
                                                                                                                                              Я уже отвечал на эти вопросы, таких проблем не возникает в реальном коде. Сравнение с trailing condition появилось потому, что это однострочник такой же как и trailing condition, только без else (это тоже уже обсудили).

                                                                                                                                              Насчет номера телефона глупый приммер, взрослые люди читают текст не по буквам и не по слогам. Но это уже вопрос к лингвистам. Я вообще читаю код по строкам (если это не Лисп).

                                                                                                                                              Я бы хотел прояснить оди вопрос. Вы, не писав на языке, утверждаете, что это не удобно? То есть, например, чтобы мне заявить, что мне не нравится язык, не достаточно посмотреть и субьективно оценить, как что. Вот Python, мне понадобилось почти два года чтобы понять, что Руби мне ближе и удобнее. Я не совсем понимаю, когда вы приходите и говорите, что это ужасно. Почему тут не отписался ни один рубист, и не сказал, что trailing condition это ужас?

                                                                                                                                              Не находите, полученный в боях опыт, стоит больше, чем субъективные убиждения?
                                                                                                                                                +4
                                                                                                                                                > таких проблем не возникает в реальном коде
                                                                                                                                                Не правда.

                                                                                                                                                Насчет номера телефона очень правильный пример.

                                                                                                                                                > Я вообще читаю код по строкам
                                                                                                                                                Охотно верю. Именно по этому вы можете не испытывать проблем с trailing condition, но скорость чтения кода от этого страдает.

                                                                                                                                                > Вы, не писав на языке, утверждаете, что это не удобно?
                                                                                                                                                Я например утверждаю что это без разницы тому, кто пишет и сильно затрудняет чтение тому, кто читает.

                                                                                                                                                > Почему тут не отписался ни один рубист, и не сказал, что trailing condition это ужас?
                                                                                                                                                Так же как не отписался ни один рубист и не поддержал вас.
                                                                                                                                                  –1
                                                                                                                                                  У меня нет сил больше спорить, удачи всем вам.
                                                                                                                                                  +2
                                                                                                                                                  Я уже отвечал на эти вопросы, таких проблем не возникает в реальном коде. Сравнение с trailing condition появилось потому, что это однострочник такой же как и trailing condition, только без else (это тоже уже обсудили).

                                                                                                                                                  Однострочник — конечно, похоже. Но суть-то разная. Так-то и вызов функции, и возврат результата функции — тоже однострочники, вы же с ними на этом основании не сравниваете trailing condition?

                                                                                                                                                  Я видел ваше обсуждение, полное непонимания того, чем trailing condition отличается от тернарного оператора. И тут оно опять. В том и дело, что сравнивать нужно логически сходные конструкции, а не похожие по форме.

                                                                                                                                                  Взрослые люди в большей части мира читают слева направо. Тут ниже Мицгол раскритиковал даже выражение типа if (5==q) (как средство гарантии защиты от путаницы межу == и =), мол, «сами слева направо читайте». Ваше условие в конце ещё лучше. Почему оно в конце, когда при выполнении строки проверяется первым (и следовательно, это первое, на что нужно обратить внимание при чтении этой строки)?

                                                                                                                                                  А рубистам просто невгодно писать, что какая-то конструкция руби — это плохо, это ж надо признать неидеальность своего любимого инструмента :)

                                                                                                                                                  Что касается опыта в боях и субъективных убеждений… Я даже пробовать в бою это не хочу, я уже вижу возможные проблемы и буду их избегать.
                                                                                                                                                • UFO just landed and posted this here
                                                                                                                                                    0
                                                                                                                                                    а чем же в CS отличается
                                                                                                                                                    if cond then x=y
                                                                                                                                                    и
                                                                                                                                                    x=y if(cond)
                                                                                                                                                    ?

                                                                                                                                                    В первом случае: если выражение cond вычисляется в «истина», переменная «x» получит значение, равное результату вычисления выражения y. Если выражение cond вычисляется в «ложь», и переменная x была определена, она сохранит значение, иначе она так и будет не определена.

                                                                                                                                                    Чем отличается логика второго случая?
                                                                                                                                                    • UFO just landed and posted this here
                                                                                                                                                      • UFO just landed and posted this here
                                                                                                                                                          0
                                                                                                                                                          Вы всё-таки определись уже, что и чему соответствует, а то вы пишете:
                                                                                                                                                          На всякий случай замечу, что эквивалентом if (cond) x=y в CS является выражение if cond then x=y.

                                                                                                                                                          а потом сразу же
                                                                                                                                                          Отличается тем, что в первом случае это выражение, возвращающее результат. Т.е. если на JS мы можем написать:

                                                                                                                                                          x = test? a: b,

                                                                                                                                                          то на CS нужно писать:

                                                                                                                                                          x = if test then a else b.

                                                                                                                                                          if (cond) в js не возвращает результат. Видите противоречие между вашими же постами? Какой-то из них — ошибка ;)
                                                                                                                                                          • UFO just landed and posted this here
                                                                                                                                                              0
                                                                                                                                                              Я утверждал следующее: в js

                                                                                                                                                              if (cond) statement;

                                                                                                                                                              это абсолютно то же самое, что в cs

                                                                                                                                                              statement if(cond)

                                                                                                                                                              (заметьте, здесь нет никакого else)

                                                                                                                                                              Вы зачем-то начали меня поправлять, причём с ошибкой, т.к. if… then из cs нельзя буквально перевести на js — следовательно, это не одно и то же.
                                                                                                                                                              • UFO just landed and posted this here
                                                                                                                                                                  0
                                                                                                                                                                  У вас проблемы с логикой.

                                                                                                                                                                  Утверждение
                                                                                                                                                                  в js

                                                                                                                                                                  if (cond) statement;

                                                                                                                                                                  это абсолютно то же самое, что в cs

                                                                                                                                                                  statement if(cond)

                                                                                                                                                                  верно. В чём проблема? В том, что я не говорил про второй вариант? А обязан был? Я нигде не утверждал, что на cs или js это нельзя написать по-другому. Хотите ещё вариант на JS, который будет работать так же? Пожалуйста:
                                                                                                                                                                  for (var i = 0; (i < 1) && cond; i++) statement;
                                                                                                                                                                  (тут есть дополнительная переменная — можно это обойти, выбирая в цикле какое-нибудь до этого не использовавшееся имя, и удаляя его после использования — влом это писать, поверьте, возможно).
                                                                                                                                                                  Что же, теперь и ваше утверждение «неполно».
                                                                                                                                                                  • UFO just landed and posted this here
                                                                                                                                                                      0
                                                                                                                                                                      С какой стати я должен был про него упоминать? Утверждая «а эквивалентно б», я не обязан писать, что «также возможно написать похожее утверждение с». Я вообще-то для этого и не обязан знать, что существует вариант с. Когда я утверждаю, что а и б — одно и то же, для этого мне совершенно не требуется с.

                                                                                                                                                                      Кстати, а вы знали, что for можно заменить if? А ещё его (if) можно написать чере while. Не только в js. И что-то я до сих пор ни разу не встречал документации, в которой об этом прямо писали бы в разделе об условных конструкциях, а особенно — сравнивая условные конструкции одного языка и другого. Все авторы этой документации неправы?

                                                                                                                                                                      Давайте не передёргивать. Изначальное утверждение: то, что в js — if(cond) statement;, в cs — statement if(cond), и наоборот. Это верное и самодостаточное утверждение, не требующее обязательных дополнений, т.к. выполняется абсолютно всегда в корректных для обоих языков случаях. Именно это я утверждал. Ещё я утверждал, что это наоборот не эквивалентно тернарной операции, которую вы снова зачем-то приплетаете. У вас проблемы с различением разных конструкций языка что ли?
                                                                                                                                                                      • UFO just landed and posted this here
                                                                                                                                                                          0
                                                                                                                                                                          Я не мог подобное утверждать.
                                                                                                                                                                          Дайте ссылку на это утверждение, пожалуйста.
                                                                                                                                                                          • UFO just landed and posted this here
                                                                                                                                                                              0
                                                                                                                                                                              Простите, у вас точно проблемы с логикой. Каким обраэом из этого следует, что
                                                                                                                                                                              в CS условие иначе, чем «statement if(cond)» записать нельзя

                                                                                                                                                                              ?
                                                                                                                                                                              • UFO just landed and posted this here
                                                                                                                                                                                  +1
                                                                                                                                                                                  Теперь вы утверждаете, что кто-то не знающий CoffeeScript, прочитал, что кто-то был неприятно поражён некоей конструкцией CoffeScript, и на основании этого всерьёз предположил, что других конструкций там нет, и теперь будет основываться на этом предположении, не проверяя.

                                                                                                                                                                                  Самому не смешно?
                                                                                                                                                                                  • UFO just landed and posted this here
                                                                                                                                                                                      0
                                                                                                                                                                                      Нет. Я однако ни из чего не делал вывод, будто есть только конечная форма и никаких больше не бывает.
                                                                                                                                                                                      (Моё понимание о CS ограничивается статьёй о deferred и promise, которая была недавно на хабре, и собственно после этой статьи он мне неприятен.)

                                                                                                                                                                                      Я стесняюсь спросить, а какое это имеет отношение к утверждению о том, что trailing-форма — плохо? Даже если бы я сам знал язык, и никогда не её не использовал бы сам, мне неминуемо пришлось бы читать эту форму (и спотыкаться каждый раз об неё). Само по себе наличие такой форме в языке делает его хуже, неважно, есть там другие конструкции на эту тему или нет. Особенно, когда адепты её приводят в пример как очень хорошую и предпочтительную.
                                                                                                                                                                            +1
                                                                                                                                                                            > будто в CS условие иначе, чем «statement if(cond)» записать нельзя.
                                                                                                                                                                            Вы неправильно поняли. Никто из высказавшихся так не считает.
                                                                                                                                                                            • UFO just landed and posted this here
                                                                                                                                                                                0
                                                                                                                                                                                Одной строки — нет. Десятка строк, из которых одна такая — да, вижу проблему.
                                                                                                                                                                                  +4
                                                                                                                                                                                  Я видел проблему с восприятием строк, которые я видел. Например:

                                                                                                                                                                                  checkOptions = (options) ->
                                                                                                                                                                                    throw new Error("invalid options") unless options.one
                                                                                                                                                                                    for option in ['one', 'two']
                                                                                                                                                                                      value = options[option]
                                                                                                                                                                                      unless !value or value.match /^\d+x\d+$/i
                                                                                                                                                                                        throw new Error("invalid options.#{option} ")

                                                                                                                                                                                  Чтение такой функции происходит примерно так: Так функция, принимает аргументы, бросает исключение. Wtf, как бросает исключение? Она вообще не работает? Ах да, долбаный unless.
                                                                                                                                                                                  • UFO just landed and posted this here
                                                                                                                                                                                • UFO just landed and posted this here
                                                                                                                                                                                    0
                                                                                                                                                                                    Хватит уже передёргивать, то, что я не знал что можно по-другому, не значит, что я думал, будто по-другому нельзя. И никто так не думал.

                                                                                                                                                                                    Давайте, строгая логика. Пока утверждение не доказано, оно не истина. К негативным утверждениям это тоже относится: пока не доказано, что некоторое утверждение неверно, оно не являешься ложным. Я не могу утверждать, что нечто невозможно, на том основании, что я не знал, что именно возможно, а что нет.
                                                                                                                                                                                    • UFO just landed and posted this here
                                                                                                                                                          +3
                                                                                                                                                          Никто вам ничего не навязывает

                                                                                                                                                          Пост как раз о том, что навязывают, лезут с CS туда, куда не просят.
                                                                                                                                                            –1
                                                                                                                                                            Кто навязывает? Какая-то корпорация, да?
                                                                                                                                                              +1
                                                                                                                                                              Те, кто на нем пишет. Не все, но есть такие.
                                                                                                                                                      +4
                                                                                                                                                      Да не важно это. В нормальном потоке строк разной длины совершенно не видно, что одна из строк выполняется только по условию. Хоть на руби пиши, хоть на чем.
                                                                                                                                                        –3
                                                                                                                                                        Ну если учесть, что методы в руби редко превышают 30 строк все отлично видно.

                                                                                                                                                        Интересно, как вы все повернули, что мой опыт, пишущего код на этом языке уже два полных года, гораздо менее ценен, ваших представлений о том, как это могло бы быть :)
                                                                                                                            +5
                                                                                                                            Perl
                                                                                                                              –2
                                                                                                                              Ну Perl это вообще WORN язык, ему можно.
                                                                                                                                0
                                                                                                                                Нет, он просто не стал копировать другие языки и выглядит непривычно, но при понимании его синтаксиса и наличии подсветки в IDE, язык очень понятен и удобен.
                                                                                                                              +5
                                                                                                                              Perl поддерживает оба варианта.
                                                                                                                              do_something() if ($flag);
                                                                                                                              

                                                                                                                              if ($flag) do_something();
                                                                                                                              
                                                                                                                                –3
                                                                                                                                Осталось только провести парсинг кода, написанного когда либо на Perl, сравнить частоту использования первого и второго варианта и мы узнаем судьбу CoffeeS (кто уже знает ответ чур не подсказывать!)
                                                                                                                                +1
                                                                                                                                Perl.

                                                                                                                                (отредактировано) два раза уже Перл назвали, оказывается.
                                                                                                                                  0
                                                                                                                                  Для меня вобще дико видеть в ЯП конструкцию вида: определение-условие (statement-condition). Для меня более логично выглядит условие-определение

                                                                                                                                  Чем дико, чем логично? Цикл с постусловием вам тоже дик и нелогичен?
                                                                                                                                    0
                                                                                                                                    Вы сравнили мелкое с мягким. Цикл с постусловием — по определению цикл, тело которого выполнится хотя бы один раз. Вполне отдельная самостоятельная конструкция. По-другому его можно выразить (через цикл с предусловием), продублировав тело перед циклом. Ну, то есть, смысл конструкции отличается от цикла с предусловием.

                                                                                                                                    А условное выражение в данном случае просто записано вперёд ногами, назад головой, но от этого оно не получило никакого нового логического наполнения. Условие — оно и в африке условие.
                                                                                                                                      –1
                                                                                                                                      Так и это по определению отдельная самостоятельная конструкция, а не другая форма записи. По крайней мере в Ruby так.

                                                                                                                                      А что вы скажете на условие типа A B = IF DO_SMTH THEN? :) Тоже дикое и не логичное? Нет, просто другая логика.
                                                                                                                                        0
                                                                                                                                        Нет-нет, не отдельная конструкция. Т.е. да, в конкретном языке, если вы его пишете на бизоне или там antlr, это конечно оформляется как отдельная конструкция. В tcl вообще все конструкции такого вида — это вызов процедуры, т.е.
                                                                                                                                        if {$q == 5} {
                                                                                                                                        x
                                                                                                                                        } else {
                                                                                                                                        }
                                                                                                                                        — это вызов процедуры «if» с аргументами "$q == 5" (сначала произойдёт подстановка переменной q), "\n x\n", «else» и "\n". Можно определить свою процедуру которую назвать «если» и использовать там «иначе» с такой же логикой, как у if, и писать всё по-русски: если {$q==5} { x } иначе { }. Можно определить и так, что ветка «true» будет идти после ветки «false» (как бы if… else… then ...). Постусловием определить нельзя, т.к. первой всегда идёт команда (имя процедуры).

                                                                                                                                        Но условие всё равно остаётся условием, какой бы синтаксической конструкцией конкретного языка оно ни реализовывалось. Я хочу сказать только, что вне зависимости от конкретного синтаксиса, условие должно быть первым потому, что оно при выполнении проверяется машиной первым — т.е. что форма должна в некотором роде соответствовать содержанию.
                                                                                                                                          –2
                                                                                                                                          Я хочу сказать только, что вне зависимости от конкретного синтаксиса, условие должно быть первым потому, что оно при выполнении проверяется машиной первым

                                                                                                                                          Во-первых в «должно» логики нет. Код пишется для людей, а не для машины. Во-вторых, не удивлюсь если современные процессоры (может по подсказке компилятора, может сами) вычислят все три блока параллельно (если они не зависят друг от друга), а потом просто лишний выбросят и это будет реально быстрее.
                                                                                                                                            –1
                                                                                                                                            Не удержался и сделал:
                                                                                                                                            Скрытый текст
                                                                                                                                            #!/usr/bin/tclsh
                                                                                                                                            
                                                                                                                                            proc если {args} {
                                                                                                                                                for {set i 0} {$i < [llength $args]} {set i [expr 1+$i]} {
                                                                                                                                                    if {[string equal "иначе" [lindex $args $i]]} {
                                                                                                                                                        set args [lreplace $args $i $i "else"]
                                                                                                                                                    }
                                                                                                                                                }
                                                                                                                                                if {*}$args
                                                                                                                                            }
                                                                                                                                            
                                                                                                                                            proc послать {args} {
                                                                                                                                                puts {*}$args
                                                                                                                                            }
                                                                                                                                            
                                                                                                                                            если 0 {послать hi} иначе {послать lo}


                                                                                                                                            Привет любителям 1С :)
                                                                                                                                            0
                                                                                                                                            А что вы скажете на условие типа A B = IF DO_SMTH THEN?

                                                                                                                                            Ну, оно уж точно выполняется ровно в том порядке, в каком написано. В отличие от прочих обсуждаемых конструкций.
                                                                                                                                          +1
                                                                                                                                          Цикл с постусловием вам тоже дик и нелогичен?


                                                                                                                                          Если бы постусловие проверялось в начале выполнения цикла, то оно было бы нелогично. Но поскольку один раз тело цикла выполняется всегда, то почему бы его не написать до условия (которое находится ровно в той точке программы, в которой выполняется).
                                                                                                                                          А вот третье выражение оператора for… тут можно и подумать, на месте ли оно.
                                                                                                                                            0
                                                                                                                                            Ну да, пример с for более удачно показывает, что не всегда то, что идет вначале обязательно выполняется.
                                                                                                                                          –1
                                                                                                                                          На вскидку, таких выражения возможны в Perl, Python, Ruby, Haskell, F# и пр.
                                                                                                                                            –1
                                                                                                                                            В Питоне точно нет. Читайте обсуждение выше.
                                                                                                                                            • UFO just landed and posted this here
                                                                                                                                                +2
                                                                                                                                                Это другая конструкция. Читайте обсуждение выше.
                                                                                                                                                • UFO just landed and posted this here
                                                                                                                                                    0
                                                                                                                                                    > Ну и что, что другая.
                                                                                                                                                    То, что не о ней разговор.

                                                                                                                                                    > Конкретно эти инструкции в CS и питоне — эквивалентны.
                                                                                                                                                    И что. Не о ней речь.

                                                                                                                                                    > Я сейчас не говорю про trailing expression modifier!
                                                                                                                                                    Ну и кыш отсюда.
                                                                                                                                                    • UFO just landed and posted this here
                                                                                                                                                        0
                                                                                                                                                        Она менее кривая, чем в CS. Она не trailing expression. Читая её слева направо, как обычно, не пропустишь и не упустишь факт, что это — условие.
                                                                                                                                                        • UFO just landed and posted this here
                                                                                                                                                            0
                                                                                                                                                            А, вы про эту конструкцию. Я сразу не понял. Ну она появилась в обсуждении случайно, потому, что у одного из пропонентов CS нет понимания, чем условная конструкция отличается от тернарного оператора, я опять же не вижу, чего его тут обсуждать. Да, этот оператор везде одинаковый, за исключением того, что в половине языков он (expr)?v1:v2, а в другой половине — if expr (then) v1 else v2, более «словесный».
                                                                                                                                                              0
                                                                                                                                                              А в python expr1 if cond else expr2. Не очень он одинаков получается…

                                                                                                                                                              Согласитесь, что это не то же, что if cond then expr1 else expr2, который и исполняется слева направо. А не из центра выражения, как в PEP-308.
                                                                                                                                                          0
                                                                                                                                                          > Т.е. вы уклоняетесь от ответа
                                                                                                                                                          От ответа на что? Вопрос заданный вами в рамках этой дискуссии не относится к этой дискуссии. Если у вас есть вопрос, относящийся к данной ветке, задайте его здесь. Если у вас есть вопрос, относящийся к топику, задайте его отдельным комментарием. Если ваш вопрос вообще не к чему не относится, но вам все равно интересно мое мнение, напишите личное сообщение, в конце концов. Я не хочу просто так разводить флейм.
                                                                                                                                                          • UFO just landed and posted this here
                                                                                                                                                              –1
                                                                                                                                                              Потому что это принципиально разные конструкции. Читайте выше.
                                                                                                                                                              • UFO just landed and posted this here
                                                                                                                                                                  0
                                                                                                                                                                  Плохо и то, и другое.

                                                                                                                                                                  Условная конструкция чуть хуже, чем тернарный оператор, т.к. используется чаще.
                                                                                                                                                    –2
                                                                                                                                                    Кстати говоря, в этой конструкции в пайтоне всё на своём месте: сначала условие, потом реакция в зависимости от условия. Никаких trailing-условий.

                                                                                                                                                    Хотя конструкция так себе, да.
                                                                                                                                                    • UFO just landed and posted this here
                                                                                                                                                        0
                                                                                                                                                        Я уже тут писал про tcl — ну так в tcl процедура if тоже возвращает результат, правда, обычно, его никто не использует. Но написать что-то вроде set x [if {expr1} {...} {...}] всё равно можно. В пайтоне абсолютно так же.

                                                                                                                                                        Само по себе условное выражение здесь — в правильном порядке. То, что оно как оператор в целом может иметь результат — это вопрос другой. Но условие сначала, ветки потом. В естественном порядке. Если ты выучил уроки, можешь идти погулять.
                                                                                                                                                        • UFO just landed and posted this here
                                                                                                                                                            0
                                                                                                                                                            Да-да, верно, просто ветка так плавно перетекла в обсуждение этой конструкции, что я не сразу заметил.
                                                                                                                                                              0
                                                                                                                                                              x = 5 if cond else 3
                                                                                                                                                              

                                                                                                                                                              Читается это так: «Икс присвоить 5 если cond иначе 3». Звучит более-менее естественно. После обыденного "?:" надо привыкнуть, конечно, но это не трудно.

                                                                                                                                                                0
                                                                                                                                                                И какие после этого могут быть наезды на пост-условие?))

                                                                                                                                                                По PEP-308 понятно откуда оно берется (как замена cond and expr1 or expr2, но ломает привычный порядок вещей куда сильнее, чем пост-условие.

                                                                                                                                                                Всё-таки порядок вычисления «второй операнд, потом первый или третий» — это куда более пи#$ец, чем «второй операнд, потом первый, если это необходимо».

                                                                                                                                                                Вспоминается:
                                                                                                                                                                Спросите питониста, чем хорош питон, и он вам процитирует ихнюю философию программирования, называемую «The Zen of Python», а в частности:
                                                                                                                                                                Простое лучше, чем сложное.
                                                                                                                                                                Сложное лучше, чем запутанное.
                                                                                                                                                                Плоское лучше, чем вложенное.
                                                                                                                                                                Читаемость имеет значение.
                                                                                                                                                                Если реализацию сложно объяснить — идея плоха.

                                                                                                                                                                Именно по этому питонисты очень гордятся генераторами.

                                                                                                                                                                Например, для того, чтобы двумерный массив array = [[1, 2], [3, 4], [5,]] превратить в одномерный, питонисты пользуются вот таким простым кодом:
                                                                                                                                                                [element for subarray in array for element in subarray]
                                                                                                                                                                
                                                                                                                                                                Не правда ли просто, не сложно, не запутанно, читаемо и легкообъясняемо?

                                                                                                                                                                А вот несчастные рубисты мучаются с:
                                                                                                                                                                array.inject &:+
                                                                                                                                                                
                                                                                                                                                                или
                                                                                                                                                                array.flatten
                                                                                                                                                                

                                                                                                                                                                А бедные хаскелисты вообще надрываются:
                                                                                                                                                                concat array
                                                                                                                                                                
                                                                                                                                                                  +2
                                                                                                                                                                  > Всё-таки порядок вычисления «второй операнд, потом первый или третий»
                                                                                                                                                                  > — это куда более пи#$ец, чем «второй операнд, потом первый, если это необходимо».

                                                                                                                                                                  В случае Питоньего тернарного оператора дело только в порядке вычисления. Да, я согласен что Кофевская конструкция в этом плане правильнее (можете так и записать, что я согласился, что что-то в кофе лучше чем в питоне). Но какое отношение все это имеет к постусловиям?

                                                                                                                                                                  > превратить в одномерный, питонисты пользуются вот таким простым кодом:

                                                                                                                                                                  Ну вы может быть таким пользуетсь, а вообще есть sum(array, []).
                                                                                                                                                                    0
                                                                                                                                                                    В случае Питоньего тернарного оператора дело только в порядке вычисления.

                                                                                                                                                                    А в случае пост-условия дело в чём, если не в порядке вычисления? Его недостатком называли именно запись операндов не в том порядке, как они вычисляются…

                                                                                                                                                                    А про цитату — это была шутка, если что. Навеянная кому-то каким-то из туториалов по пайтону, где это было примером того, для чего нужны comprehensions (не знаю соответствующего русского термина).
                                                                                                                                                                • UFO just landed and posted this here
                                                                                                                                                                    0
                                                                                                                                                                    Да, это используется в художественных целях. Например, в песне The Beatles — Revoltion есть такой момент, где конец резко меняет смысл всей фразы на обратный.

                                                                                                                                                                    Это художественные цели. Программирование — не художественные цели, здесь такие украшения неуместны.
                                                                                                                                                        –1
                                                                                                                                                        Если синтаксис требует инструкции else, это не значит что таких выражения нет:

                                                                                                                                                        x = 1 if 1 else 2