gavr_sas
162 subscribers
2.4K photos
163 videos
24 files
728 links
JB пропаганда
Download Telegram
все внимательно тонем в жабе
🔥2🫡1
анг сокращения
idk
iirc
fyi

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

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

а теперь представим что внутри продолжения есть вызовы других эффектов, насколько сложным это все начинает быть с ветвлением
🤓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
3
Там распространяются новости о вакцине о ВИЧ, lenacapavir, которая полностью защищает от ВИЧ. Но, об этом ещё год назад был пост, и на удивление весьма похож на то что я собирался писать уже. Я ещё тогда писал о профилактике, но сейчас читаю что раньше типа использовали для лечения, но только потом поняли что работает и на профилактику отлично, причём для профилактики не нужно комбинировать с другими лекарствами. Из нового видно что на женщинах 100% эффективность, а на мужчинах занимающихся половыми связями с другими мужчинами - 96%. Также упоминается потенциал для создания единоразовых вакцин против ВИЧ и дальнейшего уменьшения цены на этот препарат:
https://time.com/7295343/fda-hiv-shot-lenacapavir-yeztugo/

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

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

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

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

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

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

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