lisp evaluator |
Jun. 11th, 2017|10:21 pm |
из рекурсивных вызовов переделал в ручной стек и машину состояний (так изначально и планировалось). естественно, в таком виде там можно сделать нормальный трассировщик/дампер (миниотладчик такой), suspend/resume (бесполезно в моём use case), или — более полезное — проверки в стратегических местах и прерывание особо наглых скриптов, с опциональным stack dump. TCO, опять же (редуцируется до «глянуть на запомненые состояния в стеке», даже не надо код анализировать).
байткод делать не хочу принципиально, хочу всё на лисповых ячейках.
заодно перенёс больше значений в nan-боксы. теперь слайсы массивов и строк бесплатные (за счёт замедления GC, но GC у меня, как я писал, ситуация скорее нештатная). единственная gotcha — присвоеный глобалу слайс после выполнения скрипта будет сконвертирован в новый массив. сколько раз разным глобалам присвоили — столько новых массивов и будет. потому что это не решить иначе без полного скана всего space (слайс может указывать в произвольное место; а массивы просто откусывают от спейса куски нужного размера).
можно, конечно, завести ещё один параллельный список, в котором сохранять начальные адреса всех массивов. поскольку аллокатор всегда идёт строго в порядке возрастания адресов, поиск там будет O(log N). может, так и сделаю. или просто документирую фичу, потому что не вижу в таком усложнении практического смысла (это ж не язык для «генерального программирования»). |
|