Добавление "универсального" префикса типа для переменных
Было предложено следующее изменение языка: при отсутствии префикса типа для переменной / массива, считать это “универсальным” префиксом и записывать / читать значение “как есть”.
Сейчас, если в переменной $X[0] записана строка, то обращение X[0] вернет 0, т.к. тип не соответствует ожидаемому и возвращается значение по умолчанию (ячейка массива как бы не инициализирована).
Если добавить “универсальный” префикс, то X[0] вернет строку - фактическое значение в ячейке.
Аналогично с присваиванием - станет возможным делать X[0]="asdasdas" - будет присвоена строка.
Это изменение позволит упростить некоторые сценарии, когда тип значения неважен - нужно просто его вывести / прочитать / передать куда-то еще.
Обратная совместимость не нарушается, если для неинициализированных переменных возвращать 0 (по умолчанию универсальный префикс - число).
Главный минус этого “универсального” префикса - будет сложнее понимать какой тип данных указан в переменной / что ожидает игра - нужно проверять фактические присваивания. В этом случае есть риск того, что авторы начнут повсюду использовать универсальный префикс и разбираться в коде станет сложнее.
Из компромиссов:
-
разрешить чтение / запись значения “как есть” только для
ARRITEM/SETVAR. -
добавить новый, более явный префикс - например “~”:
~X[0]/~X(мне не очень нравится этот вариант, честно говоря).
Хочется обсудить и услышать разные мнения - нравится / не нравится, нужно / не нужно / как лучше это сделать.
PS. Явные префиксы $ / # / % в любом случае останутся.
Я тут заметил у меня половина кода написано как повезет в плане префиксов. Все операторы и функции не имеют жесткой привязки и можно использовать их в качестве переменных.
curloc=1 & !'Заблокирован'
$curloc='2' & !'Заблокирован'
#curloc=3 & !'Можно использовать'
%curloc=[88] & !'Можно использовать'
curloc
$curloc
#curloc
%curloc
!gs=11 & 'Заблокирован'
$gs='22' & !'Игнор'
#gs=33 & !'Можно использовать'
!gs
$gs
#gs
$стр='12345'
LEN($стр) & !'Работает'
!$LEN($стр) & !'Ошибка'
#LEN($стр) & !'Работает'
!%LEN($стр) & !'Ошибка'
STR=11
$STR='azaza'
#STR=55
%STR=[77]
!STR & !'Ошибка'
!$STR
#STR
%STR
Может стоит ввести для них универсальность, что бы все префиксы и операторах работали как один, и они не светились как ёлка на новый год? Когда-то меня очень злило что не мог засунуть силу персонажа в STR, но зачем тогда оставлять доступ к # и % мне не понятно, и так по всем остальным, они только с толку сбивают.
$mid, #mid, %mid - должны работать и подсвечиваться как простой mid не зависимо от префикса, тогда возможно будет меньше путаниц, и код станет красивее?.
Два общих правила:
- Использовать зарезервированные имена в качестве переменных крайне не рекомендуется.
- Для функций можно указывать префикс типа в случае, если функция возвращает значения этого типа.
В редакторах действительно стоит воспринимать все префиксы как префиксы, а не как часть имени - это проблема в QGen.
Byte:
В редакторах действительно стоит воспринимать все префиксы как префиксы, а не как часть имени
с эстетической точки зрения, когда префиксы подсвечиваются, как часть имени, код выглядит лучше. Не такой пёстрый. Но это оффтоп.
При правке игр с MAX/MIN в принципе сужается поле правок до вхождений с универсальным префиксом при условии, что в массиве хранятся разные типы данных.
Ещё я подумал про вопросительный знак в кач-ве универсального префикса. Мне кажется семантически это выглядит более правильно:
?value = @random_value()
Но меня всё равно смущает бессмысленность его введения в таком виде, потому что задумываясь о том, что тебе нужно написать префикс, ты скорее выберешь конкретный тип, а не Any, и позаботишься, чтоб функция возвращала этот конкретный тип.
!' По идеи префиксы должны работать везде, я вижу это так:
a - универсальный
$a - текст
#a - число
min('a') - вернет число, если нет тогда текст, если нет текста цифру - 0
min('$a') - вернет текст или пустую строку
min('#a') - вернет число или 0
$min('a') - вернет текст или пустую строку
$min('$a')- вернет текст или пустую строку
$min('#a')- вернет пустую строку
#min('a') - вернет число или 0
#min('$a')- вернет 0
#min('#a')- вернет число или 0
Сейчас префикс игнорируется кодом (по сути он бесполезный): '
$a[0]='art'
$a[1]='aaa'
#a[2]=5
#a[3]=2
$a[4]='tttt'
a[5]=7
!a[6]='пока не работает'
min('a')
min('$a')
$min('#a')
$min('$a')
#min('a')
#min('$a')
!#min('$a')- возвращает текст, хотя я явно приказал функции вернуть число. НАКАЗАТЬ ФУНКЦИЮ!
Сейчас префиксы типов для функций - для тех, кто любит явно указывать тип результата (для чтения кода).
Если хочется поведения, аналогичного переменным, то можно сделать, что если указан префикс типа для функции, но она вернула другой тип данных, то возвращается “значение по умолчанию” для указанного префикса.
Не знаю насколько это нужно, но это будет похоже на то, как работают префиксы типа для переменных.
Aleks Versus:
Ещё я подумал про вопросительный знак в кач-ве универсального префикса. Мне кажется семантически это выглядит более правильно.
Мне не очень нравится отдельный символ для универсального префикса т.к. тогда появляются вопросы к семантике отсутствия префикса.