Аналог сишного оператора ? :

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аналог сишного оператора ? :

Сообщение carrots » 25.05.2012 02:57:28

В C-подобных языках можно подставлять в выражениях аргументы в зависимости от условий, типа a < b ? C : D.
Есть ли в freepascal какой-то аналог? Кто-то интересовался?
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Аналог сишного оператора ? :

Сообщение Mr.Smart » 25.05.2012 09:08:07

Нет. Инлайн функции IfThen совершенно не то.
viewtopic.php?f=1&t=6228
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Аналог сишного оператора ? :

Сообщение carrots » 25.05.2012 11:35:21

Да ifthen не подходит :? ....

Вообще мне не очень нравится как выглядит этот оператор в C ибо бывает напишешь что-то типа
Код: Выделить всё
a < b ? (d > a && z || b : a - b) : a && f1 && f2 || b = a ? f3:f4;
, удобно, но через пол года возвращаешься к этому коду и долго думаешь как-же оно работает.

Но сейчас нужно сделать какой-то аналог для своего интерпретатора, поскольку он используется для создания html шаблонов - короткие выражения там важны, но нужно чтоб были интуитивно понятными.
Думал сделать типа
c if a < b else f1 and f2 or fe1 if x > b else fc1;

то есть поставить условие в центре, так легче понять ветвления
c if a > b else d
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Аналог сишного оператора ? :

Сообщение vada » 25.05.2012 11:54:49

Классика
Код: Выделить всё
ifthen(p = nil, 0, p^.a);

получаем по зубам.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Аналог сишного оператора ? :

Сообщение Сквозняк » 25.05.2012 21:31:04

А не проще для операций сравнения написать несколько функций?
Сквозняк
энтузиаст
 
Сообщения: 1129
Зарегистрирован: 29.06.2006 22:08:32

Re: Аналог сишного оператора ? :

Сообщение carrots » 25.05.2012 23:01:31

Зачем много функций? Можно обойтись одним дженериком, но проблема в том что и в том и в другом случае исполняются все операнды, а должно исполняться только два и то как правило не полностью.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Аналог сишного оператора ? :

Сообщение Brainenjii » 25.05.2012 23:07:01

а для реализации надо-то только макросы с параметрами....
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Аналог сишного оператора ? :

Сообщение carrots » 26.05.2012 01:59:01

Макросы тут не помогут, поскольку условие должно проверяться вовремя исполнения, а не перед компиляцией.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Аналог сишного оператора ? :

Сообщение alexs » 26.05.2012 08:10:23

carrots писал(а):, удобно, но через пол года возвращаешься к этому коду и долго думаешь как-же оно работает.


А зачем самому себе проблемы делать?
Почему не пользоваться старым добрым if then else?
И стандартно, и читаемость выше, и через пол года не забудешь, что написал.
PS
Только вот не надо флейм об экономии времени набора конструкции... Это будет просто смешно...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Аналог сишного оператора ? :

Сообщение Brainenjii » 26.05.2012 08:57:01

экономия строчек и DRY ^_^
Код: Выделить всё
  var param = (object.value?object.value:"нет значения")

против
Код: Выделить всё
  If assigned(object.value) Then
    param := object.value
  Else
    param := 'нет значения';

а насчет макроса - если бы было что-то вроде:
Код: Выделить всё
{$define MIfThen :=
  if ($1) Then $0 := $2 Else $0 := $3;}

та же конструкция выглядела бы как
Код: Выделить всё
MIfThen(param, Assigned(object.value), object.value, 'нет значения');
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Аналог сишного оператора ? :

Сообщение alexs » 26.05.2012 13:19:33

Brainenjii писал(а):экономия строчек и DRY ^_^

А кому нужна эта экономия строчек?
Зато 2-й вариант гораздо более читабелен.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Аналог сишного оператора ? :

Сообщение Mr.Smart » 26.05.2012 22:53:46

Сейчас как, холивар начнётся:D
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Аналог сишного оператора ? :

Сообщение carrots » 27.05.2012 00:38:42

alexs писал(а):Почему не пользоваться старым добрым if then else?
И стандартно, и читаемость выше, и через пол года не забудешь, что написал.
PS
Только вот не надо флейм об экономии времени набора конструкции... Это будет просто смешно...

Делать себе неприятности конечно не хочется, вопрос в том как сделать чтоб сохранить удобность но при этом чтоб было интуитивно понятно.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Аналог сишного оператора ? :

Сообщение alexs » 27.05.2012 11:28:43

Попробуйте написеть ifeb и сразу нажать ctrl+J
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Аналог сишного оператора ? :

Сообщение VirtUX » 28.05.2012 10:15:32

Оффтоп:
Терпеть не могу всякие сокращения! Особенно, если ковыряешься в чужом коде! Ох уж эти Си'шники - повбывав бы всих :D
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru