|
2 | 2 |
|
3 | 3 | // Списки чисел: длина, обращение, соединение, срез, поиск, свёртки, сортировка. |
4 | 4 | // |
5 | | -// Почему модуль про числа, а не «про любой список»: типы в flang не |
6 | | -// параметрические (SPEC, раздел 3), а функции не являются значениями. Поэтому |
7 | | -// «Сортировать» для строк — это отдельная функция с отдельным телом, а не |
8 | | -// та же самая с другим параметром типа. Здесь взят самый частый случай — |
9 | | -// список числа; для списка строки те же приёмы повторяются дословно. |
| 5 | +// Почему модуль про числа, а не «про любой список», и почему свёртка не берёт |
| 6 | +// функцию аргументом. Здесь стояло «функции не являются значениями» — это |
| 7 | +// БОЛЬШЕ НЕ ПРАВДА про язык: функция стала значением (flang/cat/HOF.md, фаза 1) |
| 8 | +// и печатается во все восемь целей (фаза 3). Проверено запуском: модуль с |
| 9 | +// `функция из числа в число` разбирается, проходит типы, доказывается |
| 10 | +// тотальным и считает верно. |
| 11 | +// |
| 12 | +// Правда — про РЕПОЗИТОРИЙ, и она уже: ни stdlib, ни examples не вправе |
| 13 | +// использовать ни функции-значения, ни параметрические типы, пока их не |
| 14 | +// понимает `flang/self/parser.flang`. Корпус сверки самоприменения собирается |
| 15 | +// по маске каталога, поэтому первый же такой файл здесь ломает неподвижную |
| 16 | +// точку. Это не осторожность: тот же модуль, положенный в flang/stdlib, |
| 17 | +// роняет пять тестов — три в self-bootstrap и два в self-parser, с |
| 18 | +// диагностикой flang₁ «FLANG_PARSE: не разобрана конструкция: ожидался тип». |
| 19 | +// Полиморфизм заплатил за это тремя упавшими тестами (flang/cat/POLY.md). |
| 20 | +// |
| 21 | +// Готовая библиотека на функциях-значениях уже написана и проверена целиком — |
| 22 | +// 36 функций, все тотальные, 55 примеров, печать во все восемь целей, сверка с |
| 23 | +// интерпретатором на 179 точках, — и лежит там, где корпус её не видит: |
| 24 | +// flang/test/stdlib-hof.test.mjs. Туда же вынесена улика, которая покраснеет, |
| 25 | +// когда `self/` научится, и потребует перенести модуль сюда. |
| 26 | +// |
| 27 | +// Пока этого нет: «Сортировать» для строк — отдельная функция с отдельным |
| 28 | +// телом, а «Все не меньше» и «Любой не меньше» — отдельные функции под |
| 29 | +// отдельный предикат. Здесь взят самый частый случай — список числа; для |
| 30 | +// списка строки те же приёмы повторяются дословно. |
10 | 31 | // |
11 | 32 | // Приписать элемент в начало списка встроенной формой нельзя: «добавить … к …» |
12 | 33 | // дописывает в конец. Поэтому «Приписать в начало» — первая функция модуля: |
|
171 | 192 | ожидается нет |
172 | 193 | элементы содержит значение |
173 | 194 |
|
174 | | -// «все» и «любой» в языке без функций высшего порядка приходится писать |
175 | | -// отдельно под каждый предикат: передать предикат некому. Здесь взят самый |
176 | | -// частый — сравнение с порогом. |
| 195 | +// «все» и «любой» здесь написаны под ОДИН предикат — сравнение с порогом. |
| 196 | +// Причина не в языке: передать предикат теперь есть чем («Все» и «Любой», |
| 197 | +// принимающие `функция из числа в признак`, написаны и проверены в |
| 198 | +// flang/test/stdlib-hof.test.mjs, и там же сверено, что они дают ровно то же, |
| 199 | +// что эти две). Причина в границе, названной в шапке модуля: файл входит в |
| 200 | +// корпус сверки самоприменения, а `self/parser.flang` этой формы не знает. |
177 | 201 | тотальная функция «Все не меньше» |
178 | 202 | принимает элементы: список числа, порог: число |
179 | 203 | возвращает признак |
|
0 commit comments