Адресат обязан быть литералом ради ТИПА ГРУЗА, а не ради планировщика: оба планировщика уже умеют вычисленный адрес
Действие отправить требует, чтобы кому было именем объявленного процесса, записанным прямо в файле. Из-за этого сетевой узел — программу, которая шлёт тому, чей адрес пришёл в сообщении, — на flang написать нельзя.
Замер показывает, что стена не в устройстве, а в одной проверке типов, и что цена у неё ровно одна.
Планировщики уже умеют. Оба разрешают адресата по имени во время работы: свидетель на JavaScript — процессы.get(кому) (flang/src/conc.mjs), напечатанный в C — fl_conc_variant_field(item, "кому", &to) (flang/src/emit/c/flang_conc.c, строки 2331, 2362, 2382). Ни одной строки в них менять не надо.
Проверка одна и отвечает на два разных вопроса. addresseeOf (flang/src/types.mjs:3552, 33 строки, сам запрет — 10) стоит сразу на двух полях: кому у «отправить», «через» и «поручить» и вид у «породить».
- для
видлитерал обязателен по устройству: множество видов процессов должно быть конечным и известным при сборке — на этом стоят снятие функций первого класса, анализ достижимых отказов и печать в восемь целей; - для
комулитерал по устройству не нужен.
Цена снятия — ровно одна вещь: тип груза. Поле что объявлено джокером (любое). Полиморфизма в языке нет, и единственное место, где груз сверяется, — объявление принимает у адресата, найденного по литералу.
Асимметрия, которая показывает, что это шов, а не решение. Поле имя у «породить» литералом быть НЕ обязано. То есть программа сегодня может завести себе соседа под вычисленным именем — и не может ему написать.
Чем подтверждено. Ветка vypusk/hozyain, замер с временно снятой проверкой (правка не коммитилась, types.mjs в дереве не изменён).
- Программа, шлющая по адресу из сообщения: со стеной —
FLANG_PROCESSна разборе; без стены — собирается и работает, 2 доставки, исход «покой». - Порождение под вычисленным именем: собирается и работает СО стеной, без всяких правок.
- Что краснеет без стены на 309 проверках конкурентности, отказов и типов: было 4 красных, стало 5. Единственная новая — «Б1: вид порождаемого сверяется со списком объявленных процессов», то есть ровно тот случай, где литерал нужен по устройству. Остальное зелено.
- Цена, померенная программой с заведомо чужим грузом («Первый» шлёт «Команда А» процессу, объявившему
принимает «Команда Б»):checkотвечаетvalid: true, а во время работы адресат отказываетFLANG_MATCH_NOT_EXHAUSTIVE— при том что исход прогона всё равно «покой», иflang testсчитает такой прогон пройденным. То есть ошибка не исчезает, а переезжает со сборки на работу и попадает туда, где проверка сегодня зеленеет.
Чем ограничено. Замер отвечает на вопрос «одна это строка или устройство» и не предлагает замены. Просто снять запрет нельзя: пункт 4 показывает, чем за это платят. Названные, но не проверенные пути замены: объявлять тип груза в месте отправки; дать «отправить» близнеца с закреплённым типом груза, как у «поручить»; сделать всякую запись в отказы красной у прогона — тогда цена из пункта 4 перестаёт быть молчаливой.
Связано: octets-are-expressible-as-a-list-of-numbers-not-as-a-string, checks-that-stopped-comparing