Telegram Group Search
Такс внимание, я узнал что эффекты бывают двух видов

tail resumptive
продолжают выполнение только последним экспрешоном, правила такие же как в тэйл рекурсии

умные троли говорят что такие системы неотличимы от тупых трейтов, тк кк по сути им эквивалентны(соглы)

Вот самые простоые примеры
не продолжаем вообще:
def unsafeDiv(a: Double, b: Double): Double / {} =
try {
div(a, b)
} with Exception {
def throw(msg) = {
panic(msg)
}
}

Продолжаем в конце
def tellTime[A] { prog: () => A / tell }: A =
try { prog() }
with tell { () =>
resume(bench::timestamp())
}

или вот еще, продолжения 2, но оба внутри иф елса
def filter[A] { keep: A => Bool } { prog: () => Unit / Yield[A] }: Unit / Yield[A] =
try prog()
with Yield[A] {
def yield(x) = if (keep(x)) { do yield(x); resume(()) } else { resume(()) }
}


multi-shot эффекты
могут продолжаться несколько раз, или в середине
ровно в тысячу раз сложнее в реализации, сначала я даже не мог понять, каким это образом можно продолжить из эффекта код 2 раза
код
код
переменная
x = эффект
код2

handle эффект {
код
resume(1)
код
resume(2)

}


Так вооот, оно блять копирует котинуэйшон, то есть по сути кусок всего кода после эффекта, вместе с текущим стеком, и просто запускает его, в данном случае 2 раза
resume(1) запустит КОПИЮ код2 в кором в стеке x будет равно 1, resume(2) запустит тот же код еще раз, абсолютно изолированно от первого запуска, но с x = 2

а теперь представим что внутри продолжения есть вызовы других эффектов, насколько сложным это все начинает быть с ветвлением
gavr_sas
Такс внимание, я узнал что эффекты бывают двух видов tail resumptive продолжают выполнение только последним экспрешоном, правила такие же как в тэйл рекурсии умные троли говорят что такие системы неотличимы от тупых трейтов, тк кк по сути им эквивалентны(соглы)…
то есть, страшно подумать, но вот здесь

val x = choose(1, 2, 3)
val y = choose(4, 5)
println(x + y)

fun handleChoose(choices: List<Int>, k: (Int) -> List<Int>): List<Int> =
choices.flatMap { choice -> k(choice) }


с таким хендлером, запустятся все варианты choose
1 + 4 = 5
1 + 5 = 6
2 + 4 = 6
2 + 5 = 7
3 + 4 = 7
3 + 5 = 8

то есть это уже полиморфизм какого то нереального уровня, мы можем поставить эффект с обычным рандомом, а можем такой который переберет нам все возможные варианты
(чую нужен пост про эффекты в целом)
алгебраические эффекты, это ответ монадам в сторону упрощения!
#ENA

Они решают все проблемы программирования!
- цветные🏳️‍🌈 функции
- корпоративную💼 многозадачность
- генераторы
- эксепшоны(этот пример даже был выше)
- полиморфизм наивышего уровня, ООП сасать
пример имеем дженерик код вызывающий эффект лог

вызываем этот лог с хендлером который пишет в базу\ пишет в мок базу\ пишет в консоль

- глобал стейт\инверсия зависимостей
хуясе че функциональщики придумали
def unsafeDiv(a: Double, b: Double): Double / {} =
try {
div(a, b)
} with Exception {
def throw(msg) = {
panic(msg)
}
}

def main() = {
unsafeDiv(1.2, 0.0)
()
}


> /Fun/Effekt/out/hello.js:146
else throw e
^
division by zero

Node.js v24.2.0
[error] Process exited with non-zero exit code 1.


афигенно, спасиба папаша, за этот замечательный "стек трейс"
Просто вывело что был throw Внутри сгенерированного js кода!
(Effekt - язык университетских скалистов)

я что один думаю как это потом будет юзаца, тоже ведь кодогеню, но вывожу из стактрейса оригинальные строчки, пока это возможно(скрин)
Forwarded from ASCII-Nova 🇺🇦
Читал про киевлян фаундеров Grammarly и случайно для себя обнаружил, что Grammarly использует Common Lisp для грамматического движка. Ого!

