бида! |
[Jun. 27th, 2017|11:51 am] |
плохо всё с замыканиями. не могу придумать годной реализации, которая не замедляла бы всё остальное. сейчас все локалы живут на стеке, а ламбды носят с собой BP. в «настоящее» замыкание они конвертируются только при сохранении в какую-то именованую переменную. этот простой подход работает, но только для простых вещей. а вот для Y combinator, например, уже нет.
(defun Y (g)
((lambda (h) (g (lambda (x) ((h h) x))))
(lambda (h) (g (lambda (x) ((h h) x)))))) как видите, тут жуть и мрак, простой метод не работает.
а у сложных методов проблема в том, что они или тормозят, или аллокатят так, что всё трясётся. оно, конечно, не смертельно, но приятного тоже мало.
то есть, обычно проблема решается путём перемещения окружения в хип, тогда к замыканию просто цепляется cons с этим окружением — и проблема решена. но хип засирается со скоростью космической. кое-как это можно облегчить путём усложнения компилятора: чтобы он трекал использование, делал lambda lifting, вот это всё. но «это всё» сильно выходит за рамки целей и задач движка: если бы я уже делал «полновесный» лисп, то я и делал бы его иначе.
ручные решения я тоже не хочу: у машины есть вся информация, она может сделать это автоматически. а хуманс всенепременно ошибётся, да и что за манера — делать за машину её работу?
в общем, я весь в печали и сложных мыслях. без приличных замыканий стыдно, а с приличными дорого. |
|
|