В большинстве языков программирования переменные не имеют идентифицирующих символов, как в PHP. В PHP вы должны префикс переменной с $
символом.
Пример;
var $foo = "something";
echo $foo;
Я разрабатываю новый язык сценариев для бизнес-приложений, и у моих целевых пользователей нет опыта программирования. Эти символы облегчают чтение и использование кода?
Одна из причин, по которой PHP использует это, $
заключается в том, что без него PHP не может определить, является ли имя ссылкой на функцию или ссылку на переменную. Это потому, что язык допускает странные ссылки на функции. Таким образом, $
символ помогает анализатору разделить пространство имен.
У меня нет этой проблемы в моем парсере. Так что мой вопрос чисто о читабельности и простоте использования. Я столько лет программировал на PHP, что, когда я вижу, $foo
мне легко определить это как переменную. Я просто отдаю предпочтение этому идентификатору?
источник
sigils
три раза сегодня в разговорах.var $x = ...
илиtype $x = ...
тогда, я думаю, что $ излишне. Если бы вы только что$x = ...
это сделали, это могло бы стоить сделать. Особенно, если вы не хотите поддерживать подсветку синтаксиса в обычных редакторах. Однако, как предпочтение, мне не нравитсяsigils
Ответы:
Фактические технические возможности и ограничения не имеют ничего общего с тем, что предлагается в этой теме. Давайте сначала разберемся с ними.
Вот что $ делает возможным в PHP:
$return
или возможность использовать одно и то же имя для переменной и функции / константы, например$__FILE__
Ограничения или функции, не связанные с префиксом $:
Это означает, что нет технической причины, по которой вы не могли бы
или
Однако вы не можете иметь (при условии,
return
что это ключевое слово)Без серьезных осложнений. Если бы вы использовали такой префикс как
$
, то это не было бы проблемой.Это мнение, но я полагаю, что сигил будет стоить того, чтобы не программисты, поскольку он позволяет им использовать ключевые слова в качестве имен переменных, для них это будет выглядеть как произвольное ограничение: P
источник
return = "something";
, C # имеет «контекстные ключевые слова», что также стоит проверить при разработке языков.@return = "something;"
. Да, есть несколько контекстных ключевых слов, но сделать их все контекстными означало бы гораздо более сложную реализацию.Сигилы на самом деле имеют гораздо больше смысла в perl, где они обеспечивают определенную проверку типов. В php они мало помогают вне шаблонов. Вы можете почувствовать их полезность и читабельность, глядя на разные языки. Вряд ли их используют.
В языке, ориентированном на конечного пользователя, над которым я работаю, я даже иду дальше, делая идентификаторы нечувствительными к регистру и допуская пробелы и апострофы. Это позволяет мне делать такие имена переменных
Karl's height
намного ближе к естественным языкам.источник
At Karl's for the night = true;
map sum
это частично примененный вызов функции - функцияsum
передается в качестве параметраmap
. Но оба они являются просто именами библиотек, поэтому при наличииmap sum
многословных идентификаторов компилятор не может знать, является ли один многословный идентификатор или приложение-функция, основанное на двух однословных идентификаторах.Несколько лет назад я выучил Applesoft Basic. К строкам всегда добавляется суффикс,
$
а к массивам - суффикс%
. Вот как работает язык. Вы смотрели на что-то, вы знали, что это было. Я никогда не слишком углублялся в переводчика, чтобы понять, почему это так, или конструктивные решения, которые сделали это так.Символ в php происходит от его perl-влияния (на которое повлияли
awk
иsh
). Символ в Perl - это нечто большее, чем просто то,$
что он может идентифицировать много разных типов:$
скаляр@
список%
гашиш&
кодоблок*
тип-глобСимвол определяет, какую часть структуры таблицы символов вы просматриваете. За кулисами запись таблицы символов для foo (доступ через
*foo
- typeglob) содержит все, что может быть foo. Существует$foo
,@foo
,%foo
, то форматfoo
,&foo
, то указатель_на_файл Foo, и т.д ...Это также позволяет создать псевдоним одной переменной для другой:
Это печатает
foo 1 2
- в Perl, это то, для чего на самом деле предназначены сигилы , не то, что вы должны это делать, а то, что есть нечто закулисное, что они делают.В сигилах не так много для удобства чтения, а так , что один может иметь
$foo
и@foo
без столкновения в пространстве имен (сравните другие языки, где нельзя иметь обаint foo; int[] foo;
)Символы читабельности - это то, что изучается как часть любого языка - чтение синтаксиса. Гипотетически, вы можете принудить сам тип (как венгерская нотация) быть частью идентификатора.
Что-то в лекс по линии:
И тогда вы могли бы иметь такой код
Я не говорю, что это хорошая идея, а скорее, что тот, кто привык к языку, сможет читать его по-родному и думать, что он улучшает читабельность, в то время как тот, кто не знаком с языком, может подумать, что он просто добавляет куча шума для языка.
Однако, после работы с языком, определенным таким образом, я, вероятно, мог прочитать его без проблем.
Некоторые люди любят их, некоторые нет. На различных форумах обсуждаются великие священные войны, и все сводится к тому, насколько вы их использовали.
Можно создать новый язык для непрограммистов, использующих сигилы, и любой, кто никогда не программировал раньше, никогда не будет жаловаться на них. С другой стороны, вы не могли бы использовать их как часть языка, и тогда бы программисты ruby или perl жаловались на то, что они упускают какую-то ключевую информацию.
Это действительно не имеет значения. Что важно, так это то, как сигилы будут вписываться в язык, если вы их используете или нет. Вы хотите быть в состоянии сделать
"123 $foo 456"
или вы должны сделать"123 " + foo + " 456"
? Это где решение должно быть принято.источник
"123 $foo 456"
, не включена префиксом сигилы и является полностью ортогональной к нему.$asd
синтаксис строковой интерполяции, если$
он уже использовался для префиксов переменных, но это не имело ничего общего с реальной возможностью реализации интерполяции строк.#
который используется в coffeescript, например. И coffeescript не имеет префикса переменные с#
- на самом деле это вообще не префикс переменных)Я не согласен с тем, что PHP использует $ для отличия переменных от funcs. Хотя бы потому, что в PHP есть C-подобный синтаксис, а у funcs () есть имена после имени.
Прочитайте этот пост о переполнении стека о том, почему $ в PHP.
Многие популярные языки, такие как C, C ++, C #, Java не используют $, и мы можем легко отличить var от функции.
В PHP $ помогает, например, когда вы пишете: echo "var = $ var"
Без этого такой трюк будет невозможен.
источник
echo "var = $var"
fn()[]
с разумной грамматикой, которая бы работала из коробки, даже не задумываясь об этом.После всех этих ответов я хочу дать еще несколько очков Мэтью Фоскарини.
являются побочными эффектами этого LEXER , потому что он способен распознавать токен.
Возьмем для примера: в SQL мы используем «», чтобы иметь возможность использовать идентификаторы с зарезервированными словами и даже идентификаторы с пробелами «Имя», «Имя группы». GROUP является ключевым словом. Была проблема - было специальное решение.
PS Очень хороший комментарий от MichaelT.
источник
$
. Также «возможность размещать переменную внутри строки» не из-за того, что переменные имеют префикс с таким символом, как$
. То есть"123 $foo 456"
будет работать, даже если синтаксис переменной похож наfoo = 3
или@foo = 3
. Они не связаны друг с другом.... сигил позволяет:
Лучше отличать переменные от не переменных . Люди, которые все еще изучают основные понятия, могут столкнуться с трудностями при определении того, какие слова являются переменными, а какие нет. Они часто начинают с чтения примеров или чужого кода без достаточного фона.
Используйте зарезервированные ключевые слова или имена функций в качестве имен переменных . Иногда я обнаруживал, что некоторые из этих имен являются правильными для переменной (то есть,
$count
когда была определенаcount()
функция), и благодарил сигил за предоставленную мне возможность использовать их.источник
$
знаком. Я помню, как знак доллара смущал меня, когда я был ребенком, из-за присущей ему денежной ассоциации.%
может быть реальной альтернативой.