Страница 1 из 1

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

Добавлено: 18 Сентябрь 2021, 15:21
Игорь Столяров
Привет всем !

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

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

  Return('123') & '456'
Что бы это значило ? :( Нельзя сказать, что после Return код не транслируется.

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

Добавлено: 19 Сентябрь 2021, 17:27
kreator
В чём проблема? Оператор return не предполагает скобок. Всё то, что после return считается выражением. Другое дело - почему не ругается на отсутствие пробела. Но и это наверно фича.

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

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

Получается, что добавление фрагмента & '456' преобразует функцию в оператор ...
Но тогда Return(ЗНАЧЕНИЕ) и Return (ЗНАЧЕНИЕ) должны быть разными. :(

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

Добавлено: 19 Сентябрь 2021, 21:38
Дед Пахом
Игорь Столяров писал(а): 19 Сентябрь 2021, 21:19 Функция Return(ЗНАЧЕНИЕ) преобразует возвращаемый результат к базовому типу
Вроде как Return не функция, а statement, а возвращаемый результат преобразуют к базовому типу скобки (), по крайней мере я так справку по RETURN перевёл.

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

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

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

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

Правильно ?

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

Добавлено: 20 Сентябрь 2021, 9:21
porutchik
если не уверен то наверно лучше RETURN (РЕЗУЛЬТАТ)

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

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

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

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

Правильно ?
Я думаю, что лучше без скобок. Хотя шаблоны генерят вот так:
GlobalResponse = ThisWindow.Run() ! Opens the window and starts an Accept Loop
RETURN(LOC:ReturnValue)
А в libsrc и так и так. Как будто нет разницы.

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

Добавлено: 20 Сентябрь 2021, 19:18
gopstop2007
не дойдите до вражды между тупоконечниками и остроконечниками, как у Гулливера :)

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

Добавлено: 20 Сентябрь 2021, 20:02
Игорь Столяров
Виртуального мордобоя здесь точно не будет ... :)
Просто есть некоторое недопонимание происходящего.

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

i.jpg

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

Добавлено: 20 Сентябрь 2021, 20:33
porutchik
404 сейчас не постят - украинцы обижаются %)

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

Добавлено: 20 Сентябрь 2021, 21:52
kreator
Игорь Столяров писал(а): 20 Сентябрь 2021, 20:02 OK ! Создаём в APP процедуру с прототипом Test(),*Long и видим как шаблоны генерят нам Return(RetValue) ...
И работает?

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

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

Но это же SV Clarion. Здесь и невозможное - возможно ... ;)

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

Добавлено: 21 Сентябрь 2021, 11:49
kreator
Подозреваю - в справке хрень написана. Когда-то и было различие. Сейчас его нет. Ну и правильно!

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

Добавлено: 24 Сентябрь 2021, 11:11
Дед Пахом
Вот простой пример про скобки.

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

  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