Думаю компилер
И много ты таких языков знаешь?
С#! Array.Empty()
Это литерал
Это функция
но для этого компилятору надо провести сложнейший ескейп анализ - надо вывести для каждого рекорда - что он гарантированно иммутабельный (не CLIMutable) - если рекорд аллоцируется в скоупе A.B.C, надо вывести что он не зависит от скоупа C и его можно вывести на скоуп A.B (чтобы переиспользовать!), а там он может быть зашадовлен - т.е. надо заманглить имя рекорды чтобы он не клешился с возможным другим биндингом (возможно другого типа!) - надо рекурсивно повторить ескейп анализ для скоупа A и пр и когда мы найдём максимально возможный скоуп где рекорд не зависит от внешних переменных, то там и объявлять Пример let foo x = let bar y = { A = x } здесь рекорд { A = ... } не зависит от скоупа функции bar (можно вывести по свободным переменным) и значит можно пробить скоуп этой функции и вынести его повыше let foo x = let __mangled__name__ = { A = x } let bar y = __mangled__name__ Здесь рекорд { A = ... } уже зависит от переменных скоупа и вынести дальше его не можем - оставляем
Да, но возможно такие анализы уже сделаны
крайне сомневаюсь!
У тебя в примере в bar рекорд зависит от х, это не подходяший пример
потому что у меня общий случай, ты точно понял мой пример?
Неуверен что понял что хотел сказать, но я говорю о кейсе когда при создании рекорда не используются внешние переменные! А у тебя используются, пример про другое..
ты шутишь стало быть.
Обсуждают сегодня