https://www.grammarly.com/blog/engineering/running-lisp-in-production/
cute
Там распространяются новости о вакцине о ВИЧ, lenacapavir, которая полностью защищает от ВИЧ. Но, об этом ещё год назад был пост, и на удивление весьма похож на то что я собирался писать уже. Я ещё тогда писал о профилактике, но сейчас читаю что раньше типа использовали для лечения, но только потом поняли что работает и на профилактику отлично, причём для профилактики не нужно комбинировать с другими лекарствами. Из нового видно что на женщинах 100% эффективность, а на мужчинах занимающихся половыми связями с другими мужчинами - 96%. Также упоминается потенциал для создания единоразовых вакцин против ВИЧ и дальнейшего уменьшения цены на этот препарат:
https://time.com/7295343/fda-hiv-shot-lenacapavir-yeztugo/

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

методы делятся на 2 вида, методы для мутабильных и иммутабильных типов

ранее у меня было 2 типа каждой коллекции, унаследованные от котлина MutableList и List, MutableSet и Set итд, ужасно некрасиво

теперь когда мутабильные типы можно передавать как аргументы внуть функций или держать внутри полей типов, ничего не мешает мне избавится от этих двойных коллекций, и просто объявить типы мутирующие коллекции для мутабл версий типов коллекций

то есть
mut List add::T = ...
теперь если вызвать этот add на обычной коллекции будет ошибка

вся это начисто спизжено у nim, с некотороыми отличиями, нельзя переприсваивать поля из любого места,
- только из методов того же типа чье поле, это сузит радиус атаки багов на конкретные методы внутри которых можно поставить принт и увидеть мутации этого поля со всей программы
- создавать мутабл типы из иммутбл можно только клонированием

ну и мутабл типы можно отправлять в иммутабл без потерь
абсолютно сумашедшая фича смоллтолка
сообщение a become: b, которое подменяет все инстансы объекта а на б
"It is a feature of enormous power - and danger."
https://gbracha.blogspot.com/2009/07/miracle-of-become.html
Торвальдс и Гейтс сейчас
——
чесно говоря у меня в голове все еще образ Торвальдса показывающего фак невидии
Понадобилось найти быстрый простой коноплятор сишки, шоб не жыр как LLVM GCC
под m1 оказалось нет ничего(и из сурсов не собирается(собирается но тесты не проходит))

Первая интересная весщь из этого списка это QBE, как я понимаю от автора яп Hare
QBE - бекенд компиля с 70% производительности за 10% кода, имеет замечательный ir семантически похожий на васм, стековые инструкции внутри обычных функций с аргументами, но тут в отличии от васма где всего 2 типа данных дробные и целые, есть аж строки, и аби совместимость с сишкой.
есть все базовые оптимизации DCE CE, какие то сплит сплит еры, даже не знаю шо це

https://c9x.me/compile/

реализация C11 на QBE!
https://github.com/michaelforney/cproc

всем известный tiny C Compiler, все еще жив и обновляется
https://github.com/TinyCC/tinycc

Компилятор из Амстердама, от уника, главная оссобенность - поддержка доисторических архитектур времен палеозоя
https://github.com/davidgiven/ack

Simple C compiler, по началу кажется что новый tcc, но тут чето инфы совсем мало, древние люди живут в мэйлинг листе и не на гихабе, вроде это опять QBE, но оно недопилено
может компилится без либс зависимости, со своей bare metal реализацией
https://www.simple-cc.org/
внимание, Медовик!
https://openjdk.org/jeps/254
оказывается в JVM есть фича compact Strings, она автоматом представляет строку в кодировке Latin-1 вместо UTF-16 если это возможно

В UTF-16 каждая буква по байту,
в Latin-1 всего 256 — то бишь англ алфавит(ASCII) + 128 европейских символов вроде é, ñ, ø, ß, à, ç по 1 байту

красота, а я сидел с устаревшей инфой в что в жабе жутко жырные строки
(кирилицы нетъ >_<)
2025/06/24 20:50:30
Back to Top
HTML Embed Code: