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

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

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

Ответить
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

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

Сообщение carrots »

В C-подобных языках можно подставлять в выражениях аргументы в зависимости от условий, типа a < b ? C : D.
Есть ли в freepascal какой-то аналог? Кто-то интересовался?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Нет. Инлайн функции IfThen совершенно не то.
viewtopic.php?f=1&t=6228
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

Да 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
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Классика

Код: Выделить всё

ifthen(p = nil, 0, p^.a);

получаем по зубам.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

А не проще для операций сравнения написать несколько функций?
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

Зачем много функций? Можно обойтись одним дженериком, но проблема в том что и в том и в другом случае исполняются все операнды, а должно исполняться только два и то как правило не полностью.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

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

Сообщение carrots »

Макросы тут не помогут, поскольку условие должно проверяться вовремя исполнения, а не перед компиляцией.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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


А зачем самому себе проблемы делать?
Почему не пользоваться старым добрым if then else?
И стандартно, и читаемость выше, и через пол года не забудешь, что написал.
PS
Только вот не надо флейм об экономии времени набора конструкции... Это будет просто смешно...
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

экономия строчек и 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, 'нет значения');
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

А кому нужна эта экономия строчек?
Зато 2-й вариант гораздо более читабелен.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Сейчас как, холивар начнётся:D
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

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

Делать себе неприятности конечно не хочется, вопрос в том как сделать чтоб сохранить удобность но при этом чтоб было интуитивно понятно.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Попробуйте написеть ifeb и сразу нажать ctrl+J
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Оффтоп:
Терпеть не могу всякие сокращения! Особенно, если ковыряешься в чужом коде! Ох уж эти Си'шники - повбывав бы всих :D
Ответить