Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Четверговый сахарок / 25 сообщений из 37, страница 1 из 2
23.06.2016, 22:35
    #39261401
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Привет человеки.

Всегда хотел иметь вот такой вот инфиксный оператор

Код: javascript
1.
2.
3.
if (country in ("US","GB","AU")){
   lang="en";
}


Имеет право на жизнь сабж?
...
Рейтинг: 0 / 0
23.06.2016, 22:38
    #39261402
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
mayton,

В SQL живёт
Стало быть право на жизнь имеет
...
Рейтинг: 0 / 0
24.06.2016, 01:33
    #39261441
инфиксный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
maytonПривет человеки.

Всегда хотел иметь вот такой вот инфиксный оператор

Код: javascript
1.
2.
3.
if (country in ("US","GB","AU")){
   lang="en";
}


Имеет право на жизнь сабж?

Так можно:
http://ideone.com/uYitwb

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int main(void) 
{
	std::string lang, country = "GB";

	if (country == in ("US","GB","AU")){
		lang="en";
	}

	std::cout << "lang = " << lang << std::endl;

	return 0;
}


Outputlang = en
...
Рейтинг: 0 / 0
24.06.2016, 01:47
    #39261444
инфиксный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Или даже так: http://ideone.com/OLNtmD

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
int main(void) 
{
	std::string lang, country = "GB";

	if (country == in ("US","GB","AU")) 
	{
		lang="en";
	}
	
	if (country == in (1,2,3)) 
	{
		lang="hz";
	}
	
	int a, b = 10;
	
	if (b == in (1,2,10,3)) 
	{
		lang += " +100500";
	}

	std::cout << "lang = " << lang << std::endl;

	return 0;
}


Outputlang = en +100500
...
Рейтинг: 0 / 0
24.06.2016, 02:11
    #39261447
инфиксный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Не останавливаясь на достигнутом :)

Так даже лучше будет, с compile-time error для несоответствующих типов: http://ideone.com/PguQHi

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
int main(void) 
{
	std::string lang, country = "GB";

	if (country == in ("US","GB","AU")) 
	{
		lang="en";
	}
	
	//if (country == in (1,2,3)) lang="hz";	// compile error - deduced conflicting types
	
	int a, b = 10;
	
	if (b == in (1,2,10,3)) 
	{
		lang += " +100500";
	}

	std::cout << "lang = " << lang << std::endl;

	return 0;
}



Outputlang = en +100500
...
Рейтинг: 0 / 0
24.06.2016, 08:07
    #39261496
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
mayton,


Easy!

Код: java
1.
 implicit class StrWrapper(str : String) { def in(seq : Seq[String]) = seq.contains(str)} 



Получаем
Код: sql
1.
2.
3.
4.
5.
 
scala> "UA" in List("RU","EN","US","FR")
res1: Boolean = false 
scala> "RU" in List("RU","EN","US","FR")
res2: Boolean = true 
...
Рейтинг: 0 / 0
24.06.2016, 08:22
    #39261499
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
dimonz80,


Ну и женерик. Чет сразу не сообразил.
Код: sql
1.
implicit class AnyWrapper[T](a : T) { def in(seq  : Seq[T]) = seq.contains(a)}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
scala> 1 in List(1,2,3,4,5)
res0: Boolean = true

scala> 123 in List(1,2,3,4,5)
res1: Boolean = false

scala>  "RU" in List("RU","EN","US","FR")
res2: Boolean = true

scala> "UA" in List("RU","EN","US","FR")
res3: Boolean = false

scala> (1,2) in List((1,2),(3,4))
res4: Boolean = true

scala> (21,2) in List((1,2),(3,4))
res5: Boolean = false
...
Рейтинг: 0 / 0
24.06.2016, 08:28
    #39261505
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Оператор не нужен, потому что могут потребоваться дополнительные параметры, касающиеся способов сравнения: регистрозависимость строк и т. п. В операторе эти параметры "пихать" некуда.

Код: c#
1.
2.
3.
4.
// "Голый" C#

if (new[] { "US", "GB", "AU" }.Contains(country))
    lang = "en";


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// Велосипед на C#

if (Op.In(country, "US", "GB", "AU"))
    lang = "en";

......

static class Op
{
    public static bool In<T>(T value, params T[] values)
    {
        return values.Contains(value);
    }
}
...
Рейтинг: 0 / 0
24.06.2016, 08:55
    #39261517
dimonz80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Алексей КОператор не нужен, потому что могут потребоваться дополнительные параметры, касающиеся способов сравнения: регистрозависимость строк и т. п. В операторе эти параметры "пихать" некуда.


Логично. Только иногда легче читать/формулировать выражение именно так, как хочет ТС. Просто потому, что удобнее и читабельнее. DSL там вяские опять же. Написано же: "сахарок". Кому не нужен сахарок, пусть пишен на лиспе)))

автор"пихать" некуда.
За шарп не скажу, а в скале есть implicit'ы )))
...
Рейтинг: 0 / 0
24.06.2016, 09:09
    #39261524
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
dimonz80Кому не нужен сахарок, пусть пишен на лиспе)))Согласен. :-)
...
Рейтинг: 0 / 0
24.06.2016, 10:23
    #39261587
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Про Scala-вский in я был вкурсе. До этого нагуглил. Но конечно интересно было заюзать его варианты
в других языках в которых инфиксный оператор не так прост в реализации (по сути булева функция)
...
Рейтинг: 0 / 0
24.06.2016, 13:00
    #39261741
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
инфиксный,

