Расширение функциональности clojure core.async

Рекомендуется ли расширять функциональность core.async с помощью моих собственных асинхронных функций?

Асинхронность каналов обрабатывается put! и take!, которые принимают обратные вызовы, но протоколы вложены в async.impl.protocols. Означает ли внедрение остаться в стороне! в данном случае или их можно внедрить?

Например, я мог бы обернуть канал netty или сокет java как ReadPort и WritePort.


person Michael Deardeuff    schedule 31.10.2013    source источник
comment
Что ж, раньше здесь был ответ, в котором говорилось, что, по сути, дерзайте! Кажется, это было отозвано.   -  person Michael Deardeuff    schedule 03.11.2013
comment
Я бы сказал, делай, что хочешь!   -  person Hendekagon    schedule 04.11.2013
comment
@Hendekagon, но если протокол скрыт, вероятность его изменения без предварительного уведомления выше. Это был бы медведь.   -  person Michael Deardeuff    schedule 04.11.2013
comment
Я удалил свой ответ, потому что неправильно понял вопрос. Я думал, вы спрашиваете, используете ли вы, а не внедряете ли! и возьми! было хорошо. Но я понятия не имею, разрешено ли вам реализовывать их самостоятельно.   -  person Leon Grapenthin    schedule 05.11.2013


Ответы (1)


Назначение протоколов core.async состоит в том, чтобы служить хуками реализации для реализации ваших собственных буферов, каналов, портов и т. д. Они существуют в рамках реализации, поскольку являются частью реализации, а не общедоступного пользовательского API.

Команда считает, что они открыты для изменений до тех пор, пока не будет выпущена не-альфа-версия библиотеки (у меня нет сроков для этого). С момента выпуска асинхронного режима до сих пор протоколы не изменились, однако на данный момент в процессе есть критические изменения, особенно для put! и take!.

Если вы готовы заниматься перехватом изменений на данный момент, не стесняйтесь реализовывать их по своему усмотрению.

Тим Б. потратил довольно много времени на изучение подключения асинхронных каналов к сети, и это очень сложно сделать, сохраняя при этом семантику канала. Рекомендуемый шаблон для этого сейчас — использовать выделенные потоки, которые взаимодействуют с сетевым вводом-выводом и взаимодействуют «на границе» с каналами в приложении (вероятно, используя put! и take!). Этот шаблон не требует реализации внутренних протоколов.

person Alex Miller    schedule 05.02.2014