ICFP 2014 micro-report

Jul 29, 2014 18:02


Собственно, уже отоспавшись, можно подвести краткие итоги прошедшего конкурса: ICFPC торт (c ( Read more... )

ghosts, common lisp, icfpc, icfpc 2014, icfp, report, pacman, contest, lambda man

Leave a comment

Comments 14

_winnie July 29 2014, 14:19:30 UTC
> Поддержать хвостовую рекурсию в GCC.

Я её поддержал на уровне "если RTN после AP, заменить на TAP".
Правда, при это нужно было проверить, что рекурсивный вызов - строго в последней ветке if-ветвления. Ну, проверил в fold/while что это так, и делал всё через fold.

def fix_tail_call(code):
for i in xrange(len(code)-1):
if (code[i][0] == 'AP' and code[i+1][0] == 'RTN'):
code[i] = ['TAP'] + code[i][1:]
# leave 'RTN' in code, because it can be target of jump,
# and avoid remapping of code offsets

Reply

swizard July 29 2014, 14:40:06 UTC
В субботу grep-z точно так же попытался сделать, но как раз наткнулся на баг с ветвлением и откатил коммит :) А потом ему пришлось убежать по делам и весь процесс как-то забылся, потому что оно как-то и так на тот момент работало нормально :)

Reply

dmytrish July 29 2014, 15:28:57 UTC
Можно проверять все после AP: если там только JOIN и другие инструкции, которые не трогают стек, то можно спокойно называть AP хвостово-рекурсивным и на дамп в AP ничего не класть (правда, еще нужно почистить все, что туда могли положить JOINы).

Reply

_winnie July 29 2014, 17:50:40 UTC
Для практики, чтобы работали обе ветки if - надо проверить ещё проверить развилки jump:

function_C:
jump_if_cond branch
call A -это тоже tail call!
jump done хотя дальше что-то непонятное
branch:
call B
done:
ret

Я подозреваю, надо это делать не в результирующем ASM, а ещё пока у нас есть дерево
(defun (...) ( .... цепочка if и cond .... ( (вызов функции) ).... )

Reply


_winnie July 29 2014, 14:26:11 UTC
> Надо было с первого же дня написать симулятор игры.
Спорный момент - можно фиксать тонкие различия аж неделю, а потом напороться на то, что у организаторов свои оригинальные баги.

Я вот так сделал - http://users.livejournal.com/_winnie/434449.html#comments

Reply

swizard July 29 2014, 14:41:14 UTC
через эмулятор мучительно проверять, он тормозит как незнамо что, и вкладку иногда в браузере вешает :(

Reply

_winnie July 29 2014, 14:47:19 UTC
Я вообще FireFox использую, но этот эмулятор запускал в хроме с одним табом, это его ускорило в два раза. Ещё убрал перерисовку и апдейт DOM-дерева на каждом шаге, перерисовывал только через 10 шагов (правда, на сложных алгоритмах это уже не меняло ничего, bottleneck был уже не в отрисовке).

Ещё отладочная печать тормозила и всё вешала, поэтому перенаправил её в console.log

Reply

ext_778866 July 29 2014, 15:01:36 UTC
А ты как console.log сделал? Там в бьютифизированном яваскрипте я сходу не разобрался, и забил.

Reply


ext_778866 July 29 2014, 15:10:33 UTC
Я думаю, вместо ilisp было бы интересно иметь klisp (kernel lisp). Тогда преобразование ast из CL в klisp проще, а klisp мапится почти 1 к 1.

Reply

dark_aurel July 30 2014, 12:38:26 UTC
Ну, в итоге у нас klisp и был (в translate-walk), а все-остальное наворачивалось поверх макрами/функциями. Жаль только что до этого мы доперли слишком поздно :(

Reply

swizard July 30 2014, 13:33:03 UTC
Кстати я тут запоздало ещё придумал, что можно было ваще не писать свои макры вроде OR. Достаточно было просто в translate-walk форму через macroexpand прогнать и транслировать уже результат:

CL-USER> (macroexpand '(when (and a b) (+ a b)))
(IF (AND A B)
(PROGN (+ A B))
NIL)

Reply


Leave a comment

Up