Литерал "\uD83D" в любом .flang этого дерева ломает сверку самоприменения — и это не чинится
Одинокую половину суррогатной пары нельзя написать строковым литералом ни в одном файле репозитория. Разбор языка на самом языке (flang/self/lexer.flang) раскрывает \uXXXX своей функцией «Символ по коду», а она — таблица выписанных блоков Unicode, потому что обратной формы «символ по коду» у языка нет вовсе (SPEC, раздел 5). На суррогате таблица отдаёт пустую строку, лексер помечает чтение сломанным и отвечает FLANG_LEX: неверный Unicode-escape. Образец (String.fromCharCode в flang/src/lexer.mjs) ту же строку читает молча, и дифференциальная сверка показывает расхождение поимённо.
Починить это расширением таблицы нельзя: строку из произвольной кодовой точки на этом языке построить нечем, а суррогат — не символ, его в таблицу не положишь. То есть ограничение принципиальное, а не недоделанное.
Практическое следствие. Работа над байтами обязана говорить о суррогате числом, а не строкой: дано код равно 55357 выразимо, дано текст равно "\ud83d" — нет. В flang/stdlib/utf8.flang решение «одинокий суррогат даёт U+FFFD, а не WTF-8» поэтому стоит примерами у «Одинокий суррогат» и «Байты кодовой точки», а строковая сторона проверяется снаружи — flang/test/utf8.test.mjs, 4000 случайных строк, где обе половины стоят рядом.
Чем подтверждено. Ветка work/bayty, ствол dea28116. Первая редакция utf8.flang несла три примера со строковыми литералами суррогатов; прогон node --test flang/test/self-lexer.test.mjs ответил: flang/stdlib/utf8.flang: лексер на flang отказал там, где образец разобрал: {"код":"FLANG_LEX","сообщение":"неверный Unicode-escape","строка":231}. После замены литералов на числа тот же прогон вместе с self-parser и emit-js даёт 93 из 93 зелёными.
Чем ограничено. Речь только о \uXXXX-экранировании в исходниках дерева. Сами строки со суррогатами язык обрабатывает нормально: они приезжают снаружи — аргументом, из файла, из сети, — и разложить … на символы вместе с код символа дают у них 55296…57343, как и положено.
Связано: string-reversal-keeps-length-is-false-on-a-lone-surrogate, a-grid-passed-length-claim-can-still-be-false-on-surrogates, proven-is-not-correct