crypt of decay - lisp evaluator [entries|archive|friends|userinfo]
ketmar

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

lisp evaluator [Jun. 11th, 2017|10:21 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
из рекурсивных вызовов переделал в ручной стек и машину состояний (так изначально и планировалось). естественно, в таком виде там можно сделать нормальный трассировщик/дампер (миниотладчик такой), suspend/resume (бесполезно в моём use case), или — более полезное — проверки в стратегических местах и прерывание особо наглых скриптов, с опциональным stack dump. TCO, опять же (редуцируется до «глянуть на запомненые состояния в стеке», даже не надо код анализировать).

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

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

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

Comments:
[User Picture]
From:[info]perfect_kiss
Date:June 11th, 2017 - 09:26 pm

ВОИСТИНУ

(Link)
Каждый либерал (а тем более технофашист) должен пройти испытание Никиты Садкова - написать интерпретатор лиспа.
[User Picture]
From:[info]ketmar
Date:June 11th, 2017 - 09:31 pm

Re: ВОИСТИНУ

(Link)
(пожимает плечами) это минимум десятый-двенадцатый уже. не считая мелочей-однодневок.
[User Picture]
From:[info]tzirechnoy
Date:June 12th, 2017 - 09:11 am
(Link)
В игродвиге бесполезен suspend/resume. Это ты хорошо отжог.
[User Picture]
From:[info]ketmar
Date:June 12th, 2017 - 09:15 am
(Link)
во-первых, полезен: см., например, `delay()` в ACS.

во-вторых, он бесполезен именно в моём двигателе, потому что сборка мусора же происходит путём «уебать весь временный пул», поэтому уебёт и всё состояние.
[User Picture]
From:[info]ketmar
Date:June 12th, 2017 - 09:16 am
(Link)
а, я тебя не очень понял. но второй абзац всё равно stands: конкретно мой двигатель для этого не дизайнился.