изложить суть проблемы другому человеку наводит меня на решение
После перерыва вернулся к моему язычку программирования, и решил добавить вызов функций с именованными параметрами.
Всё бы ничего, но возник определённый конфликт с необязательными параметрами.
Что бы было понятно, нужно объяснить, как у меня устроен вызов функции с необязательными параметрами.
В целом я придерживаюсь идеологии, что редкоиспользуемые фитчи не должны оказывать
влияния на производительность частоиспользуемых фитч.
Итого. Есть, например, функция:
Код: Выделить всё
func f(a,b,c,d=a+b,e=b+c,f=a+c)
return a+b+c+d+e+f
end
Код: Выделить всё
0: d=a+b
1: e=b+c
2: f=a+c
3:return a+b+c+d+e+f
Если совпадает, что точкой входа в функцию будет считаться 3.
Если не совпадает и количество недостающих аргументов <=3, то
точкой входа будет 3 минус кол-во недостающих аргументов.
Дёшево и сердито.
Теперь я добавил вызов с именованными аргументами.
Код: Выделить всё
f(a=>1,b=>2,c=>3)
то есть если будут перемешаны обычные аргументы и именованные, то обычные сразу будут на стэке, а последним будет
словарь с именованными.
При обработке вызова я проверяю, что аргументов не хватает, пробегаюсь по недостающим, ищу их в словаре, и докладываю на стэк.
Теперь ситуация:
Код: Выделить всё
f(1,2,3,e=>10)
единственное потенциальное решение, которое пока пришло в голову, это сделать как-то так:
Код: Выделить всё
0: if d is not inited then d=a+b
1: if e is not inited then e=b+c
2: if f is not inited then f=a+c
3:return a+b+c+d+e+f
при инициализации вызова через именованный параметр...
но это вносит небольшой оверхэд в код не относящийся к именованным параметрам.
была еще идея сделать спец. оператор присваивания, который присваивает только если цель не была уже инициализирована.
но, тут другая проблема. конструкция
Код: Выделить всё
a=b+c
Код: Выделить всё
add b,c => a
Код: Выделить всё
tmp=b+c
a ?= tmp
ибо вычисления будут производится даже если их результат не нужен...
мучаюсь вот
и запретить такую комбинацию нелогично, ибо одна из целей именованных параметров как раз
возможность задать не первый необязательный параметр...
и в необязательные параметры не хочется вносить лишний оверхэд