Pull to refresh

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

Reading time2 min
Views916

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



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

Под новый год, сидя с коллегой за одним компом и решая какую-то проблемку в конце рабочего дня, мы немного отошли от проблемы и как-то дело свелось к 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, эмблема хакеров:

Tags:
Hubs:
Total votes 25: ↑15 and ↓10+5
Comments3

Articles