1563
Обсуждение дизайна языков программирования (как новых, так и существующих). Литература: https://github.com/true-grue/Compiler-Development Создание и устройство компиляторов: @CompilerDev Для новичков: @pld_beginners
Я бы сказал — зависит от. В некоторых случаях можно определить обработчик в виде композиции других обработчиков (например, если у них тип unit -> unit ).
С другой стороны, если назначение обработчиков — сделать побочный эффект (у каждого свой), а не трансформировать событие, то зачем их композить?
Ну, как бы, Reactive Streams в Java и FRP - это разное. И Rx тоже немного не то. Там нет общей концепции.
Читать полностью…
Я имею в виду общую концепцию. https://en.wikipedia.org/wiki/ReactiveX в ту же степь, и остальные "псевдо FRP" библиотеки.
Читать полностью…
Какая разница, Java или нет? Не на то сообщение ответ?
Читать полностью…
Ну и мы уже отлично знаем, что обработчики событий не композятся, надёжнее использовать reactive streams... 😁
Читать полностью…
Иногда использую такой прием. Обычно это можно интерпретировать как событие, и обработчики для этого события. Обработчик можно добавить перед уже добавленными, и-или после уже добавленных.
Читать полностью…
При чём, даже, в принципе, достаточно эффективно. Потому что можно сначала накомпозить себе какую-нибудь процедуру таким образом, а потом скомпилировать её.
Читать полностью…
Наверное, под cross-cutting concern в контексте AOP следует понимать функционал, который добавляется к модулю, но от которого модуль не зависит. Потому как, если модуль зависит от этого функционала, то он явно его подключает и использует — и техники AOP не нужны.
Читать полностью…
Вы смешиваете 2 независимые ветки беседы.
Читать полностью…
Проблема cross-cutting, решение не. Трассировку ведь тоже не по всей программе включают
Читать полностью…
В принципе, мы можем искусственно аннотировать точки соединения (чтобы что-то не упустить).
Например, мы можем определить функцию со специальным именем, которая ничего не делает (identity function), и использовать ее в тех местах, где нужно подсоединять соответствующие аспекты.
Все еще AOP, но некоторый срез намеренно задается "внутри" модулей.
#aop #crosscutting
Эмуляция AspectJ — это не то же самое, что реализация AOP. 😊
Выше обсуждали, что AOP вообще начался с loop fusion — на before/after его сделать не получится. Поди, и на AspectJ его сделать не получится, так что непонятно, почему они говорят, что сделали AOP. 😏
Я уже это упоминал в диалоге. Боюсь внятно объяснить это займёт слишком много времени
Читать полностью…
Потому что это две разных задачи. Потому что внутренние системы страдают от проблем с тулингом. Потому что теряется связность языка. Да много причин
Читать полностью…
а не будут ли мои макросы этим самым language workbench
Читать полностью…
Оставляя "RFP a la Conal Elliot" за скобками, общая концепция, как отметил @ruv256 выше, как минимум в использовании асинхронных очередей сообщений/данных и трансформации этих очередей (как целого, при помощи комбинаторов). Это обеспечивает композиционность, в отличие от "голых" обработчиков сообщений.
Читать полностью…
Не знаю как конкретно в Java Reactive Streams, а .NET Rx включают ещё и скедулер для всего этого дела, и ещё пару скедулеров и обвязок для отладки, и прочее по мелочи. Дельный набор.
Читать полностью…
Которые reactive streams? Типа, асинхронная очередь?
В JavaScript — reactive-streams / reactive-streams-js
Это до тех пор, пока практика ограничена одной программой/библиотекой/командой разработки — как только 3 разные библиотеки начнут мутировать одно и то же каждая под свои нужды... станет очень весело разбираться и отлаживать. 😏
Читать полностью…
Ok. Я не к тому, что именно так надо делать. А к тому, что смотрите, как оно бывает на экзотических островах.
Читать полностью…
Есть такая книженция Software Design for Flexibility, там в первой главе обсуждаются различные игры с функциями в стиле. Вот есть у нас (define f (lambda (x) ...)), а потом мы берём, пишем какой-нибудь композитор для функций, и используем его, чтобы вокруг f накручивать функциональность. Например (set! f (after f (lambda (x) (display x)))). Можно и покрасивше оформить, но суть в том, чтобы просто иметь некую мутабельную переменную, вокруг которой наверчивается функциональность.
Оно, конечно, typefree и мутабельно... 🤷♂️ Но работает неплохо на практике.
Одна была про AOP, а вторая про что? 😊
Читать полностью…
Как раз таки нет, это локализованная проблема, потому что в логах ищется не "любая фигня", а какая-то конкретная фигня/сообщение, которое производится конкретным куском программы.
Снова не нужно путать идею (в данном случае, "сигнализировать о проблеме неизвестной стороне") и её реализацию. Можно сигнализировать не через логи, а через MQ, например.
Тогда это НЕ аспект, а кусок функциональной корректности.
Читать полностью…
Какое же это "cross-cutting", если оно за пределы одной функции не выходит?! 😂
Читать полностью…
Согласен. Но, это ведь не относится к корректности формы.
Формально, та часть программы/системы, которая читает протоколы — это аспект, который зависит от аспекта протоколирования. Вполне ожидаемо, что при выключении протоколирования, зависимые от него аспекты на это как-то "отреагируют".
Чтобы покрыть такие случаи, можно сказать: при выключении аспекта и всех зависимых от него аспектов.
#aop #crosscutting
шо за проблемы с тулингом. чо за проблема со связностью
Читать полностью…
Очень слабым и сложным. Делать что-то внутри языка всегда сложнее, чем делать это снаружи. Посмотрите тот же JetBrains MPS
Читать полностью…
Для этого есть language workbench
Читать полностью…