crypt of decay - Post a comment [entries|archive|friends|userinfo]
ketmar

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

lisp evaluator Jun. 11th, 2017|10:21 pm

ketmar
из рекурсивных вызовов переделал в ручной стек и машину состояний (так изначально и планировалось). естественно, в таком виде там можно сделать нормальный трассировщик/дампер (миниотладчик такой), suspend/resume (бесполезно в моём use case), или — более полезное — проверки в стратегических местах и прерывание особо наглых скриптов, с опциональным stack dump. TCO, опять же (редуцируется до «глянуть на запомненые состояния в стеке», даже не надо код анализировать).

байткод делать не хочу принципиально, хочу всё на лисповых ячейках.

заодно перенёс больше значений в nan-боксы. теперь слайсы массивов и строк бесплатные (за счёт замедления GC, но GC у меня, как я писал, ситуация скорее нештатная). единственная gotcha — присвоеный глобалу слайс после выполнения скрипта будет сконвертирован в новый массив. сколько раз разным глобалам присвоили — столько новых массивов и будет. потому что это не решить иначе без полного скана всего space (слайс может указывать в произвольное место; а массивы просто откусывают от спейса куски нужного размера).

можно, конечно, завести ещё один параллельный список, в котором сохранять начальные адреса всех массивов. поскольку аллокатор всегда идёт строго в порядке возрастания адресов, поиск там будет O(log N). может, так и сделаю. или просто документирую фичу, потому что не вижу в таком усложнении практического смысла (это ж не язык для «генерального программирования»).
Link Read Comments

Reply:
From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message: