Такс внимание, я узнал что эффекты бывают двух видов
tail resumptive
продолжают выполнение только последним экспрешоном, правила такие же как в тэйл рекурсии
умные троли говорят что такие системы неотличимы от тупых трейтов, тк кк по сути им эквивалентны(соглы)
Вот самые простоые примеры
не продолжаем вообще:
Продолжаем в конце
или вот еще, продолжения 2, но оба внутри иф елса
multi-shot эффекты
могут продолжаться несколько раз, или в середине
ровно в тысячу раз сложнее в реализации, сначала я даже не мог понять, каким это образом можно продолжить из эффекта код 2 раза
Так вооот, оно блять копирует котинуэйшон, то есть по сути кусок всего кода после эффекта, вместе с текущим стеком, и просто запускает его, в данном случае 2 раза
resume(1) запустит КОПИЮ код2 в кором в стеке x будет равно 1, resume(2) запустит тот же код еще раз, абсолютно изолированно от первого запуска, но с x = 2
а теперь представим что внутри продолжения есть вызовы других эффектов, насколько сложным это все начинает быть с ветвлением
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 продолжают выполнение только последним экспрешоном, правила такие же как в тэйл рекурсии умные троли говорят что такие системы неотличимы от тупых трейтов, тк кк по сути им эквивалентны(соглы)…
то есть, страшно подумать, но вот здесь
с таким хендлером, запустятся все варианты choose
1 + 4 = 5
1 + 5 = 6
2 + 4 = 6
2 + 5 = 7
3 + 4 = 7
3 + 5 = 8
то есть это уже полиморфизм какого то нереального уровня, мы можем поставить эффект с обычным рандомом, а можем такой который переберет нам все возможные варианты
(чую нужен пост про эффекты в целом)
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
Они решают все проблемы программирования!
- цветные🏳️🌈 функции
- корпоративную💼 многозадачность
- генераторы
- эксепшоны(этот пример даже был выше)
- полиморфизм наивышего уровня, ООП сасать
пример имеем дженерик код вызывающий эффект лог
вызываем этот лог с хендлером который пишет в базу\ пишет в мок базу\ пишет в консоль
- глобал стейт\инверсия зависимостей
#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/
https://www.grammarly.com/blog/engineering/running-lisp-in-production/
grammarly blog
Running Lisp in Production
At Grammarly, the foundation of our business, our core grammar engine, is written in Common Lisp. It currently processes more than a thousand sentences per…
gavr_sas
Читал про киевлян фаундеров Grammarly и случайно для себя обнаружил, что Grammarly использует Common Lisp для грамматического движка. Ого! https://www.grammarly.com/blog/engineering/running-lisp-in-production/
В коммон лиспе оказываестя макросы не гигиенические, пиздец
я думал это база, основа всех лиспов
мойте руки
я думал это база, основа всех лиспов
мойте руки
Forwarded from Transhumanism_in_our_hearts
Там распространяются новости о вакцине о ВИЧ, lenacapavir, которая полностью защищает от ВИЧ. Но, об этом ещё год назад был пост, и на удивление весьма похож на то что я собирался писать уже. Я ещё тогда писал о профилактике, но сейчас читаю что раньше типа использовали для лечения, но только потом поняли что работает и на профилактику отлично, причём для профилактики не нужно комбинировать с другими лекарствами. Из нового видно что на женщинах 100% эффективность, а на мужчинах занимающихся половыми связями с другими мужчинами - 96%. Также упоминается потенциал для создания единоразовых вакцин против ВИЧ и дальнейшего уменьшения цены на этот препарат:
https://time.com/7295343/fda-hiv-shot-lenacapavir-yeztugo/
Главная новость в том, что FDA одобрил данный препарат и его уже готовят к выпуску коммерческому. В остальном нового мало, но тоже неплохо.
https://time.com/7295343/fda-hiv-shot-lenacapavir-yeztugo/
Главная новость в том, что FDA одобрил данный препарат и его уже готовят к выпуску коммерческому. В остальном нового мало, но тоже неплохо.
TIME
FDA Approves a Twice-Yearly Shot to Prevent HIV
The approval could slow new infections and move the world closer to eliminating HIV. But huge obstacles remain.
я переделал мутабилити чучуть, теперь мутабл поле можно хранить внутри типа
методы делятся на 2 вида, методы для мутабильных и иммутабильных типов
ранее у меня было 2 типа каждой коллекции, унаследованные от котлина MutableList и List, MutableSet и Set итд, ужасно некрасиво
теперь когда мутабильные типы можно передавать как аргументы внуть функций или держать внутри полей типов, ничего не мешает мне избавится от этих двойных коллекций, и просто объявить типы мутирующие коллекции для мутабл версий типов коллекций
то есть
теперь если вызвать этот add на обычной коллекции будет ошибка
вся это начисто спизжено у nim, с некотороыми отличиями, нельзя переприсваивать поля из любого места,
- только из методов того же типа чье поле, это сузит радиус атаки багов на конкретные методы внутри которых можно поставить принт и увидеть мутации этого поля со всей программы
- создавать мутабл типы из иммутбл можно только клонированием
ну и мутабл типы можно отправлять в иммутабл без потерь
методы делятся на 2 вида, методы для мутабильных и иммутабильных типов
ранее у меня было 2 типа каждой коллекции, унаследованные от котлина MutableList и List, MutableSet и Set итд, ужасно некрасиво
теперь когда мутабильные типы можно передавать как аргументы внуть функций или держать внутри полей типов, ничего не мешает мне избавится от этих двойных коллекций, и просто объявить типы мутирующие коллекции для мутабл версий типов коллекций
то есть
mut List add::T = ...
теперь если вызвать этот add на обычной коллекции будет ошибка
вся это начисто спизжено у nim, с некотороыми отличиями, нельзя переприсваивать поля из любого места,
- только из методов того же типа чье поле, это сузит радиус атаки багов на конкретные методы внутри которых можно поставить принт и увидеть мутации этого поля со всей программы
- создавать мутабл типы из иммутбл можно только клонированием
ну и мутабл типы можно отправлять в иммутабл без потерь
абсолютно сумашедшая фича смоллтолка
сообщение
"It is a feature of enormous power - and danger."
https://gbracha.blogspot.com/2009/07/miracle-of-become.html
сообщение
a become: b
, которое подменяет все инстансы объекта а на б"It is a feature of enormous power - and danger."
https://gbracha.blogspot.com/2009/07/miracle-of-become.html
Blogspot
The Miracle of become:
One of Smalltalk’s most unique and powerful features is also one of the least known outside the Smalltalk community. It’s a little method ca...
Понадобилось найти быстрый простой коноплятор сишки, шоб не жыр как 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/
под 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/
GitHub
GitHub - michaelforney/cproc: C11 compiler (mirror)
C11 compiler (mirror). Contribute to michaelforney/cproc development by creating an account on GitHub.
https://openjdk.org/jeps/254
оказывается в JVM есть фича compact Strings, она автоматом представляет строку в кодировке Latin-1 вместо UTF-16 если это возможно
В UTF-16 каждая буква по байту,
в Latin-1 всего 256 — то бишь англ алфавит(ASCII) + 128 европейских символов вроде é, ñ, ø, ß, à, ç по 1 байту
красота, а я сидел с устаревшей инфой в что в жабе жутко жырные строки
(кирилицы нетъ >_<)
оказывается в JVM есть фича compact Strings, она автоматом представляет строку в кодировке Latin-1 вместо UTF-16 если это возможно
В UTF-16 каждая буква по байту,
в Latin-1 всего 256 — то бишь англ алфавит(ASCII) + 128 европейских символов вроде é, ñ, ø, ß, à, ç по 1 байту
красота, а я сидел с устаревшей инфой в что в жабе жутко жырные строки
(кирилицы нетъ >_<)