ArtReal's readme
personal unreality:  точка пушистости

Вычисляемые умолчания и скрытые аргументы

19.01.09 10:51 ◇ keywords: soft, технологии

В ранних языках программирования умолчаний почти не было и в коде приходилось точно писать «сколько граммов вешать». Более поздние ЯП стали предусматривать различные умолчания. В синтаксисе.

А умолчания в коде? Интересно же смотреть, как работает возможность умолчаний, заставляющая компилятор «достраивать код», угадывая содержимое умолчаний (т.е. «типичные конструкции» для данного контекста) и подставляя скрытые аргументы.

Вот, например:

factorial:=f($) {$*.(--) if [], else :=1;}

.() — вызов анонимной функции, который компилятор заменяет на рекурсивный вызов; в качестве аргумента подставляется декремент входящего аргумента $; пропущенное условие (в []) заменяется на $=0

Если идти дальше, то получается совсем удивительно-замечательная штука:

factorial:=($) {*.(-) ? ! :=1;}

На место «пропущенного» первого аргумента операции умножения автоматически подставляется $; при рекурсивном вызове операция вычитания разворачивается до $-1 (т.е. тот же декремент); аналогично из ? (краткий if) разворачивается if [$=0]

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

 [ link ] +1