lisp evaluator |
[Jun. 11th, 2017|10:21 pm] |
из рекурсивных вызовов переделал в ручной стек и машину состояний (так изначально и планировалось). естественно, в таком виде там можно сделать нормальный трассировщик/дампер (миниотладчик такой), suspend/resume (бесполезно в моём use case), или — более полезное — проверки в стратегических местах и прерывание особо наглых скриптов, с опциональным stack dump. TCO, опять же (редуцируется до «глянуть на запомненые состояния в стеке», даже не надо код анализировать).
байткод делать не хочу принципиально, хочу всё на лисповых ячейках.
заодно перенёс больше значений в nan-боксы. теперь слайсы массивов и строк бесплатные (за счёт замедления GC, но GC у меня, как я писал, ситуация скорее нештатная). единственная gotcha — присвоеный глобалу слайс после выполнения скрипта будет сконвертирован в новый массив. сколько раз разным глобалам присвоили — столько новых массивов и будет. потому что это не решить иначе без полного скана всего space (слайс может указывать в произвольное место; а массивы просто откусывают от спейса куски нужного размера).
можно, конечно, завести ещё один параллельный список, в котором сохранять начальные адреса всех массивов. поскольку аллокатор всегда идёт строго в порядке возрастания адресов, поиск там будет O(log N). может, так и сделаю. или просто документирую фичу, потому что не вижу в таком усложнении практического смысла (это ж не язык для «генерального программирования»). |
|
|
Comments: |
Каждый либерал (а тем более технофашист) должен пройти испытание Никиты Садкова - написать интерпретатор лиспа.
| From: | ketmar |
Date: | June 11th, 2017 - 09:31 pm |
---|
| | Re: ВОИСТИНУ | (Link) |
|
(пожимает плечами) это минимум десятый-двенадцатый уже. не считая мелочей-однодневок.
В игродвиге бесполезен suspend/resume. Это ты хорошо отжог.
| From: | ketmar |
Date: | June 12th, 2017 - 09:15 am |
---|
| | | (Link) |
|
во-первых, полезен: см., например, `delay()` в ACS.
во-вторых, он бесполезен именно в моём двигателе, потому что сборка мусора же происходит путём «уебать весь временный пул», поэтому уебёт и всё состояние.
| From: | ketmar |
Date: | June 12th, 2017 - 09:16 am |
---|
| | | (Link) |
|
а, я тебя не очень понял. но второй абзац всё равно stands: конкретно мой двигатель для этого не дизайнился. | |