Яндекс.Метрика

    Юмор

    «Жизнь» Конвея из каждой буквы, только в Emacs!

    Одним рабочим декабрьским вечером



    Все мы так или иначе сталкивались с игрой «Жизнь» Конвея. Кто-то писал сам, кто-то смотрел и дивился, кто-то играл…

    Под новый год, сидя с коллегой за одним компом и решая какую-то проблемку в конце рабочего дня, мы немного отошли от проблемы и как-то дело свелось к M-x life (мы оба пользуемся Emacs), &emdash; кто не знаком с Emacs — это команда запуска игрушки «Жизнь» в Emacs.

    Стандартное неинтересно


    Вроде бы о чем тут говорить. Да вот только реализация в Emacs имеет около 10 «вшитых» начальных позиции, которые мягко говоря неинтересны.

    Вы знаете, что:
    • Конвей первоначально предположил, что никакая начальная комбинация не может привести к неограниченному размножению и предложил премию в 50 долларов тому, кто докажет или опровергнет эту гипотезу.
      цитата из Wikipedia;
    • К настоящему времени более-менее сложилась следующая классификация фигур:
      цитата из Wikipedia;
    • Emacs — это расширяемый текстовый редактор.



    Зачесались руки


    У меня зачесались руки попробовать какую-нибудь из интересных форм игры. Но для этого надо что-то сделать, чтобы реализация функции life воспринимала текущий текст в окне текстового редактора, а не вставляла один из своих «красивых» шаблонов.

    И, посмотрев код функции life (нажимая в Emacs C-h-f life), выяснилось, что всё просто:

    (defun xlife ()
      (interactive)
      (let ((life-patterns (vector (list (buffer-string)))))
        (life)))
    


    Функция xlife призвана привязать строку-содержимое текущено буфера к глобальной динамической переменной life-patterns, которая используется функцией life. И потом просто выполнить последнюю.

    Не надо никакого копирования реализации, никаких хуков и хаков.

    Загружаем код нашей функции в Emacs (C-M-x) и выполняем (M-x xlife): только-что бывший кодом нашей функции текст начинает «жить».



    А вот glider, эмблема хакеров: