Недавно ввёл поддержку флоатов и их некоторые операторы. Также я изменил императивную трансформацию типов на декларативную. Теперь у меня просто таблица с лямбда и просто функциями, которые вызываются для соответствующих типов. Надо будет что-то такое и для операторов сделать.
Всё. Пора заниматься серьёзными вещами и вводить репрезентацию как на втором пике. Это будет сделать непросто. Во-первых, надо значительно переделать препроцессинговую часть, добавить @for, @if, @elif, @else, @end, сделать несколько препроссинговых функций, который возвращают True/False в зависимости от дефайнед ли или есть какая-нибудь функция. Во-вторых, мне придётся частично сделать библиотеку mem, а для этого заново ввести alloc, vary и del. В случае с repr, думаю, будет переопределяемая функция _repr_. Её можно будет определить для своего типа, получать указатель на переменную + "строковые аргументы", а возвращать mem.string. Строковые аргументы это для форматирования. Например format("value: {x} : {02}",a,b) в первом случае даст 'x', а во-втором '02'. Таким образом можно указать _repr_ инта в первом случае выдать шестнадцатиричное число, а во втором с двумя лидирующими нулями (если число не больше). И как раз функции hasoperator и operatorof будут давать возможность обращения к перегруженным функциям. Я всё побаиваюсь, что LLVM или Я не сможет правильно оптимизировать возвращение или передачу больших структур, например mem.string. Всмысле не их самих, а и их контента. Ведь очевидно, что если я хочу передать mem.string в качестве аргумента или приравнять его переменной, то надо и контент скопировать, иначе можно было б просто указатель кинуть.
Кстати, недавно я осознал важность возможности переопределения таких операторов как +=, *=, %= и прочих. В C++ я жаловался, да зачем мне лишний раз переопределять, просто плюс используй, а потом приравняй. Но потом я задумался надо булевой геометрией и понял, что иногда надо применить булевую операцию на меш и сразу его изменить, а иногда нужно сохранить прошлые переменные. Например можно переопределить | и |= для условных структур мешей по разному и будет так: c = a | b; d |= e; В первом случае a и b сохранятся, а в c будет результат их юниона, а во втором случае контент d не сохранится, вместо этого юнион сразу применится на d.