лучше так:
Код: sql
1.
2.
country == any_of("US","GB","AU")
country == none_of("US","GB","AU")
...
Рейтинг: 0 / 0
24.06.2016, 13:01
    #39261743
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Чорт. Все равно знак == надо ставить.
...
Рейтинг: 0 / 0
24.06.2016, 13:21
    #39261763
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Можно так
Код: sql
1.
if(inlist(country,"US","GB","AU")) ...
...
Рейтинг: 0 / 0
24.06.2016, 13:24
    #39261766
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
Dima TМожно так
Код: sql
1.
if(inlist(country,"US","GB","AU")) ...


Да я от этого синтаксиса уходил. В этом и суть вопроса.
...
Рейтинг: 0 / 0
24.06.2016, 13:44
    #39261788
noukrop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
maytonПривет человеки.

Всегда хотел иметь вот такой вот инфиксный оператор

Код: javascript
1.
2.
3.
if (country in ("US","GB","AU")){
   lang="en";
}


Имеет право на жизнь сабж?

не имеет, потому что такие вещи должны решаться через static reference data, справочники из базы данных
что будет, если завтра туда надо будет вписать NZ?

ну понятно, что говнокодера нужно будет пинком под зад отправить в лучшем случае тестировщики, но а как правильно делать-то?
...
Рейтинг: 0 / 0
24.06.2016, 13:47
    #39261790
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
noukrop, а при чем тут базы данных? Многие алгоритмы хард-кодят вхождение переменной в сет.

Например "сумма прописью".
...
Рейтинг: 0 / 0
24.06.2016, 13:55
    #39261794
инфиксный
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
maytonЧорт. Все равно знак == надо ставить.

Работает и без ==

http://ideone.com/RUuyy7
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
int main(void) 
{
	std::string lang, country = "GB";

	if (country IN ("US","GB","AU")) 
	{
		lang="en";
	}
	
	//if (country IN (1,2,3)) lang="hz";	// compile error - deduced conflicting types
	
	int a, b = 10;
	
	if (b IN (1,2,10,3)) 
	{
		lang += " +100500";
	}

	std::cout << "lang = " << lang << std::endl;

	return 0;
}
...
Рейтинг: 0 / 0
24.06.2016, 13:58
    #39261797
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
инфиксный, ну круть. Скала и Кресты пока рулят.

Всё остальное - оцтой.
...
Рейтинг: 0 / 0
24.06.2016, 13:59
    #39261798
noukrop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
maytonnoukrop, а при чем тут базы данных? Многие алгоритмы хард-кодят вхождение переменной в сет.

Например "сумма прописью".

при том, что нужно нормальные примеры IN постать (если такие вообще существуют в природе), а не безграмотную укатайку.
...
Рейтинг: 0 / 0
24.06.2016, 14:00
    #39261801
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
noukropmaytonnoukrop, а при чем тут базы данных? Многие алгоритмы хард-кодят вхождение переменной в сет.

Например "сумма прописью".

при том, что нужно нормальные примеры IN постать (если такие вообще существуют в природе), а не безграмотную укатайку.
А чем мой пример был неграмотный?
...
Рейтинг: 0 / 0
24.06.2016, 14:04
    #39261803
noukrop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
maytonинфиксный, ну круть. Скала и Кресты пока рулят.

Всё остальное - оцтой.

кресты нифига ничем не рулят, они адски сложны и мегатормозны в компиляции.

даже простейший пример вида

Код: plaintext
1.
2.
3.
4.
5.
  int func(int param1 = 0; int param2; int param3)
...


  func(param2 => value1, param3 => value2);



вместо

Код: plaintext
1.
  func(0, value1, value2);



без абсолютно безумных 100500 строк темплейтов на бусте они осилить не в состоянии.
скучная монструозная хрень, нашпигованная шаблонными костылями в виде автоматизированной копи-пасты чуть более, чем полностью
...
Рейтинг: 0 / 0
24.06.2016, 14:05
    #39261804
noukrop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
maytonnoukropпропущено...


при том, что нужно нормальные примеры IN постать (если такие вообще существуют в природе), а не безграмотную укатайку.
А чем мой пример был неграмотный?

всем.

особенно тем, что список стран может расширяться и сокращаться в рантайме.
...
Рейтинг: 0 / 0
24.06.2016, 14:07
    #39261807
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
noukropскучная монструозная хрень, нашпигованная шаблонными костылями в виде автоматизированной копи-пасты чуть более, чем полностью
У меня дежа-вю. Такое ощущение что сам Луговский вернулся :)
...
Рейтинг: 0 / 0
24.06.2016, 14:08
    #39261808
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четверговый сахарок
В C# еще так можно сделать
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
if (country.In("US", "GB", "AU"))
    lang = "en";

......

    public static bool In<T>(this T value, params T[] values)
    {
        return values.Contains(value);
    }
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Четверговый сахарок / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]