21.01.10

Семь смертных грехов программиста

Mr. Aleph написал очень сильный пост. Вот кто-то и выразил нормальными словами то, о чем я думаю последние пол года почти каждый день.
Можно поймать себя за руку на любом из пунктов в зависимости от этапа жизни.

12.01.10

Smalltalk style lazy initialization in ruby (Proof of concept)

В Smalltalk есть очень полезная особенность, возможность ленивой инициализации значений. До тех пор, пока переменной не установят значение, оно равно nil и не занимает памяти, но на программиста возлагается задача не забыть это самое значение присвоить. Lazy initialization позволяет программисту все-таки забыть про это и не огрести люлей от рантайма.
Штука, в принципе, леко реализуемая почти везде, но в ST она очень круто выглядит и легко читается:

SomeClass>>lazyValue
    ^property ifNil: [property := 'Default'].

В руби для этого придумали целый новый метод ||= описание которого я с первого раза вкурить не смог, когда начинал разбираться в языке. Примерно в то же время я написал для себя библиотечку smalltalk_ifmessages.rb, она очень простая:
class Object
  def ifTrue
    if self
      yield
    else
      self
    end
  end

  def ifNil
    if self == nil
      yield
    else
      self
    end
  end

  def ifNonNil
    if self != nil
      yield
    else
      self
    end
  end
end
С её помощью можно нафигачить в руби леко читаемую ленивую инициализацию:
require 'smalltalk_ifmessages.rb'

class LazyClass
  def lazy_prop
    @property.ifNil { @property = "Default" }
  end
  
  def lazy_prop=(value) 
    @property = value
  end
end

11.01.10

Xcode text macros, что б в следующий раз не искать

В Xcode есть клёвая система сниппетов, только вот фирма «Эпол» не сделала ничего хорошего, что бы пользователь мог сам создавать эти самые сниппеты. Надоело мне каждый раз писать руками многострочники перед методами, и что делать?
А делать вот что:

  • Создать фолдер ~/Library/Application Support/Developer/Shared/Xcode/Specifications/
  • Создать там файл ObjectiveC.xctxtmacro
  • Написать в него текст, пример, ниже.
  • Перезапустить компиляторный потогонный станок


Сверяться можно с файлом
/Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/Contents/Resources/ObjectiveC.xctxtmacro
Ну и, само собой, так можно кошмарить любой поддерживаемый Xcode'ом язык.
(
  {
    Identifier = objc.methodcomment;
    BasedOn = objc;
    IsMenuItem = YES;
    Name = "Method comment";
    TextString = "/**\n * <#desc#>\n */";
    CompletionPrefix = com;
    OnlyAtBOL = YES;
    IncludeContexts = ( "xcode.lang.objc.block" );
  }
)

07.01.10

Russian Lambda Planet переехала на fprog.ru

Ну вот мы и пристроили RLP в хорошие руки. Я считаю, что все у нас получилось довольно неплохо с планетой, функцию она свою выполняла, а теперь будет ее выполнять еще лучше.
Спасибо огромное всем, кто имел отношение к RLP, присылал багрепорты, ругал, писал про функциональное программирование и помогал с развитием. Прежде всего — огромное спасибо lrrr'у с которым мы ее и придумали, Алексу Отту который очень активно участвовал в развитии планеты и, фактически, был единственным человеком, рекомендующим новые источники.
Теперь я хочу пожелать новым хозяевам планеты, проекту «Практика функционального программирования», удачи и сказать спасибо за то, что приютили.
Подробности можно прочитать у Алекса вот тут.

17.12.09

TDD разработка компиляторов

Я тут пока болел прочитал наконец-то книжку Бека Test Driven Development: By Example. Там в конце указана некоторая незатронутая в книге критика ТДД, в числе прочего есть пункт: «С помощью TDD невозможно разработать компилятор».
Почему?

12.11.09

Зарубка: когда zsh валится в ад и израиль

Когда zsh начинает материться фразой «_alternative:69: command not found: _canonical_paths» при попытке получить список дополнения, нужно просто грохнуть ~/.zcompdump и перезапустить шелл.

Зарубка: zsh case insensitive completion, если вдруг сломалось

autoload -U compinit
compinit -C
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'