Nov. 27th, 2011

juan_gandhi: (Default)
Ну типа надо же выползти. Всего-то 60 миль, но устал что-то сильно, хотя гор было мало. Но горы не так уж утомляют; утомляет почему-то плоская местность. Ну и правда кошелёк забыл, и питался пятью бутербродами, так что довольно голодный вернулся.

Ездил на разведку в т.наз. Gilroy Hot Springs. А закрыто, блин.

В 7 вечера завалился спать, после тарелки горохового супа.

Надо чаще ездить, а то, наверное, месяц не выезжал.
juan_gandhi: (Default)
вот тут развивается дискуссия на тему как правильно обижать друг друга на интернетах; в дело вступил и Член Президиума Верховного Совета ЖЖ, и его присные и несогласные.

Я что хочу сказать.

Удивляют меня эти разборки.

Да мало ли кто меня ненавидит лютой ненавистью, считает презренным предателем и аморальным типом. Похуй. Отфрендил, забанил, и гудбай. Иной раз, правда, любопытно - когда Гильбо обозвал меня старым еврейским неудачником, я с гордостью стал носить это почётное звание, хоть оно мне и не по размеру.

Вот ещё правильная реакция на критику.

Ну короче, мы, конечно, принесли в ЖЖ нашу деревню, откуда думали, что уехали.

Но это ничего, потому что всегда можно посмеяться - и тут я даже согласен с [livejournal.com profile] kouzdra по вопросу ебанутости некоторых участников дискуссии.

Но это ничего, ничего, мне просто лень (и усталый после вчерашнего), а на самом деле надо закончить уже правку статьи на вики да пойти лампочки доразвешать на ёлке - которую вы уже видели на фото внизу.
juan_gandhi: (Default)
These days it does not matter where you publish the stuff you publish. It will be found anyway, be it in arxiv, in acm, in your blog, in github, in livejournal, in wikipedia. Just write it properly and throw it into the global cloud.

(I was looking for a solution for a factorset in Scala, and got confused by the fact that my own code is actually commented out and is unfinished, and there's nothing else anywhere.)
juan_gandhi: (Default)
гугл, с конца

В-основном спасли Кипр, цивилизацию, армян, грузин, евреев, арабов, США, и мир от чумы.

Но конец списка всегда интереснее; завершает же список lj user pioner_lj
juan_gandhi: (Default)
Не о каких-нибудь там особо хитрых; в принципе, чуть ли не двоичных значений хватает, чтобы продемонстрировать.

Начнём, конечно, с Джавы. В которой сплошь и рядом, у "плохих программистов" встречается такое:
  if (message inscanceof CancellationMessage) { application.cancelnahren(); }
  else if (message instanceof EncouragementMessage) { galera.trabalha(); }
// etc


и хорошим программистам это не нравится, и они говорят "делегейшен давай", или "смартенумы давай!"

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

Ну или енум использовать - но енум контента не имеет, это константа... тогда люди ещё как поступают: в класс вставляют этот самый енум, "тип инстанса нашего класса".
  class Message {
    enum type {
      CANCEL,
      ENCOURAGE,
      DGAF} myType;
    ....
  }
...
  switch(message.type()) {
    case CANCEL: ...
    case ENCOURAGE: ...
    case DGAF: ...
  }


и это кошернее, чем было бы писать
  class mc = message.getClass();
  if (mc.equals(CancelMessage.class)) { ... }
  else if (....


В Скале же, на самом деле, не особо стесняются расписывать по классам, но на то есть другая причина: unapply, а ещё лучше сказать, линза (обратная сторона); с помощью её можно устраивать сравнение по образцу и, в зависимости от типа, выполнять какие-то действия с параметрами конструктора.
  message match {
    case CancelMessage(timeout: TimeInSeconds) => app.cancelato(timeout)
    case EncourageMessage(text: String) => galera.listen(text); galera.trabalha
    ...
  }


Фактически эта конструкция в некотором смысле помещает исполяемый, специфический для класса параметра, код немножко в контекст этого класса (видны только параметры конструктора).

В Скале есть немножко тенденция некоторые классы объявить более равными, например Option[T], Either[Left,Right] - для них как бы некошерно употреблять кейсы, а надо использовать функциональную функцию map. В принципе, скальные библиотеки любят возвращать Option[T], и тут-то бы и применять map, да штука в том, что в случае None ничего ни к чему применяться не будет. Так что приходится расписывать кейс. И со списками, что характерно, кейс приходится писать: как правило, разбивая ситуацию на два случая - пустой список или голова с хвостом, неважно, пустым или нет.

Так же и на Хаскеле - или мы матчим список, или Maybe, или data type.

И вот это вот "перечисление случаев" меня как-то смущает; нельзя ли для этого дела пристроить что-то вроде map? Но блин, это ж надо передавать, вообще говоря, по специальному исполнителю на каждый отдельный жизненный случай. Как в Джаве любят писать - лисинеры, listeners - они будут теперь здоровкаться на каждый чих.

Это практически cps, continuation passing style. Как в Джаваскрипте, если вы ещё помните, что такое xhr, а не вызываете что-нибудь там вроде JQuery.doAjaxForMeHurry(), то у вас как правило два-три таких слушателя: - пока читает, - когда закончили, - если ошибка. А могли бы написать (если б могли)

  reset {
    switch {
      case STILL_READING: ...; break
      case GOT_RESULT: ...; return
      case ERROR: ...; return
    }
    shift(k) {
      do {
        var resp = XHR.doPost(myStuff)
        k(resp)
      }
    }
  }


Это было бы почти идеальное решение, да?

Не знаю, не знаю.

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

September 2025

S M T W T F S
 1 2345 6
78 9 10 111213
14 151617 181920
21222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 20th, 2025 03:25 am
Powered by Dreamwidth Studios