Гипотетическое затруднение конкатенации - PullRequest
3 голосов
/ 27 ноября 2011

Так что я работаю над простым микроязыком / альтернативным синтаксисом для PHP. Его синтаксис во многом основан на JavaScript и CoffeeScript, включая несколько моих собственных концепций. Я вручную написал парсер (генератор парсера не использовался) на PHP, чтобы преобразовать код в PHP и выполнить его. Это скорее доказательство концепции / инструмента обучения, а не чего-то еще, но я бы соврал, если бы сказал, что не хочу, чтобы его использовали в реальном проекте однажды.

В любом случае, вот небольшая проблема, с которой я столкнулся, и я подумал, что навязываю вам великий интеллект:

Как вы знаете в PHP, точка (.) Используется для конкатенации строк. Однако в JavaScript он используется для цепочки методов.

Теперь одна вещь, которая раздражает меня в PHP, это необходимость использовать эту чертову стрелку (->) для цепочек моих методов, поэтому я пошел по пути JavaScript и реализовал точку (.) Для использования с объектами.

(думаю, вы уже видите проблему)

Поскольку в настоящее время я пишу только «тупой» синтаксический анализатор, который просто выполняет огромный поиск и замену, невозможно определить, используется ли точка (.) Для конкатенации или для цепочки методов.

«Так что, если вы пытаетесь быть похожим на JavaScript, просто используйте оператор сложения (+) Franky!», Я слышу, как вы кричите. Что ж, я бы хотел, но поскольку оператор сложения (+) используется для математики в PHP, я бы просто поставил себя в такую ​​же ситуацию.

Если я не смогу сделать свой синтаксический анализатор достаточно умным (с дерьмовым грузом работы), чтобы знать, что когда оператор сложения (+) работает с целыми числами, не превращайте его в точку (.) Для объединения, я довольно сильно прикручен.

Но вот классная вещь. Потому что это в значительной степени новый язык. Мне не нужно использовать точку или оператор сложения для объединения.

Итак, мой вопрос: если бы я решил ввести новый метод конкатенации строк, какой символ имел бы больше смысла?

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

Это должен быть один символ? .. может работать!

Любое множество комбинаций, таких как ~~ или >: даже!

1 голос
/ 27 ноября 2011

Итак, мой вопрос: если бы я решил ввести новый метод конкатенации строк, какой символ был бы наиболее целесообразным?

Как вы хорошо знаете,вам нужно будет выбрать символ, который не используется в качестве одного из операторов PHP .Так как конкатенация строк является обычной техникой, я бы постарался не использовать символы, которые нужно набирать SHIFT для ввода, поскольку эти символы будут помехой.

Вместо попытки назначить один символ для конкатенации строк(поскольку большинство из них уже используются), возможно, вам следует определить собственный синтаксис для конкатенации строк (или любую другую операцию, которую вам нужно перезаписать другим оператором), в качестве сокращенного оператора (своего рода).Что-то вроде:

[$string, $string]

Должно быть легко подобрать парсером и сформировать полученную в результате сцепленную строку.

Редактировать: Я должен также отметить, что вы 'Используя буквенные строки или переменные, я не могу (насколько я знаю) перепутать этот синтаксис с любыми другими функциями PHP, поскольку запятая в середине недопустима для манипуляций с массивами.Таким образом, все следующее будет по-прежнему распознаваться как конкатенация строк, а не что-то еще в PHP.

["stack", "overflow"]
["stack", $overflow]
[$stack, $overflow]

Редактировать: Поскольку это конфликтует с нотацией JSON,Существуют следующие альтернативные варианты:

  1. Изменение разделителя
  2. Исключение разделителя

Пример:

[$stack $overflow $string $concatenation] // Use nothing (but really need space)
1 голос
/ 27 ноября 2011

Если вы не хотите использовать + или., Тогда я бы порекомендовал ^, потому что он используется в некоторых других языках для конкатенации строк, и я не верю, что он используется для чего-либо в PHP. Редактировать: Было отмечено, что он используется для XOR.В любом случае можно использовать ^, поскольку побитовое значение XOR обычно не используется, а затем сопоставить что-то еще, например ^^, с XOR.Другой вариант - использовать .. для объединения.Проблема в том, что в основном используются одиночные символы.

Другой вариант - использовать +, но сопоставить его с функцией, которая объединяет, когда один аргумент является строкой, и добавляет иначе.Чтобы не разбивать вещи, которые основаны на строках, которые являются числами, которые рассматриваются как их значения, мы, вероятно, должны рассматривать числовые строки как числа для этих целей.Вот функция, которую я бы использовал.

function smart_add($arg1,$arg2) {
    if ($arg1.is_numeric() && $arg2.is_numeric()) {
        return $arg1 + $arg2;
    } else {
        return $arg1 . $arg2;
    }
}

Тогда a + b + c + d просто превращается в smart_add(smart_add(smart_add(a,b),c),d)

Это может быть не идеально во всех случаях, но оно должно работать довольно хорошо, большинствовремени и имеет четкие правила использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...