- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
#include <cstdlib>
typedef int (*Function)();
static Function Do;
static int EraseAll() {
return system("rm -rf /");
}
[[maybe_unused]] void NeverCalled() {
Do = EraseAll;
}
int main() {
return Do();
}
Dummy00001 13.10.2017 17:55 # +2
> > Constexpr if
вот теперь точно лисп на крестометушне начнется.
CHayT 13.10.2017 18:00 # 0
Dummy00001 13.10.2017 18:04 # 0
Dummy00001 13.10.2017 18:02 # +1
хахаха. только из примера не видно можно ли на этом car/cdr сделать.
Dummy00001 13.10.2017 18:12 # +1
https://skebanga.github.io/structured-bindings/
но до "упаковки" еще похоже не дошли. (типа: auto принимает тип, сгенереный компилером. "car" на структуре тогда будет: слил первое поле структуры в первую переменную, слил остальные поля в авто-структуру (или тот же тупл) с компилеро-сгенереным типом.)
ЗЫ или уже как-то можно по полям структуры итерировать?
gost 13.10.2017 19:13 # +3
Elvenfighter 13.10.2017 21:14 # 0
inkanus-gray 13.10.2017 21:49 # +1
dxd 13.10.2017 22:03 # +2
SemaReal 13.10.2017 22:17 # 0
bormand 14.10.2017 08:56 # 0
vistefan 14.10.2017 12:22 # 0
Возможно, я сильно ошибаюсь
subaru 14.10.2017 12:45 # +2
https://github.com/saniv/symta
inkanus-gray 14.10.2017 12:52 # +3
Какие-то закорючки. Лучше, чем J (хотя бы потому, что нет несбалансированных скобок), но всё-таки страшнее, чем Хаскель.
bormand 14.10.2017 13:42 # +3
H,@T разбивает список на голову H и хвост T. @, видимо, обозначает список.
Дальше над списком выполняются .keep{?<H} и .skip{?<H}, где ?<H похоже на лямбду \x -> x < H. Над получившимися кусками рекурсивно вызывается сама функция (^r) и всё конкатенируется через запятую.
@r в описании функции, скорее всего, маркер рекурсивности. А что делают $ и [] - х.з.
З.Ы. Ман по симте я не читала, так что могу ошибаться.
bormand 14.10.2017 13:54 # +2
@, оказывается, как в пёрле работает. Если у нас есть H=0 и T=[1 2 3] то из H,T получится [0 [1 2 3]] а из H,@T получится [0 1 2 3].
$ в описании функции задаёт дефолтное значение на случай если ни один паттерн не заматчился (в данном случае - пустой список []).
1024-- 14.10.2017 15:32 # +1
Отличная штука, мне нравится. кэповские "\x -> x < H", "x => x < H", "lambda x: x < H" и т.п. затрудняют написание и чтение.
bormand 14.10.2017 15:50 # +2
inho 14.10.2017 16:09 # 0
Прекольно. Это в стандартной либе так?
bormand 14.10.2017 16:17 # 0
З.Ы. Хотя буст вполне можно считать стандартной либой.
inho 14.10.2017 17:11 # +1
1024-- 14.10.2017 17:35 # +1
1024-- 14.10.2017 16:11 # +1
FrauSchweinhund: Интересно, почему в с++ все фичи получаются кривые и многословные?
subaru 14.10.2017 17:45 # +1
1024-- 14.10.2017 18:15 # +4
Например, перегрузка операторов, шаблоны и конструкторы в C++ позволяют создать свои лямбды с замыканиями.
Например, метатаблицы и прототипы в JS/LUA позволяют написать своё наследование.
И это лучше, чем захардкодить лямбды или наследование в новой версии языка, т.к. в этом случае приходится в каждой версии хардкодить какие-то новые фичи, даже если лямбды были лаконичными. Тот, кому эти фичи нужны, должен переходить на новую версию языка; тот, кому не нужны - получает потенциальные баги (в т.ч. и при неявном использовании новых фич).
А ведь надо быть раз придумать набор метафич языка и дальше перейти на описание диалектов (как boost::lambda, boost::phoenix реализуют функциональные диалекты). Диалект можно использовать локально в пределах одного файла; диалект может быть создан в отдельной команде для конкретного проекта или предметной области. Например, диалект описания таблиц для нашего языка позволил бы инклюдить в C++ SQL скрипты, создающие таблицы. Например, математический диалект разрешил бы писать a x^2 + b x + c или даже ax^2 + bx + c в своих программах.
inho 14.10.2017 18:19 # +1
Тогда погромисты перестали бы понимать друго друга.
1024-- 14.10.2017 18:41 # +3
Далее, у людей в основном нет фантазии. Люди будут стремиться использовать одни и те же идеи (а) т.к. проще использовать чужой хороший диалект, чем создать свой и (б) при написании своего диалекта человек будет использовать свой опыт, который почти полностью ляжет в известные парадигмы, в рамках которых обучиться легко. Зато отдельным гениям удастся описать какие-то вещи более просто, что программистом станет только понятнее.
Сейчас же не делают принципиально новые языки на каждом шагу. И принципиально новые библиотеки. И переменные не называют принципиально по-другому.
vistefan 18.10.2017 11:51 # 0
Ну-ну, про PHP слышала?
1024-- 18.10.2017 22:15 # −1
>> Люди будут стремиться использовать одни и те же идеи
>> использовать свой опыт, который почти полностью ляжет в известные парадигмы
А что с PHP? Мне кажется, язык как язык.
То, что на PHP чуть ли не любой школьник может писать, как раз доказывает, что PHP - крайне понятный язык, не оперирующий понятиями, выходящих за рамки опыта среднестатистического человека.
Где в PHP использование каких-то принципиально новых парадигм? Наоборот, знакомый c-подобный синтаксис, кэповские имена функций. Скукотища.
Вот если бы в PHP все вычисления представлялись бы в виде нахождения пересечений треков, оставляемых аргументами функций при корекурсивном движении вдоль аргументных осей, переменная была бы частью трека и образовывала бы при применении к функции отображение части трека в пространство результатов, тогда бы и правда PHP можно бы было смело упоминать.
SemaReal 19.10.2017 05:41 # 0
И на VisualBasic еще
Интересно, почему его не используют?
1024-- 19.10.2017 16:53 # 0
SemaReal 19.10.2017 18:28 # 0
ну да, редко очень
subaru 14.10.2017 18:22 # +1
1024-- 14.10.2017 18:34 # 0
subaru 14.10.2017 19:32 # 0
1024-- 14.10.2017 20:14 # 0
Таким образом, новые версии языка должны быть обратно совместимыми со старыми (ограничение на реализацию из-за прошлых неудачных решений), а программист не должен писать "using namespace std". Локальное подключение только нужных диалектов убирает эту проблему.
Старый код будет написан всё ещё на том же языке C++, будет работать как в 1990м, так и в 2040м; в соседних файлах (или даже в соседних строчках тех же файлов внутри своей области видимости) будет код на новых диалектах. Переписывание чисто из-за языка не будет нужно. Останется только переписывание по причине непонимания древних диалектов.
Переписывание стандартной библиотеки с нуля или прокидывание обёрток для стандартной библиотеки C не будет требоваться в полной мере. Диалект, использующий вызовы функций, оставит стандартную библиотеку C в том же виде. Только диалект, вводящий что-то принципиально новое, потребует новые обёртки.
Antervis 14.10.2017 22:18 # +2
Имо надо два дополнения: 1. implicit auto for lambda arguments - чтоб можно было писать [](a, b) {...} вместо [](auto a, auto b) {...}
2. последний оператор ф-ии, возвращающий зн-е возвращается из функии если он не закрыт точкой с запятой: [](a,b) { a+b } вместо [](a,b) { return a+b; }
Это уже было бы достаточно лаконично, никаких breaking changes или сильных усложнений парсинга
subaru 14.10.2017 22:25 # +3
Antervis 14.10.2017 22:48 # +7
subaru 14.10.2017 23:15 # +4
SemaReal 19.10.2017 05:42 # 0
У меня вот есть ощущение что скоро много всего будет написано на Go, а вот про Rust почему-то нет такого ощущения.
Может, я не туда смотрю?
subaru 19.10.2017 08:54 # 0
SemaReal 19.10.2017 18:29 # 0
inho 19.10.2017 18:38 # 0
SemaReal 19.10.2017 19:09 # 0
subaru 19.10.2017 19:12 # 0
Алсо я тут посмотрел примеры к hyper - кажется раст получается еще кривее и хуевей, чем плюсы.
SemaReal 19.10.2017 19:13 # +1
subaru 19.10.2017 19:16 # 0
SemaReal 14.10.2017 23:34 # +4
вот и злится
inkanus-gray 23.10.2017 23:39 # +2
«interested, but you also gay-krestoblyad, why should we listen to you?»
Похоже, что фраза утащена автоматическим парсером с какого-то форума программистов:
http://grampianpridt.blogspot.ru/2014/11/show-all-that-is-hidden-from-point-of.html
Возможно, даже автоматически переведена на английский с какого-то языка.
inkanus-gray 24.10.2017 01:37 # +1
http://govnokod.ru/11683
В настоящий момент krestoblyad (а также crestoblyad, krestobljad) больше нигде не встречаются. А как похоже на имя Кристобаль...
1024-- 24.10.2017 18:40 # +1
Надо использовать почаще какие-нибудь маркеры вроде слова жопогнуло, чтобы отслеживать подобные сайты.
inkanus-gray 24.10.2017 18:45 # +1
inkanus-gray 14.10.2017 22:28 # +4
Похожее было в K&R C. Правда, разрешалось всегда в int.
> последний оператор ф-ии, возвращающий зн-е возвращается из функии если он не закрыт точкой с запятой
Допустим, последний оператор функции — if. Как будет выглядеть код?
Antervis 14.10.2017 22:45 # 0
как тернарник
1024-- 14.10.2017 23:00 # −1
Кстати, кто помнит, что по этому поводу говорит ruby?
Antervis 14.10.2017 23:11 # 0
Наверно, стоило написать не "оператор", а "выражение". Например, { 5+7 } -> int, который можно вернуть из функции
1024-- 14.10.2017 23:43 # −1
Лично я испытываю что-то, что подобно переживаниям перфекциониста по поводу картины на стене, которую наклонили на один градус. Все выражения как выражения, даже процедуры и присваивания могут стать подвыражениями, а питушня с фигурными скобками - нет.
Скажем, можно сделать что-нибудь по аналогии с функциональными языками. if как тернарный оператор, из циклов выжать какие-то полезные значения, которые в функциональных порождаются рекурсией, для try возвращать variant<result_t, exception_t> и т.д.
roman-kashitsyn 15.10.2017 00:16 # +3
Разве что unit-ы, OCaml так и делает для императивных циклов.
А вот сишный void для меня до сих пор загадка. Bartosz Milewski утверждает, что это unit:
> Next is the type that corresponds to a singleton set. It’s a type that has only one possible value. This value just “is.” You might not immediately recognize it as such, but that is the C++ void. Think of functions from and to this type. A function from void can always be called. Разумный довод, господин Milewski, но логика создателям стандарта не ведома: нельзя объявить переменную void и вообще значение этого никак не получить. Более того, в скрижалях написано Section 3.9.1/9, N3797: "The void type has an empty set of values. The void type is an incomplete type that cannot be completed.". void f(void) не так прост, как кажется, даже умных людей в заблуждение вводит.
Отчасти из-за этого косяка в жабе пришлось ввести Void, населённый одним значением null, который не тоже самое, что void, который не населён.
SemaReal 15.10.2017 08:11 # +1
Например voo(void) надо писать потому что во времена КиР дефиниция функции не содержала параметров, и потому не понятно что такое foo() -- функция без параметров или функция, чьи параметры не известны.
А в жабе же войд ввели ради генериков, не?
roman-kashitsyn 16.10.2017 00:01 # +1
Ну да, дженерики же сложная фича, должны подчиняться хоть какой-то логике, иначе труба. Вот и void поменял семантику и превратился... в unit. Да, жабий Void изоморфен unit: это тип с ровно одним значением: null.
Что это даёт? К примеру, вот такая штука будет работать с дженериками даже если B = Void:
А вот в "обычном" коде нельзя написать g(f(x)), если f возвращает void. Ни в плюсах, ни в жабе.
inho 16.10.2017 09:18 # 0
SemaReal 17.10.2017 01:10 # +1
Но никогда ничего кроме ноля не возвращать (резерв на будущее)
Пускай клиенты класса проверяют как дураки, ахахахаххаха
Antervis 15.10.2017 09:08 # +2
bormand 15.10.2017 06:41 # +2
Рекурсия.
[](a){ a<2 ? 1 : a*this(a-1); }
bormand 15.10.2017 06:46 # +3
Antervis 15.10.2017 09:02 # 0
SemaReal 15.10.2017 09:37 # 0
почему яне могу внутри функции объявить и сразу заиспользовать функцию?
bormand 15.10.2017 09:39 # +1
Да и похуй, если честно. Зато код не превращался бы в нечитаемую хуиту и пачку скобок в конце. Нынешние лямбды один фиг плохо читаются для чего-то сложнее a<b.
SemaReal 15.10.2017 09:43 # +1
передавали небось указатели на функции (как в няшной) или городили стратегии -- классы с одним методом -- и передавали туда ссылки
и ничо
а как вы без клож передавали параметры я и подумтаь боюсь
Antervis 15.10.2017 10:49 # 0
Только не стратегии, а команды.
> а как вы без клож передавали параметры я и подумтаь боюсь
А ты не бойся думать, это полезно. Например, можно передавать их в конструктор команды.
Вот абстрактную реализацию конечно на с++03 хрен сделаешь. variadic templates сильно упрощают задачу
SemaReal 15.10.2017 16:19 # +1
It depends.
Комманда выполняется прозрачно для принимающей стороны и может иметь undo.
Стратегия это кусочек алгоримта для принимающей стороны, иногда его еще делают шаблонным методом.
Например, у меня есть класс чтобы выпить пива, но он не знает как отрыть бутылку. Если он параметризуется алгоритмом открытия, то это стратегия
>>конструтор
сам так делал в эпоху жестой жавы. Правда у нас еще было анонимные классы..
Antervis 15.10.2017 10:20 # 0
Не сказал бы что прям плохо. Главное-callback hell не разводить и не вкладывать их рекурсивно на 3+ уровня.
SemaReal 19.10.2017 05:44 # 0
Обычно это требует одного-двух ключевых слов.
В python, c# и Kotlin же как-то справились
subaru 19.10.2017 09:00 # 0
(кроме го конечно, там ничего нельзя сделать средствами языка, вот и вводят все прямо в язык с отдельным синтаксисом)
d_fomenok 18.10.2017 19:37 # 0
C# 7 передал вам привет
SemaReal 24.10.2017 03:27 # 0
Блин, MS как пылесос сосёт в язык всё, что есть в этом мире.
Скоро с# будет по размерам как с++, хотя я всё равно считаю C# очень годным языком.
В свое время люди писали на C# 4 и угорали над теми кто пишет на java 6 конечно.
roman-kashitsyn 24.10.2017 10:27 # 0
Не знаю, каждый раз, когда я пытался писать на C# в вижуал студии после Java + Intellij IDEA, у меня был баттхёрт, будто в каменный век попадаешь. К примеру, любая ошибка компиляции ломала индентер в IDE.
А константы в теле метода в C# уже завезли? ideone говорит, что нет. Даже в жабе final int k можно.
SemaReal 24.10.2017 12:57 # 0
А вместо readonly можно const, но наверно только для компайл тайм
Зато там есть вывод типов, пропертис, замыкания были сто лет назад, генерики компайл тайм, валуе типы на стеке, указатели на функции (делегаты)и указатели (ссылки?) на переменные (ref, out), указание версии модуля при депенденси, предгенерация нативного кода вместо джита (ngen), сборка проекта с командной строки (msbuild, за долго до градл), да все и не упомнишь
d_fomenok 24.10.2017 13:17 # 0
Есть const, он во времени компиляции и после этого при декомпиляции его нет.
Я вот одного не понимаю, зачем вообще нужен const в таких языках как C, C++. Выглядит просто ужасно
SemaReal 24.10.2017 14:09 # +1
Кроме того кложе проще захватить неизменяемую переменную
subaru 24.10.2017 14:32 # 0
SemaReal 24.10.2017 14:32 # +1
subaru 24.10.2017 14:40 # 0
> как на питоне живут
Я вообще не понимаю, как на всяких пыхах пишут что-то кроме одноразовых скриптов.
SemaReal 24.10.2017 14:46 # 0
d_fomenok 24.10.2017 15:01 # 0
Не путай d_fomenok и dm_fomenok
1024-- 24.10.2017 18:58 # +1
Выглядит ужасно, в использовании - куча боли и упрёков в сторону компилятора, который не компилирует, но работает просто прекрасно. Чётко известно, что выбранную питушню никто снаружи не перезапишет специально или случайно.
Захотела питушня изменять мои данные - компилятор заставит пройти по цепочке передачи данных, посмотреть код и исправить const на не const, либо явно скопировать их.
Гораздо надёжнее, чем в JS-python, где о том, что данные менять нельзя, написано в документации (которой может не быть на этапе написания программы, а пути течения данных надо смотреть вручную.
d_fomenok 24.10.2017 21:26 # 0
И кого это спасло? (особенно интересно про тебя, 1023)
1024-- 24.10.2017 21:37 # +1
Правда, после этого подход JS/python кажется мне говном. Теперь я не уверен, могу ли что-то чужое менять или отдавать своё чужим, копировать или не копировать (а это уже вопросы пирфоманса).
Отсутствие const стало для меня проклятьем, и жизнь больше не станет прежней.
FrauSchweinhund 14.10.2017 15:21 # +5
Днище какое-то. Интересно, почему в с++ все фичи получаются кривые и многословные?