crypt of decay - June 27th, 2017 [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

June 27th, 2017

бида! [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, вот это всё. но «это всё» сильно выходит за рамки целей и задач движка: если бы я уже делал «полновесный» лисп, то я и делал бы его иначе.

ручные решения я тоже не хочу: у машины есть вся информация, она может сделать это автоматически. а хуманс всенепременно ошибётся, да и что за манера — делать за машину её работу?

в общем, я весь в печали и сложных мыслях. без приличных замыканий стыдно, а с приличными дорого.
Link77 meows|meow!

navigation
[ viewing | June 27th, 2017 ]
[ go | Previous Day|Next Day ]