Архив автора: admin

Common Lisp: динамические (специальные) переменные

Вместо тысячи слов:

package main
 
import (
	"log"
)
 
var global = 1
 
func main() {
        log.Println("Global before", global)
        func() {
                global := 2
                log.Println("Global in closure", global)
                test()
        }()
        log.Println("Global after", global)
}
 
func test() {
        log.Println("Global in test", global)
}
 
// Global before 1
// Global in closure 2
// Global in test 1
// Global after 1
(defparameter *global* 1)
 
(defun main ()
  (format t "Global before ~a~%" *global*)
  (funcall (lambda ()
             (let ((*global* 2))
               (format t "Global in closure ~a~%" *global*)
               (test))))
  (format t "Global after ~a~%" *global*))
 
(defun test ()
  (format t "Global in test ~a~%" *global*))
 
(main)
 
;; Global before 1
;; Global in closure 2
;; Global in test 2
;; Global after 1

SDL2 Уроки

В рамках моего текущего помешательства на лиспе занимаюсь адаптацией замечательной серии туториалов Lazy Foo на Comon Lisp.

Для этого я пользуюсь библиотекой cl-sdl2. Так уж вышло, что поддержка некоторого функционала из SDL2, например surfaces, в ней реализована не полностью. Но это не беда, я дописываю нужный функционал по мере продвижения по туториалам, и мне даже дали доступ к мастер ветке репозитария. Поэтому не ставьте версию из quicklisp’а, а сразу клонируйте мастер ветку в ~/quicklisp/local-projects.

Пока что я просто переписываю сишные туториалы на общелисп, за чем можно следить на гитхабе.

Если хватит сил и терпения, или если появятся желающие, я напишу свои тексты с пояснениями, а может даже сниму видео.

Такие дела.

Запись опубликована автором в рубрике sdl2.

Emacs: M-j многострочный комментарий.

Предположим мы пишем небольшой комментарий в си-подобном языке.

// main is a function which starts our application ❶
function() main {

И наш курсор находится в позиции . Теперь если мы нажмем С-j или RET мы получим:

// main is a function which starts our application function() main {

И все бы ничего, если бы мы не хотели продолжить писать комментарий. Но есть решение: достаточно нажать M-j и мы получим:

// main is a function which starts our application 
// ❶
function() main {

Ну и напоследок.

/* main is a function which starts our application ❶
function() main {

Превращается в:

/* main is a function which starts our application 
 * ❶
 */
function() main {

Меняем ctrl и alt местами

$ cat my.xkb
 
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)"	};
    xkb_types     { include "complete"	};
    xkb_compat    { include "complete+ledcaps(group_lock)"	};
    xkb_geometry  { include "pc(pc105)"	};
    xkb_symbols "my" {
        include "pc+us+ru:2+inet(evdev)+group(toggle)+group(lctrl_toggle)+group(lctrl_rctrl_switch)+compose(rwin)"
        replace key <CAPS> {[ Alt_L, Meta_L]};
        replace key <LALT> {[Control_L]};
    };
};
 
$ xkbcomp my.xkb $DISPLAY

Стройка, чат и новые предметы

stone-fence-pillarstone-fence-hwooden-table-full

Вчера доделал и запустил строительство. Самое главное изменение — теперь указанный в рецепте навык проверяется по тому же принципу, что и при крафте: если навык меньше требуемого, появляется вероятность сфейлить постройку, потеряв все ресурсы, тем не менее получив опыт в соответствующем навыке. Также теперь при стройке нужны указанные в рецептах инструменты и оборудование.

При подключении в чат выводятся некоторые сообщения, которые были отправлены, пока вас небыл в игре. Добавлен приват и локальный чат:

*7 локальный чат — будет виден только тем кто в радиусе видимости
*9 локальный чат, выводятся только пузыри, в чат ничего не пишется
*to TatriX отправляем приватное сообщение мне

Новые предметы:

  • Каменный забор с металической ковкой
  • Игральные кости (их можно кидать, ждем казино)
  • Блевота, как следствие различных патогенных процессов
  • Новый спрайт деревянного стола

Пещеры и дальнобойное оружие

promo-61

В тестовом режиме добавился новый подземный слой карты. Чтобы до него добраться нужно построить вход: Build->Stoneworking->Cave entrance.
Также добавлено дальнобойное оружие. Сейчас можно скрафтить только пращу, которая использует камни в качестве боеприпасов. Пока что дальнобой игнорирует препятствия.

Деревья и вода

  • Теперь с каждого дерева можно собирать семена, которые сажаются как и другие растения
  • Убрал огрызки от яблок
  • Добавил в рецепты предметов жидкости
    Например: тесто требует 10 единиц воды.
    При крафте вода расходуется из любого наполненного контейнера
    с жидкостью в инвентаре.
  • Теперь из колодца можно заполнить только ведро и прочие крупные емкости. Из ведра, в свою очередь, можно пополнить флягу
  • Добавил отображение требуемого оборудования и инструмента в рецепты