В дебрях синтаксиса

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

В дебрях синтаксиса

Сообщение Игорь Столяров »

Привет всем !

Долго вылавливал проблему в своём коде. И я её поймал ! :)
Если утрировать - то проблема была в том, что вот такой код,
с точки зрения транслятора, является абсолютно корректным:

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

  Return('123') & '456'
Что бы это значило ? :( Нельзя сказать, что после Return код не транслируется.
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

В дебрях синтаксиса

Сообщение kreator »

В чём проблема? Оператор return не предполагает скобок. Всё то, что после return считается выражением. Другое дело - почему не ругается на отсутствие пробела. Но и это наверно фича.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

В дебрях синтаксиса

Сообщение Игорь Столяров »

kreator писал(а): 19 Сентябрь 2021, 17:27 В чём проблема?
Дело не в том, что проблема. Понять бы ...
Насколько я знаю функция Return(ЗНАЧЕНИЕ) и оператор Return ЗНАЧЕНИЕ - это разное.
Функция Return(ЗНАЧЕНИЕ) преобразует возвращаемый результат к базовому типу и
поэтому не может использоваться, например, для возврата указателей (не путать с адресом).

Получается, что добавление фрагмента & '456' преобразует функцию в оператор ...
Но тогда Return(ЗНАЧЕНИЕ) и Return (ЗНАЧЕНИЕ) должны быть разными. :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

В дебрях синтаксиса

Сообщение Дед Пахом »

Игорь Столяров писал(а): 19 Сентябрь 2021, 21:19 Функция Return(ЗНАЧЕНИЕ) преобразует возвращаемый результат к базовому типу
Вроде как Return не функция, а statement, а возвращаемый результат преобразуют к базовому типу скобки (), по крайней мере я так справку по RETURN перевёл.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

В дебрях синтаксиса

Сообщение Игорь Столяров »

Как я понимаю справку - нужно всегда использовать конструкцию

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

  RETURN РЕЗУЛЬТАТ
если нет каких-то особых требований.
Например передачи результата в программу на другом языке программирования.

Правильно ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
porutchik
Активист
Сообщения: 150
Зарегистрирован: 01 Февраль 2009, 5:35

В дебрях синтаксиса

Сообщение porutchik »

если не уверен то наверно лучше RETURN (РЕЗУЛЬТАТ)
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

В дебрях синтаксиса

Сообщение kreator »

Игорь Столяров писал(а): 20 Сентябрь 2021, 8:44 Как я понимаю справку - нужно всегда использовать конструкцию

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

  RETURN РЕЗУЛЬТАТ
если нет каких-то особых требований.
Например передачи результата в программу на другом языке программирования.

Правильно ?
Я думаю, что лучше без скобок. Хотя шаблоны генерят вот так:
GlobalResponse = ThisWindow.Run() ! Opens the window and starts an Accept Loop
RETURN(LOC:ReturnValue)
А в libsrc и так и так. Как будто нет разницы.
We are hard at work… for you. :)
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

В дебрях синтаксиса

Сообщение gopstop2007 »

не дойдите до вражды между тупоконечниками и остроконечниками, как у Гулливера :)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

В дебрях синтаксиса

Сообщение Игорь Столяров »

Виртуального мордобоя здесь точно не будет ... :)
Просто есть некоторое недопонимание происходящего.

Одно я рассказал в первом сообщении, другое заключается в том, что в справке написано:
Относительно использования скобок с RETURN, если функция имеет тип возвращаемой переменной или указателя, возвращаемая переменная использованная в операторе RETURN не должна заключаться в круглые скобки.
OK ! Создаём в APP процедуру с прототипом Test(),*Long и видим как шаблоны генерят нам Return(RetValue) ... :(

i.jpg
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
porutchik
Активист
Сообщения: 150
Зарегистрирован: 01 Февраль 2009, 5:35

В дебрях синтаксиса

Сообщение porutchik »

404 сейчас не постят - украинцы обижаются %)
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

В дебрях синтаксиса

Сообщение kreator »

Игорь Столяров писал(а): 20 Сентябрь 2021, 20:02 OK ! Создаём в APP процедуру с прототипом Test(),*Long и видим как шаблоны генерят нам Return(RetValue) ...
И работает?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

В дебрях синтаксиса

Сообщение Игорь Столяров »

kreator писал(а): 20 Сентябрь 2021, 21:52И работает?
Да. Видимо указатель преобразуется к какому-нибудь базовому типу ULONG, каковым он и является ...
Другой вопрос, что будет с указателем на сложный составной тип или QUEUE (в C11), по идее должна
рушиться проверка типизации при присвоении результата функции ... :(

Но это же SV Clarion. Здесь и невозможное - возможно ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

В дебрях синтаксиса

Сообщение kreator »

Подозреваю - в справке хрень написана. Когда-то и было различие. Сейчас его нет. Ну и правильно!
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

В дебрях синтаксиса

Сообщение Дед Пахом »

Вот простой пример про скобки.

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

  PROGRAM

  MAP
    GetLongRef(BOOL pUseBracesInReturn), *LONG
  END

ThisLong                      LONG(100)
ThisAddress                   LONG, AUTO
ThisRef                       &LONG, AUTO

  CODE
  ThisAddress = ADDRESS(ThisLong)

  !- return x
  ThisRef &= GetLongRef(FALSE)    !- ThisRef ссылается на ThisAddress
  MESSAGE('RETURN x = '& ThisRef)
  
  !- return (x)
  ThisRef &= GetLongRef(TRUE)     !- ThisRef ссылается на ThisLong
  MESSAGE('RETURN(x) = '& ThisRef)
  
GetLongRef                    PROCEDURE(BOOL pUseBracesInReturn)
  CODE
  IF pUseBracesInReturn
    RETURN (ThisAddress)
  ELSE
    RETURN ThisAddress
  END
  
С уважением, ДП
Ответить