unless statement
От: remark Россия http://www.1024cores.net/
Дата: 14.11.09 21:19
Оценка: :))) :)
#define unless(x) if (!(x))

int main()
{
    std::map<std::string, int> m;

    std::string s1 ("foo");
    unless (s1.empty())
        m[s1] += 1;

    std::string s2 ("");
    unless (s2.empty())
        m[s2] += 1;
}



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: unless statement
От: vadimcher  
Дата: 14.11.09 21:48
Оценка: :)
Здравствуйте, remark, Вы писали:

R>
R>#define unless(x) if (!(x))
[]


Вот придумалось еще:
#define either(c)   ( ((x) ? 1 : 0)
#define or(c)       ^ ((y) ? 1 : 0) )

if either (x) or (y)
  // do something if one and only one of them is true
else
 // do something otherwise, i.e. if both are true or both are false

А вот зайца кому, зайца-выбегайца?!
Re[2]: unless statement
От: remark Россия http://www.1024cores.net/
Дата: 14.11.09 23:52
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Здравствуйте, remark, Вы писали:


R>>
R>>#define unless(x) if (!(x))
V>[]
V>


V>Вот придумалось еще:

V>
V>#define either(c)   ( ((x) ? 1 : 0)
V>#define or(c)       ^ ((y) ? 1 : 0) )

V>if either (x) or (y)
V>  // do something if one and only one of them is true
V>else
V> // do something otherwise, i.e. if both are true or both are false
V>


Про unless подумалось глядя на Ruby код. Чем мы хуже?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: unless statement
От: Erop Россия  
Дата: 15.11.09 07:10
Оценка:
Здравствуйте, remark, Вы писали:

R>Про unless подумалось глядя на Ruby код. Чем мы хуже?

Тем, что умнее

R>

Двойное
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: unless statement
От: Николай Ивченков  
Дата: 15.11.09 09:01
Оценка:
remark:

R>
#define unless(x) if (!(x))


Можно и по-другому:

#define UNLESS(x) if (x) {} else

тогда хоть какая-то польза будет:

#include <iostream>

#define UNLESS(x) if (x) {} else

int f()
{
    int n = 0;
    std::cin >> n;
    return n;
}

int main()
{
    UNLESS(int n = f())
        std::cout << "zero" << std::endl;
}

А если нужен ещё else, то достаточно заменить UNLESS на обычный if и поменять контролируемые statement-ы местами.
Re[3]: unless statement
От: byleas  
Дата: 15.11.09 10:57
Оценка: +1
Здравствуйте, remark, Вы писали:

R>Про unless подумалось глядя на Ruby код. Чем мы хуже?

Вот только в перле и руби можно писать "some unless(x)", "some if(x)" а с этим облом здесь.
Re: useless statement
От: Alexander G Украина  
Дата: 16.11.09 11:49
Оценка: +1
Русский военный корабль идёт ко дну!
Re[2]: useless statement
От: remark Россия http://www.1024cores.net/
Дата: 16.11.09 12:02
Оценка: +2
Здравствуйте, Alexander G, Вы писали:

Можно его и как useless трактовать:

#define useless unless

void foo(shared_ptr<file> f, ...)
{
  useless (f)
    throw runtime_error("input is useless");
  ...
}


А если серьёзно, то иногда приходится писать что-то типа:
if (!(lengthy_cond1
  && lengthy_cond2
  && lengthy_cond3
  && lengthy_cond4))


Но мне лично такая форма не очень нравится, не очень читаемо. Инвертировать все условия тоже не нравится, т.к. 'позитивные' условия обычно легче пишутся и читаются, чем 'негативные' (в смысле, что например "пришедший пакет корректный", а не "пришедший пакет не корректный").
А с unless имхо выглядит лучше:
unless (lengthy_cond1
  && lengthy_cond2
  && lengthy_cond3
  && lengthy_cond4)


Хотя, наверное, это всё же ещё не достаточная причина, что бы дефайнить и использовать такую фигню в реальном коде.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: useless statement
От: Alexander G Украина  
Дата: 16.11.09 15:34
Оценка:
Здравствуйте, remark, Вы писали:

