Друг заставил меня взглянуть на эту страницу и заметил странный фрагмент кода в сигнатуре одного из пользователей форума.
Код является однострочным, который выглядит следующим образом:
On Local Error Resume Next: If Not Empty Is Nothing Then Do While Null: ReDim i(True To False) As Currency: Loop: Else Debug.Assert CCur(CLng(CInt(CBool(False Imp True Xor False Eqv True)))): Stop: On Local Error GoTo 0
Прокрутка удалена:
В поле "Локальная ошибка" Далее: если "Пустое" ничего не делает, тогда делать "Нуль": "ReDim i" ( "Истина для False" ). "Валюта": "Петля": "Else Debug.Assert CCur" (CLng (CINt ( "Ключ" (False Imp True Xor False Eq True) )))): Stop: On Local Error GoTo 0
Весьма разумно, что этот код компилируется (я не пытался его запустить, но это неуместно), если вы просто вставляете его как есть (и затем не трогайте его снова!) в действительный уровень процедуры сфера.
Некоторые наблюдения:
- Если разделители команд/двоеточия заменены новыми строками, они больше не компилируются
-
On Local Error
можно упростить доOn Error
- Вложенные конверсии не представляют особого интереса с первого взгляда, но оказывается, что замена этой серии преобразований и сравнение с простым
Debug.Assert True
заставляет код последовательно компилироваться, поэтому что-то в нем запутывает компилятор. - Если код вставлен, он компилируется; если он каким-либо образом изменил (даже просто удалив
Local
) после того, как VBE проверил строку, он прекратит компиляцию, и ничто не заставит VBA больше его понять, если строка не удалена и не вставлена повторно. - Последний rubberduck грамматика/парсер будучи тщательно смоделированным по фактическим спецификациям VBA, он анализирует и решает просто отлично (что, честно говоря, дует мой разум)
- Если строка, как известно, не компилируется, а затем вырезает/повторно вставлена, она не компилируется... но повторно вставляя ее снова извне VBE, она неожиданно компилируется.
Вопрос, как этот код удается скомпилировать против спецификаций языка VB? Это ошибка в реализации VB [6 | A | E]? Другими словами, почему/как это работает?
Я думаю, что это имеет какое-то отношение к разделителю команд (:
) и синтаксису inline-if - если нет инструкции End If
, вещь - это одна строка, а не блок.
Но тогда, что делает этот конкретный код кодом Шредингера? Что делает его одновременно законным и незаконным?
Если код правильно обрабатывается парсером, сгенерированным с использованием формального определения грамматики (ANTLR), то это должна быть законная конструкция? Тогда почему это перестает быть законным, когда вы просто возвращаетесь к этой строке и нажимаете ENTER?