2012-04-16 2 views
4

Я узнал о 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 подразумевает передачу возвращаемого значения функции в другую функцию, а затем выход из нее.

ответ

3

В каком смысле это асинхронное? Он очень похож на использование анонимного обратного вызова с закрытием, что является распространенной техникой в ​​асинхронном программировании, управляемом событиями, с той разницей, что в этом случае обратный вызов назначается как часть более крупной структуры/объекта для последующего использования, что означает , когда используется анонная функция, является неопределенной - скорее всего, после первоначальный вызов возвращает - делает его «асинхронным», тогда как в этом примере функция используется внутренне вызывающим, поэтому существует синхронный порядок. Возможно, вы объединили эти две разные идеи? В этот момент они будут выглядеть одинаково, с анонимной функцией, определяемой как параметр.

«Кроме того, что трубопровод, намного чище, с трубопроводами, представляется очевидным, что данные передаются по ...

Первый: это вопрос перспективы, не правда ли ? Я полагаю, что в командной строке может быть немного легче понять первый раз, когда вы ее видите, но вещь «CPS» не кажется очень скачкообразной. Это также довольно часто; «Сортировка» встроенных функций на многих языках выполняет функцию «сравнения» и использует ее более или менее одинаково.

Второе: Эти две вещи не эквивалентны. С трубой, что вы делаете это:

var x = replace(whatever); 
x = filter(x); 

Передача возвращаемого значения одной функции на другую и использовать выход из этого. В то время как с аргументом функции filter() называется заменой(), и его выход используется внутренне с помощью replace().

+0

В асинхронной точке: Реализация, которую я рассматривал, - это когда обратный вызов выполняется как асинхронный вызов setTimeout, а не синхронный вызов прямой функции. Я не имел в виду не по порядку.В javascript, чтобы сделать CPS, вы неизбежно должны пройти обратный вызов, если только доход не считается CPS. Кроме того, я бы сказал, что две вещи концептуально эквивалентны, когда CPS выполняется с помощью хвостовых вызовов. –

+0

Существует заметная разница в том, что результат «хвостового вызова» может повлиять на результат функции закрытия. Это не относится к трубопроводам. В трубе то, что происходит в result(), влияет на то, что происходит в filter(), но это все еще не содержит возможностей CPS, где replace определяет, что фильтр делает, но фильтр также может влиять на результат. Примером этого является сортировка/сравнение. Вероятно, CPS ** не ** подходит для выполнения чего-то, что может быть выполнено с помощью процедурной трубы x = f1(); х = 2 (х). Или: используя функцию (str) {return 'red'} "в качестве второго аргумента для замены. – delicateLatticeworkFever

+0

Другой способ взглянуть на это, pipe vs. CPS: x = f1 (f2()) дублирует канал, если это означает, что * возвращаемое значение * f2() является аргументом arg для f1(). Но это не CPS. – delicateLatticeworkFever

Смежные вопросы