Юмор →
«Жизнь» Конвея из каждой буквы, только в 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, эмблема хакеров:
19.01.2012 19:00+0400