- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
// 600+ lines skipped
int main() {
window["console"] = console;
window["Math"] = Math;
Math["sin"] = Math.sin;
Math["cos"] = Math.cos;
Math["PI"] = Math.PI;
// EXAMPLE:
var x = 3;
var y = x + null;
var z = "hello, " + y;
var n = NaN << NaN;
var f = Function();
console.log("x = " + x + " y = " + y + " z = " + z);
console.log("x =", x,"y =", y, "z =", z);
console.log(String("222") + true);
console.log(String("222") + 3);
console.log(Number("222") + 3);
console.log(NaN << NaN, !NaN);
console.log(undefined + 1);
console.log(f("hello, ", "world"));
console.log("sin(pi/4) = ", Math.sin(Math["PI"] / 4));
console.log("sin(pi/4) = ", window["Math"]["sin"](Math["PI"] / 4));
}
1024-- 22.10.2017 02:58 # +3
* Диаграмма классов чуть изменилась, т.к. я канонично переписал console.log, добавив связи Console - - > ConsoleLogBody -|> FunctionBody.
gost 22.10.2017 09:49 # 0
1024-- 22.10.2017 18:03 # +2
Распечатал семёрку им. Чёрча (как 2*(2+2)-1):
Кто-нибудь может сказать, как произвольную лямбду скастить в std::function? static_cast<std::function<конкретный тип>>(лямбда) мне помогает только для конкретной лямбды, не могу зашаблонить это.
Antervis 22.10.2017 18:18 # +1
Если тебе нужно засунуть в std::function ф-ю со случайными типами аргументов и возвращаемых значений, то сначала определись как ты собрался этим пользоваться.
п.с. ты какой-то херотой маешься. Делай объект через std::variant и обертки, натравливающие визиторов.
1024-- 22.10.2017 18:30 # 0
Чтобы конструктор Object работал от лямбд, и все функции и функциональные объекты обрабатывались эквивалентным образом.
> Делай объект через std::variant и обертки, натравливающие визиторов.
Запишу как план на будущее, когда снова C++ ударит в голову.
Antervis 22.10.2017 20:53 # +3
1. делаем перегрузку конструктора по Callable. Без концептов получим больше шаблонной магии, но тоже можно
2. преобразуем все функции в any(any) или var(any). Преобразуем таким образом: собираем аргументы функции в std::tuple через std::decay (типа int &a, double &&b) -> tuple<int,double>. Оборачиваем искомую функцию лямбдой, вызывающей родную функцию через std::invoke, и возвращающую var/any.
3. Соответственно, оператор () нашего callable объекта будет комбинировать агрументы в decay-нутый тапл, и подсовывать в обернутую функцию в виде std::any. При несовпадении сигнатуры будет исключение. И std::forward не забывай, чтоб лишние копирования убрать.
4. При таком подходе в лоб, будет несовпадение сигнатуры при попытке передать, например, int вместо unsigned. Поэтому можно сделать еще уровень индирекции, засовывающий конвертируемые в var типы в виде var.
Desktop 31.12.2019 22:29 # 0
bormand 31.12.2019 22:30 # 0
guest8 31.12.2019 22:31 # −999
bormand 01.01.2020 05:54 # 0
guest8 01.01.2020 06:03 # −999
Desktop 31.12.2019 22:38 # 0
bormand 31.12.2019 22:40 # 0
Desktop 31.12.2019 22:44 # 0
Desktop 31.12.2019 22:50 # 0
guest8 31.12.2019 22:54 # −999
Desktop 31.12.2019 23:16 # 0
Просто в нормальных™ языках можно написать и заиметь нужные типы в нужном месте. Ну ты сам знаешь, в принципе
bormand 01.01.2020 05:47 # +1
Например по типу ноды в графе (круг, треугольник и т.п.) *и* типу обработчика который по нему бегает (рисование, сохранение и т.п.)
К сожалению большинство языков диспатчит только по типу первого аргумента (аля this/self), вот и приходится городить этих ебучих визиторов.
guest8 01.01.2020 05:58 # −999
Desktop 01.01.2020 18:39 # 0
>> acceptBird()
- один я здесь вижу протёкшие абстракции? Ну, впрочем, мы же говорим про расширение функциональности существующего кода, так что пиздец ожидаем в том или ином виде.
NB: В терминах Obj C я не вызываю метод, а отправляю сообщение, с которым потом можно делать всякие штуки типа forwardInvocation.
bormand 01.01.2020 05:57 # +1
guest8 31.12.2019 22:45 # −999
Desktop 31.12.2019 22:52 # 0
Как его в реальном приложении можно использовать?
guest8 31.12.2019 23:00 # −999
Desktop 01.01.2020 18:44 # 0
guest8 01.01.2020 19:41 # −999
HoBorogHuu_nemyx 01.01.2020 19:58 # 0
AnalBoy 03.01.2020 00:36 # 0
gost 01.01.2020 00:04 # +1
guest8 31.12.2019 22:31 # −999
inho 22.10.2017 23:53 # 0
guest8 01.08.2018 22:41 # −999
3_dar 31.12.2019 21:18 # 0
Я давно заметил.