Упомянутый Termux — сам по себе неплохой "линукс". Есть ряд базовых утилит, а также даже свой пакетный менеджер, позволяющий много чего установить дополнительно.
А ещё Clear Linux. Но зачем? Ресурсов стало опять слишком много, надо бы ещё один уровень абстракции навернуть, чтоб софт как тормозил, продолжал тормозить?
Я как-то на сайте аудиофилоф наткнулся то ли на DIY ЦАП, то ли на усилитель, в описании которого был отслушанный припой, собранный из каких-то старых приборов 19хх года.
Тот же раст — весь полон монад (Result, Some, Either, etc), но слово "монада" нигде не встречается. Вместо этого дают приятный сахар (с глубокими архитектурными последствиями) и массу гарантий качества. (тот же ?, который позволяет писать почти-что-bind не ломая мозг).
И это очень грустно, ведь раст полон копипасты, условно, map для Option, map для Iterator и так далее. При этом, в некоторых "монадах" одни возможности появляются раньше, чем в других. А для некоторых (async/await) требуется поддержка компилятора, так что даже библиотекой не исправишь. И все это мешает писать по-настоящему обобщенный и абстрактный код, как в хаскеле.
Я сегодня писал около-хеллоуворлд на расте, и столкнулся с неудобством обработки Result даже с "?". Хотел пройти по директории и напечатать содержимое. (См. read_dir).
fn print_entry(entry: Result<DirEntry>) -> Result<()> {
let path = entry?.path();
let path = path.to_str().or_not(Error::new(/*skip*/))?;
println!("{}", path);
}
fn main() -> Result<()> {
for entry in read_dir(Path::new("/")) {
let _ = print_entry(entry):
}
}
Чтоб скипать итерацию цикла с ошибкой при помощи оператора ?, пришлось внести кусок в отдельную функцию (ладно, это нормально), результат которой игнорируется (выгдядит как костыль). А чтоб использовать? для Option, а на для Result, пришлось None в Err превращать.
Не исключаю, что сидел было лучше, я в расте нуб. Но пока впечатление такое, во это все далеко не элегантно.
Я не DBA, но мне казалось, что и без знаний реляционной алгебры и всех определений из нее можно пользовался реляционными БД. Можно даже знать и применять нормальные формы на уровне эмпирических правил.
Насколько я понимаю, монада (функтор, аппликатив и другие) — это удобный и высоко абстрактный "интерфейс", использование которого вместо каких-то конкретных структур данных позволяет писать очень абстрактный код. Например, map можно применить к листу, к дереву, к графу, в Option и так далее, ко всему, что является функтором.
Можете привести пример исключений из красивых концепций? Мне кажется, что, примером исключений из концепций является C++, который (по моему скромному опыту, я больше по Си) состоит из исключений и замороченного поведения чуть менее, чем полностью. (Например, я все еще немного вздрагиваю, когда надо возвращать что-то из функции. Ну да, guaranteed copy elision, но похоже на магию).
Попробую высказать критику на критику и дополнения. Я соглашусь с вами в двух пунтках:
Rust еще слишком молод. Думаю, следствием этого являются пункты "Набор инструментов", "Интеграция", "Производительность" и "Unsafe". Есть основания полагать, что со временем будет происходит улучшение в этом плане. Ошибки есть и в GCC (сам видел).
Rust сложен и имеет более крутую кривую входа
Я бы еще добавил, что проблема в том, что Rust позиционируется как более безопасный язык, чем Си, но компилятор он слишком неформализован и активно развивается, чтобы быть сертифицированным для применения в каких-то реально safety-critical задачах, где, к примеру, сертифицирован лишь какой-нибудь IAR.
Еще из недостатков (как следствие молодости) добавлю малое количество библиотек. На С++, не говоря уже о С, больше. Захотел я GUI писать и приуныл. Пока что самая зрелая — веб-гуи на WASM, yew.
Не всё программирование является системным
Не соглашусь. Rust дает преимущества и не в системном программировании, не за счет модели работы с памятью, а за счет своей системы типов (ADT, pattern matching и все такое). Например, подход Option вместо исключений может сделать более понятным (по сигнатуре видно) и безопасным. Но проблема в том, что как, уже сказано, Rust имеет сложности, и все равно придется думать о владении, памяти, лайфтаймах и всяких Rc<RefCell>
Упомянутый Termux — сам по себе неплохой "линукс". Есть ряд базовых утилит, а также даже свой пакетный менеджер, позволяющий много чего установить дополнительно.
Может, еще дело в софте? Intel Compiler, VTune, всякие Threading Building Blocks, оптимизированные MPI и так далее.
А ещё Clear Linux. Но зачем? Ресурсов стало опять слишком много, надо бы ещё один уровень абстракции навернуть, чтоб софт как тормозил, продолжал тормозить?
Эх, что-то меня это будущее не радует.
Я как-то на сайте аудиофилоф наткнулся то ли на DIY ЦАП, то ли на усилитель, в описании которого был отслушанный припой, собранный из каких-то старых приборов 19хх года.
Да, спасибо. Я уже догадался, что я совершенно забыл про все эти функции, о чем я написал выше.
Я хотел просто пропустить те файлы, которые почему-то Err(), а не выходить из функции по первой ошибке.
PS. А почему я не использовал
map()иbind()? Зациклился, блин, на операторе ?...0xd34df00d проживает в США, если память не изменяет.
И это очень грустно, ведь раст полон копипасты, условно, map для Option, map для Iterator и так далее. При этом, в некоторых "монадах" одни возможности появляются раньше, чем в других. А для некоторых (async/await) требуется поддержка компилятора, так что даже библиотекой не исправишь. И все это мешает писать по-настоящему обобщенный и абстрактный код, как в хаскеле.
Я сегодня писал около-хеллоуворлд на расте, и столкнулся с неудобством обработки Result даже с "?". Хотел пройти по директории и напечатать содержимое. (См. read_dir).
Чтоб скипать итерацию цикла с ошибкой при помощи оператора ?, пришлось внести кусок в отдельную функцию (ладно, это нормально), результат которой игнорируется (выгдядит как костыль). А чтоб использовать? для Option, а на для Result, пришлось None в Err превращать.
Не исключаю, что сидел было лучше, я в расте нуб. Но пока впечатление такое, во это все далеко не элегантно.
Я не DBA, но мне казалось, что и без знаний реляционной алгебры и всех определений из нее можно пользовался реляционными БД. Можно даже знать и применять нормальные формы на уровне эмпирических правил.
Насколько я понимаю, монада (функтор, аппликатив и другие) — это удобный и высоко абстрактный "интерфейс", использование которого вместо каких-то конкретных структур данных позволяет писать очень абстрактный код. Например,
mapможно применить к листу, к дереву, к графу, вOptionи так далее, ко всему, что является функтором.Тут очень хорошо написано, на мой взгляд: монады как паттерн переиспользования кода
Можете привести пример исключений из красивых концепций? Мне кажется, что, примером исключений из концепций является C++, который (по моему скромному опыту, я больше по Си) состоит из исключений и замороченного поведения чуть менее, чем полностью. (Например, я все еще немного вздрагиваю, когда надо возвращать что-то из функции. Ну да, guaranteed copy elision, но похоже на магию).
Попробую высказать критику на критику и дополнения. Я соглашусь с вами в двух пунтках:
Я бы еще добавил, что проблема в том, что Rust позиционируется как более безопасный язык, чем Си, но компилятор он слишком неформализован и активно развивается, чтобы быть сертифицированным для применения в каких-то реально safety-critical задачах, где, к примеру, сертифицирован лишь какой-нибудь IAR.
Еще из недостатков (как следствие молодости) добавлю малое количество библиотек. На С++, не говоря уже о С, больше. Захотел я GUI писать и приуныл. Пока что самая зрелая — веб-гуи на WASM, yew.
Не соглашусь. Rust дает преимущества и не в системном программировании, не за счет модели работы с памятью, а за счет своей системы типов (ADT, pattern matching и все такое). Например, подход Option вместо исключений может сделать более понятным (по сигнатуре видно) и безопасным. Но проблема в том, что как, уже сказано, Rust имеет сложности, и все равно придется думать о владении, памяти, лайфтаймах и всяких Rc<RefCell>
А ещё есть Kenshi, практически полностью подходит под описание.
git консольный + gitk для графического дерева коммитов (но можно и в консоли тоже) + meld для диффов/мерджей.
Можно ли считать лисп ФП?
Хм, может какой-нибудь ПИД-регулятор?
По какому критерию отбирали? Почему нет C# и Java, если уж есть питон, которому тоже нужен рантайм? Или даже Ruby? Или JS?
Выглядит как типичная задача ТАУ.