среда, 29 августа 2012 г.

Stuff #1

Перенесено из поста с тернарными операторами
git
Долгое время пользовался git через gui, но тут набрел на  лекции Стэнфорда. Я и до этого пробывал использовать его через терминал и даже проходил gitimmersion.com , но как-то не пошло, зато теперь с удовольствием сижу через терминал. Кстати лекции довольно качественно переведены на русский.

Explore на github нашел мне довольно интересный проект написанный на руби для изучения git в интерактивном режиме через терминал. Он просит вас что либо сделать (например создать репозиторий) и если вы все сделали правильно, переходит к следующему заданию. 

Going Native 2012

В феврале проходила конференция по C++11 - Going Native 2012. Довольно интересные выступления, особенно вступительное слово Страуструпа и STL11 Magic && Secrets (Интересный факт: выступающий является разработчиком STL в Microsoft, a зовут его Stephan T. Lavavej ,то есть инициалы у него тоже STL). Если лень смотреть вот обзор на Хабре.

понедельник, 9 апреля 2012 г.

Python with statement

Я до недавнего времени ни разу не видел оператора with, но то как оно используется показалось мне интересным. Этот оператор используется для того чтобы удостовериться что будет вызыван clean-up код, например, закрытие файла, освобождение lock'а и т.п., для чего раньше использовалось try/catch/finally.
Пример:
 with open("file.txt") as f:  
   for line in f:  
     print (line)  
В этом примере file.txt откроется для чтения, а после выхода из этого блока кода f будет сам закрыт, даже в случае ошибки.
Тогда как без with нужно было делать что-то вроде этого:
 f = open("file.txt")  
 try:  
   for line in f:  
     print(line)  
 finally:  
   f.close()  
with использует методы __enter__() и __exit__() для получения в f того что возвращает open() и закрытия файла соответственно. Мы можем повторить это поведение так:
 f = open("file.txt")  
 f.__enter__()  
 for line in f:  
   print(line)  
 f.__exit__()  
Метод __exit__() будет вызван в любом случае, что похоже на поведение блока finally. Если после __exit__() попробовать обратиться к f - будет выведена ошибка о том что файл уже закрыт.

Вобщем используя with можно получить немного более чистый/читабельный код.

Ссылки:

суббота, 24 марта 2012 г.

Тернарный оператор в разных языках

Обзор тернарных операторов в разных языках программирования
Обычно тернарная условная операция ассоциируется с операцией ?: (condition ? true value : false value), но в разных языках она выглядит по разному и я хотел бы рассмотреть её на примере получения модуля числа.
C/C++/C#/Java/Javascript
Стандартная запись для большинства языков.
 (x > 0) ? x : -x; 
Python
Текущий вид тернарный оператор приобрел в версии 2.5 и описан в PEP-308. Такую форму он имеет благодаря Гвидо.
 x if x > 0 else -x  
На StackOveflow увидел как можно сделать тоже самое "немного" иначе:
 1. (-x, x)[x > 0]  
 2. x > 0 and x or -x  
Википедия приводит пример как можно использовать тернарный оператор в похожей на switch манере
 b = 3  
 a = 1 if b==1 else \  
     2 if b==2 else \  
     3   
Visual Basic
В VB такой вариант записи работает с 9 ой версии.
 If(x > 0, x, -x)  
До этого для этих целей могла использоваться тернарная функция
 Iif(x > 0, x, -x)  
но так как она являлась функцией все её параметры должны быть определены до вызова функции. Например, в следующем случае
 Iif(x <> 0, 10/x, x)  
выражение 10/x посчиталось бы даже если x = 0 (что привело бы к ошибке), чего бы не произошло при использовании тренарного оператора If который появился в 9ой версии VB.

Переключатель (case) с помощью тернарного оператора

Пока писал про тренанрный оператор неожиданно узнал для себя что можно использовать тернарный оператор как аналог switch case. Вот еще пример с синтаксисом Си.
 vehicle = arg == 'B' ? bus :  
           arg == 'A' ? airplane :  
           arg == 'T' ? train :  
           arg == 'C' ? car :  
           arg == 'H' ? horse :  
                        feet;  

Null coalescing operator

Пока смотрел что есть про тернарный оператор набрел на null coalescing operator(не знаю как он правильно переводится на русский так что так его называть и буду). Он в каком-то смысле сродни тернарному оператору. Например в C# он выглядит так
 possiblyNullValue ?? valueIfNull  

Смысл же его заключается в том чтобы вернуть вторую переменную если первая оказалась равна null. 
Допустим следующее - если название  не определено нам нужно получить название по умолчанию. Вот как можно сделать это с помощью тернарного оператора.
 string pageTitle = (suppliedTitle == null) ? "Default Title" : suppliedTitle;  
Или же мы можем воспользоваться null coalescing оператором
 string pageTitle = suppliedTitle ?? "Default Title";  
Этот оператор можно также найти и ряде других языков. В Python он отсутствует как отдельный оператор, но такое же поведение можно получить при использовании or.
 foo = None  
 bar = foo or 1 # теперь bar == 1  

Но в Python даже если бы foo был пустой строкой или нулем bar стал бы равен 1.