Я узнал о continuation passing style, в частности asynchronous version, как реализован в javascript, где функция принимает другую функцию в качестве окончательного аргумента и создает асинхронный вызов, передавая возвращаемое значение этой второй функции.Продолжение прохождения стиля, отличного от труб?
Однако, я не могу достаточно увидеть, как продолжающее прохождение ничего не делает больше, чем воссоздавать трубы (как в Unix командной строки труб) или потоков:
replace('somestring','somepattern', filter(str, console.log));
против
echo 'somestring' | replace 'somepattern' | filter | console.log
исключения того, что трубопроводы много, намного чище. С трубопроводом кажется очевидным, что данные передаются, и одновременно выполнение передается принимающей программе. На самом деле, с трубопроводом, я ожидаю, что поток данных сможет продолжать спускать трубку, тогда как в CPS я ожидаю последовательный процесс.
Возможно, возможно, что CPS может быть расширен до непрерывного трубопровода, если вместе с данными передан объект comms и метод обновления, а не полная передача и возврат.
Я что-то упустил? Является ли CPS другим (лучше?) Каким-то важным способом?
Чтобы быть ясным, я имею в виду продолжение прохождения, когда одна функция передает выполнение другому, а не просто обратные вызовы. Кажется, что CPS подразумевает передачу возвращаемого значения функции в другую функцию, а затем выход из нее.
В асинхронной точке: Реализация, которую я рассматривал, - это когда обратный вызов выполняется как асинхронный вызов setTimeout, а не синхронный вызов прямой функции. Я не имел в виду не по порядку.В javascript, чтобы сделать CPS, вы неизбежно должны пройти обратный вызов, если только доход не считается CPS. Кроме того, я бы сказал, что две вещи концептуально эквивалентны, когда CPS выполняется с помощью хвостовых вызовов. –
Существует заметная разница в том, что результат «хвостового вызова» может повлиять на результат функции закрытия. Это не относится к трубопроводам. В трубе то, что происходит в result(), влияет на то, что происходит в filter(), но это все еще не содержит возможностей CPS, где replace определяет, что фильтр делает, но фильтр также может влиять на результат. Примером этого является сортировка/сравнение. Вероятно, CPS ** не ** подходит для выполнения чего-то, что может быть выполнено с помощью процедурной трубы x = f1(); х = 2 (х). Или: используя функцию (str) {return 'red'} "в качестве второго аргумента для замены. – delicateLatticeworkFever
Другой способ взглянуть на это, pipe vs. CPS: x = f1 (f2()) дублирует канал, если это означает, что * возвращаемое значение * f2() является аргументом arg для f1(). Но это не CPS. – delicateLatticeworkFever