Подтвердить что ты не робот

Каков формальный термин для токена "# {}" в синтаксисе Ruby?

Фон

Недавно я опубликовал ответ, где я по-разному упоминал #{} как литерал, оператор и (в одном черновике) "литерал-конструктор". Скромность этого определения на самом деле не влияла на качество ответа, поскольку вопрос был больше о том, что он делает, и о том, как найти для него языковые ссылки, но я недоволен тем, что не могу указать на каноническое определение точно что бы назвать этот элемент синтаксиса Ruby.

Рубиновое руководство упоминает этот синтаксический элемент в разделе подстановка выражения, но на самом деле не определяет термин для самого синтаксиса. Почти каждая ссылка на этот языковой элемент говорит, что он используется для строковой интерполяции, но не определяет, что это такое.

Определения Википедии

Вот некоторые определения Википедии, которые подразумевают, что эта конструкция (строго говоря) не является ни литералом, ни оператором.

Вопросы

Кто-нибудь знает, каков правильный термин для этого языкового элемента? Если да, можете ли вы указать мне формальное определение?

4b9b3361

Ответ 1

TL; DR

Первоначально я предположил:

Встроенное выражение кажется наиболее вероятным определением для этого токена, основанного на подсказках в исходном коде.

Это оказалось правдой и официально подтверждено документацией Ruby 2.x. Основываясь на обновлениях Ripper documentation, поскольку этот ответ был первоначально написан, кажется, что токен парсера формально определяется как string_embexpr, а символ сам по себе называется "встроенным выражением". См. Раздел "Обновление для Ruby 2.x" в нижней части этого ответа для подробного подтверждения.

Остальная часть ответа по-прежнему актуальна, особенно для более старых Rubies, таких как Ruby 1.9.3, и методология, используемая для разработки исходного ответа, остается интересной. Поэтому я обновляю ответ, но оставляю основную часть исходного сообщения как есть для исторических целей, хотя текущий ответ теперь может быть короче.

Pre-2.x Ответ на основе Ruby 1.9.3 Исходный код

Связанный ответ

Этот ответ обращает внимание на источник Ruby, который дает многочисленные ссылки на embexpr на всей базе кода. @Phlip предполагает, что эта переменная является аббревиатурой для "EMBedded EXPRession". Это похоже на разумную интерпретацию, но ни источник ruby-1.9.3-p194, ни Google (на момент написания этой статьи) явно не ссылаются на термин встроенное выражение в сочетании с embexpr в любом контексте, связанном с Ruby или нет.

Дополнительные исследования

Сканирование исходного кода Ruby 1.9.3-p194 с помощью

ack-grep -cil --type-add=YACC=.y embexpr .rvm/src/ruby-1.9.3-p194 |
    sort -rnk2 -t: |
    sed 's!^.*/!!'

отображает 9 файлов и 33 строки с термином embexpr:

test_scanner_events.rb:12
test_parser_events.rb:7
eventids2.c:5
eventids1.c:3
eventids2table.c:2
parse.y:1
parse.c:1
ripper.y:1
ripper.c:1

Особый интерес представляет включение string_embexpr в строку 4,176 из файлов parse.y и ripper.y. Аналогично, TestRipper:: ParserEvents # test_string_embexpr содержит две ссылки на синтаксический анализ # {} на строках 899 и 902 test_parser_events.rb.

Сканер, выполненный в test_scanner_events.rb, также заслуживает внимания. Этот файл определяет тесты в #test_embexpr_beg и #test_embexpr_end, которые просматривают токен # {expr} внутри различных строковых выражений. Тесты ссылаются как на embexpr, так и expr, повышая вероятность того, что "встроенное выражение" действительно является разумным именем для этой вещи.

Обновление для Ruby 2.x

Поскольку этот пост был первоначально написан, документация для стандартной библиотеки Ripper-класса была обновлена, чтобы формально идентифицировать токен. Раздел предоставляет "Hello, #{world}!" в качестве примера и частично говорит:

В нашем :string_literal вы увидите два @tstring_content, это буквальная часть для Hello, и !. Между двумя операторами @tstring_content есть :string_embexpr, где embexpr является встроенным выражением.

Ответ 2

Ruby parser вызывает # {} оператор embexpr. Это EMBedded EXPRession, естественно.

Ответ 3

Я бы определенно не назвал его ни литералом (что больше для, например, строковых литералов или литералов числа, но не их частей), ни оператора; они предназначены исключительно для, например, двоичные или унарные (инфиксные) операторы.

Я бы либо просто ссылался на него без существительного (т.е. для строковой интерполяции), либо, возможно, назвал эти символы строкой интерполяционной последовательности или escape.