R>Можно его и как useless трактовать:


R>
R>#define useless unless

R>void foo(shared_ptr<file> f, ...)
R>{
R>  useless (f)
R>    throw runtime_error("input is useless");
R>  ...
R>}
R>


Напомнило
http://www.gamedev.ru/tip/?id=136
и
#define begin {

Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT
Русский военный корабль идёт ко дну!
Re[4]: useless statement
От: remark Россия http://www.1024cores.net/
Дата: 16.11.09 16:41
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT


Ещё offsetof().
_countof в C++ хорошо реализуется и на шаблонах.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: unless statement
От: Vamp Россия  
Дата: 16.11.09 21:06
Оценка: 13 (2)
R>Про unless подумалось глядя на Ruby код. Чем мы хуже?
Perl вообще эмоционально выразительный язык:

open(F, "file") or die();


Есть даже целые стихи, http://docstore.mik.ua/orelly/perl/prog3/ch27_02.htm
Да здравствует мыло душистое и веревка пушистая.
Re[4]: useless statement
От: Dihotom  
Дата: 18.11.09 14:10
Оценка:
AG>Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT

Я бы еще добавил BOOST_AUTO.
Re[5]: useless statement
От: Alexander G Украина  
Дата: 18.11.09 14:16
Оценка:
Здравствуйте, Dihotom, Вы писали:

D>Я бы еще добавил BOOST_AUTO.


и BOOST_TYPEOF ? Пока обхожусь, он кажется имеет большой компайл-тайм оверхед.
Русский военный корабль идёт ко дну!
Re[6]: useless statement
От: Dihotom  
Дата: 18.11.09 14:26
Оценка:
AG>и BOOST_TYPEOF ? Пока обхожусь, он кажется имеет большой компайл-тайм оверхед.
Явно — нет, вроде как пока не требовался. Но BOOST_AUTO в него раскрывается.
Re[4]: useless statement
От: maykie Россия  
Дата: 19.11.09 11:11
Оценка:
Здравствуйте, Alexander G, Вы писали:


AG>Всё можно, но из действительно полезной препроцессорной магии, которая как бы добавляет языковые конструкции, могу вспомнить только countof, BOOST_FOREACH и BOOST_SCOPE_EXIT


countof это что? sizeof(array)/sizeof(array[0])?
Re[5]: useless statement
От: byleas  
Дата: 20.11.09 08:56
Оценка:
Здравствуйте, maykie, Вы писали:

M>countof это что? sizeof(array)/sizeof(array[0])?

Да, только типизированный.
Re[3]: useless statement
От: Zigmar Израиль  
Дата: 22.11.09 22:43
Оценка:
Здравствуйте, remark, Вы писали:
R>Но мне лично такая форма не очень нравится, не очень читаемо. Инвертировать все условия тоже не нравится, т.к. 'позитивные' условия обычно легче пишутся и читаются, чем 'негативные' (в смысле, что например "пришедший пакет корректный", а не "пришедший пакет не корректный").
R>А с unless имхо выглядит лучше:
R>
R>unless (lengthy_cond1
R>  && lengthy_cond2
R>  && lengthy_cond3
R>  && lengthy_cond4)
R>


А как насчет:
#include <iso646.h>
...
if ( not (lengthy_cond1
          && lengthy_cond2
          && lengthy_cond3
          && lengthy_cond4))

?
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
Re[4]: useless statement
От: remark Россия http://www.1024cores.net/
Дата: 23.11.09 06:15
Оценка:
Здравствуйте, Zigmar, Вы писали:

Z>А как насчет:

Z>
Z>#include <iso646.h>
Z>...
Z>if ( not (lengthy_cond1
Z>          && lengthy_cond2
Z>          && lengthy_cond3
Z>          && lengthy_cond4))
Z>

Z>?

Лучше.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: useless statement
От: maykie Россия  
Дата: 23.11.09 12:32
Оценка:
Z>А как насчет:
Z>
Z>#include <iso646.h>
Z>...
Z>if ( not (lengthy_cond1
Z>          && lengthy_cond2
Z>          && lengthy_cond3
Z>          && lengthy_cond4))
Z>


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