• Одинаковы ли два кода?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Если promise разрешается с не-промисным значением value, то promise.then(value => value) и promise.then(value => Promise.resolve(value)) эквивалентны promise в приведённой выше цепочке.
    Статусы этих промисов одинаковы.

    Если promise разрешается с промисным значением value, то promise.then(value => value) и promise.then(value => Promise.resolve(value)) эквивалентны: они вернут промис, который разрешается со значением, с которым разрешается value.

    P.S. честно говоря, я не знаю, как сделать промис, который бы разрешался со значением, который сам по себе является промисом. Беглое лурканье и SO подсказывают, что это невозможно, разве только будем оборачивать возвращаемый во время разрешения промис в объект (ссыль)
    Ответ написан
    6 комментариев
  • Есть ли разница в вызове функций?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    const d = {
      b: a.b,
      c: function() { alert('wow'); }
    };
    
    d.b();

    Пояснение на всякий случай:
    при вызове d.b() будет исполнена та же функция, что записана в a.b(), но this=d.
    Ответ написан
    Комментировать
  • Почему на клиенте используют js а не php?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Может, я и не понял контекст вопроса, но не один из предложенных вариантов ответа не отвечает на поставленный вопрос. Итак, почему же на клиенте сейчас используется JS, а не PHP?

    Кратко: так исторически сложилось.
    PHP исходно был собран как интерпретируемый скриптовый язык для серверной генерации домашних страниц, позже был превращен в полноценный инструмент для серверного программирования.
    JS был заказан ради внедрения в один конкретный браузер и впервые был анонсирован перед выпуском второй бета-версии Netscape Navigator. Затем он в виде диалектов перекачевал в другие браузеры, ибо идея DHTML (разметка на HTML, оформление на CSS, интерактив и прочая клиентская логика на JS) понравилась многим. Затем он был стандартизован, а после 2009 начался треш.

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

    В нашей же пытаются сделать обратную вещь: запустить JS на сервере, чтобы и на клиенте, и на сервере был один язык (гуглите: изоморфный JS). Шансов, что на браузере будут нативно исполняться PHP скрипты, равны нулю. Даже dart не прижился.
    Ответ написан
    Комментировать
  • Как правильно преобразовывать в сферические координаты?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    сферические координаты задаются не по ISO (фи[0 до 360] тета [-90 до 90]), а в другом представлении (фи[0-180] тета [-180 до 180]).

    Точно не перепутаны местами углы? Так-то диапазон для одно из них (долгота) должен быть 360, для другого (широта) 180.

    Если же поменять местами, то есть в одном случае долгота от 0 до 360 и широта от -90 до 90, а в другом долгота от -180 до 180 и широта от 0 до 180, то необходимо добавить преобразование
    phi1 = phi < 180 ? phi : phi - 360;
    theta1 = theta + 90;

    где (phi,theta) в ISO, а (phi1,theta1) в формате пользователя. Обратное преобразование выписывается аналогично:
    phi = phi1 < 0 ? phi1 + 360 : phi1;
    theta = theta1 - 90;


    Скажем, нужно Вам, чтобы SphericalToCartesian интерпретировала входные phi,theta в пользовательском формате. Вы пишите
    float r = sphericalCoordinates.x;
            float theta = sphericalCoordinates.y;
            float phi = sphericalCoordinates.z;
            phi = phi < 0 ? phi + 360 : phi; // впрочем, конкретно эта строка не влияет на результат
            theta = theta - 90;

    Аналогично для другого преобразования.
    Ответ написан
  • Как измерить время выполнения функции в Haskell?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Прокомментирую только приведённый код.

    Во-первых, в многоаргументных функциях $! нужно делать не только на внешнем уровне, но и на всех остальных, т.е. (f $! x) $! y, иначе строгость относится только к первому аргументу и созданию
    чанка.

    Во-вторых, компилятор хитёр, но один из вариантов его обдурить заключается в оборачивании вычисляемого выражения в хитрую монаду. Хитрее IO придумать сложно.
    import Data.Time
    
    testTime n func arg1 arg2 = let
      list = (replicate $! n) $! (arg1, arg2)
      func' ~(x, y) = return $ (func $! x) $! y
      in do
        start <- getCurrentTime
        sequence $ (map $! func') $! list
        stop <- getCurrentTime
        print (diffUTCTime stop start)
    Ответ написан
    Комментировать
  • Как будет выглядеть callback функция?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Задача:
    есть изменяющаяся во времени среда, нужно запустить асинхронный процесс, который будет периодически проверять некоторое условие и, если оно выполняется, единожды вызовет функцию и завершится.
    // условие, когда нужно исполнить функцию и завершить процесс
    function readIsOK(read) {
      return read != last_read;
    }
    
    // какие-то осмысленные действия, когда условие удовлетворяется
    function doSomething(result) {
      if (last_read < result) {
            //...тут какой-то код
      } else if (last_read > result) {
            // ...тут какой-то код
      }
    }
    
    // функция, которая запускает процесс
    function start() {
      // функция, которая ежесекундно проверяет условие
      // если условие выполняется, делает полезное действие
      // иначе процесс продолжается до следующего вызова checkRead
      function checkResult() {
        var result = getRead();
        if(readIsOK(result)) doSomething(result);
        setTimeout(checkResult, 1000);
      }
      // запускаем первую итерацию
      checkResult();
    }
    
    start();

    Этот код принципиально ничем не отличается от Вашего.
    Что мы можем хотеть сделать? Абстрагироваться от doSomething и last_read. На данный момент они являются внешними параметрами.
    Абстракция от doSomething и будет колбеком, который Вы желаете.
    // условие, когда нужно исполнить функцию и завершить процесс
    function readIsOK(read) {
      return read != last_read;
    }
    
    // какие-то осмысленные действия, когда условие удовлетворяется
    function doSomething(result) {
      if (last_read < result) {
            //...тут какой-то код
      } else if (last_read > result) {
            // ...тут какой-то код
      }
    }
    
    // функция, которая запускает процесс
    function start(callback) {
      // функция, которая ежесекундно проверяет условие
      // если условие выполняется, делает полезное действие
      // иначе процесс продолжается до следующего вызова checkRead
      function checkResult() {
        var result = getRead();
        if(readIsOK(result)) callback(result);
        setTimeout(checkResult, 1000);
      }
      // запускаем первую итерацию
      checkResult();
    }
    
    start(doSomething);

    Теперь можно сделать, например,
    start(() => start(() => alert("hi!")));
    Так после окончания первого процесса запустится второй, после окончания которого будет сообщение.

    Важный момент: Вам, вероятно, захочется после каждого процесса запускать следующий, используя вместо last_read значение предыдущего result. Для этого необходимо абстрагироваться от last_read. Передача между двумя процессами уже реализована.
    Ответ написан
    Комментировать
  • Как написать регулярку для sed?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    sed -n '/^[0-9].*\.$/ p'
    Ответ написан
    Комментировать
  • Как называется округлый знак неравенства в математической статистике?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Слева случайная величина, справа распределение.
    Как называется, увы, не знаю.

    P.S. всё это выражение является формулой, то есть можно говорить о выводимости/невыводимости.
    Ответ написан
    3 комментария
  • Чем рисовать анимированный график?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Wolfram Mathematica (8.0)

    f[x_, t_] := Abs[Sin[x] Exp[I t] + Sin[3 x] Exp[I t] + Sin[5 x] Exp[3 I t]];
    
    xmax = 2; tmax = 10;
    fmax = NMaxValue[{f[x, t], 0 < x < xmax, 0 < t < tmax}, {x, t}]
    
    frames = Table[Plot[f[x, t], {x, 0, xmax},
        PlotRange -> {-(1/5) fmax, 6/5 fmax},
        ImageSize -> 500,
        PlotStyle -> Directive[Thickness[0.01], RGBColor[99/256, 100/256, 202/256]],
        Axes -> None,
        Background -> RGBColor[66/256, 69/256, 136/256]
        ], {t, 0, tmax, 0.1}];
    
    ListAnimate[frames]
    
    Export["/disk/animation.gif", frames, "DisplayDurations" -> 0.02]


    Стили взяты из приведённого Вами желаемого вида.
    Здесь строится явно список кадров, так удобнее экспортировать в GIF и комбинаровать их с другим набором кадров.

    n1ruwunskfzvgaamchfrqohx9vc.gif
    Ответ написан
    3 комментария
  • Деструктуризация?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Babel немного проясняет этот вопрос.

    Как мне кажется, на данный момент поведение в таких случаях зависит от интерпретатора. Если интересует поведение, которое должно быть по спецификации ES6, открывай её и читай там.
    Ответ написан
  • Неправильно отображается diff в bitbucket. Как исправить?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    diff берётся построчно. Проблема в том, что строки неправильно распознают из-за того, что перенос строк обозначается по-разному в разных коммитах.

    Подробная информация и как лечить легко гуглится.
    Если кратко, меняйте git config --global core.autocrlf

    P.S. вот на тостере есть похожая тема: Как решить проблему с окончанием строк Git + phpStorm?
    Ответ написан
  • Что использовать в haskele для работы с матрицами?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Есть поисковик hoogle:
    hoogle.haskell.org/?hoogle=%3A%3A+%5B%5Ba%5D%5D+-%...
    он предлагает функцию transpose из модуля Data.List.

    Если у Вас матрица не список списков, а что-то другое, уточните.
    Ответ написан
    Комментировать
  • Как улучшить код?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Насколько я представляю, если не вводить дополнительные переменные, то только
    function adjacentElementsProduct (inputArray) {
        return inputArray
            .sort()
            .slice(-2)
            .reduce((total, num) => total * num);
    }

    Если с доп. переменными, то
    function adjacentElementsProduct (inputArray) {
        const [ x, y ] = inputArray
            .sort()
            .slice(-2);
        return x * y;
    }

    Ну и как намекнул iamevg_, можно поиграться с пробельными символами.
    P.S. учтите, что для Вашей задачи можно выбрать более оптимальный алгоритм.
    Ответ написан
    3 комментария
  • Как заменить пару символы на драгие пары символов в строке?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Однострочник
    f :: String -> String -> String -> String
    f str a b = let n = length a in if take n str == a then b ++ f (drop n str) a b else if str == "" then "" else head str : f (tail str) a b

    Свойства решения: ленивое, работает с бесконечными строками, заменяет первое вхождение подстроки a на b в случае неоднозначной замены (напр., f "aaa" "a" "b" == "ba"), временная сложность O(N) по N = length(str).
    Что можно улучшить: 1) обработка хвоста длины < length(b), 2) оформить код как многострочную читаемую функцию, 3) выделить функцию \s -> f s a b как локальную или даже поменять исходных порядок аргументов.
    Ответ написан
  • Как получить аргументы из конструктора в классе?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    А что Вы хотите? Вы вызываете new Clock с одним аргументом, а в теле используете два. Поэтому options принимает значение переданного объекта с полями template и name, а sub -- undefined.

    Скажите, чему, по Вашему желанию, должны равняться options и sub в этом примере.
    Ответ написан
    3 комментария
  • Метод прототипа это instance member или static?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Традиционно методы прототипа относят к статичным.

    Если сравнивать прототипную организацию объектов и классовую, все поля (и, как следствие, методы) прототипа едины для всех объектов с этим прототипом (если они не имеют собственных полей с тем же ключом), то есть два разных объекта с одним прототипом имеют одинаковое значение тех полей, значение которых определяется прототипом. Это соответствует статичным членам класса, которые так же являются едиными для всех экземпляров класса.
    Ответ написан
    Комментировать
  • Как правильно написать jsdoc для кода внутри самовызывающейся функции?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    У меня код, написанный по первому варианту Alex Ander, не даёт нужный результат.
    Код, который не связывает имена с пространством имён
    /**
     * @namespace ZZZ
     */
    (function() {
      /** @lends ZZZ */
      
      /**
       * my function.
       */
      function f() {
      }
      
      /**
       * my variable.
       */
      var x = 2;
      
    })();

    Вот моё предложение:
    /**
     * @namespace ZZZ
     */
    (/** @lends ZZZ */function() {
    
      /**
       * my function.
       */
      function f() {
      }
      
      /**
       * my variable.
       */
      var x = 2;
      
    })();

    Этот код добавляет имена с атрибутом inner (т.е. ZZZ~f, ZZZ~x), причём явное указание static или instance не менияет этого, разве что только явно не указан memberof, как во втором примере Alex Ander.
    В целом, lends непосредственно перед функцией function() {} добавляет все имена на верхнем синтаксическом уровне в модуль/класс/неймспейс с атрибутом inner.
    Ответ написан
    Комментировать
  • Чем отличается scope от лексического окружения?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    Выскажу мнение: я всегда считал, что это одно понятие.

    Scope — это окружение, в котором исполняется код функции, когда функция вызывается обычным образом.
    Для обеспечения статического связывания переменных и аргументов, которое также называется лексическим замыканием, спецификация JS предполагает, что во время создания функции-как-объекта у неё появляется поле [[Scope]], которое содержит контекст исполнения, в котором функция создана, и в качестве прототипа использует [[Scope]] контекста (обычно, [[Scope]] той функции, в теле которой создана рассматриваемая функция). Когда функция вызывается, она использует этот свой [[Scope]] для того, чтобы создать контекст исполнения своего кода.
    Подробнее: javascript.ru/ecma/part10 (намеренно даю ссылку на 3-ю редакцию)
    Поэтому мне не понятно, почему кто-то говорит, что scope не существует, когда его существование явно требуется спецификацией языка. Разве что в том смысле его не существует, что интерпретатор не обязан явно этот объект создавать, но и об этом спецификация говорит.
    Ответ написан
    Комментировать
  • Что я сделал не так в GIT?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    b454 — это коммит перед fix menu. Судя по всему, Вы пытались сделать git checkout на этот коммит (обозначив его, например, через HEAD^) для того, чтобы откатиться назад.
    Судя по логам, client указывает на коммит fix menu.
    Вы можете откатиться к нему, написав (сначала git checkout client, если вдруг Вы что-то сделали после поста) git reset --hard client. Это вернёт Вас (и рабочую директорию) строго к этому коммиту. Затем Вы перейдёте в master и оттуда сделаете merge.
    Ответ написан
    Комментировать
  • Как правильно задокументировать код JSDoc?

    youngmysteriouslight
    @youngmysteriouslight
    ТК, ТТ, JS, FP, WM
    JSDoc 3.5.5
    /** @module ZModule */
    (function() {
    
    /**
     * an array of instances.
     * @memberof module:ZModule
     */
    var instances = [];
    
    /**
     * retrieve an instance.
     * @memberof module:ZModule
     * @return an instance
     */
    function getInstance() { return instance[0]; }
    
    /**
     * Constructor of a new instance.
     * @memberof module:ZModule
     * @class module:ZModule.createInstance
     */
    function createInstance() {
       return /** @lends module:ZModule.createInstance# */ {
           /**
            * param.
            */
           objParam1: 42,
           /**
            * method.
            * @return an integer
            */
           objMethod1: function() { return 24; }
       }
    }
    
    window.myModules.myModule1 = {
       instances: instances,
       createInstance: createInstance,
       getInstance: getInstance
    }
    
    })();
    Ответ написан
    Комментировать