История изменений
Исправление den73, (текущая версия) :
Кстати вот какая у меня идея появилась, навеяло. pattern matching всегда будет ограничен. Он либо слишком слабый, либо слишком запутанный. Как кто-то сказал, «если у вас была проблема и вы попытались решить её регекспами, то теперь у вас две проблемы». Поэтому, наверное имеет смысл конструкция break, как в switch. Тогда образец находит сопоставление только «вчерне», в меру своих ограниченных возможностей. А внутри составного оператора можно обложить переменные из образца отдельным условием и, если всё нормально, сделать возврат из оператора с помощью «вернуть», как делает break в switch. То есть, не нужно перегружать сопоставление с образцом лишними смыслами. Например, поиск отрицательного числа:
сопоставлять-с-образцами Ю
имя СЮ // имя конструкции нужно для возврата
или-ошибка ("Ждали отрицательное число, а нашли ~S",Ю)
образец квц квп(П -- двойное-плавающее) кнк
если П < 0.0 то
СЮ.вернуть П
кне
// поскольку здесь нет возврата, будем сравнивать дальше
образец квц квп(Ч -- число) кнк
если Ч < 0 то
СЮ.вернуть Ч
кне
// здесь выполнение пойдёт дальше, на генерацию ошибки
кнс
P.S. добавил 5-е требование - квазицитаты.
Исправление den73, :
Кстати вот какая у меня идея появилась, навеяло. pattern matching всегда будет ограничен. Он либо слишком слабый, либо слишком запутанный. Как кто-то сказал, «если у вас была проблема и вы попытались решить её регекспами, то теперь у вас две проблемы». Поэтому, наверное имеет смысл конструкция break, как в switch. Тогда образец находит сопоставление только «вчерне», в меру своих ограниченных возможностей. А внутри составного оператора можно обложить переменные из образца отдельным условием и, если всё нормально, сделать возврат из оператора с помощью «вернуть», как делает break в switch. То есть, не нужно перегружать сопоставление с образцом лишними смыслами. Например, поиск отрицательного числа:
сопоставлять-с-образцами Ю
имя СЮ // имя конструкции нужно для возврата
или-ошибка ("Ждали отрицательное число, а нашли ~S",Ю)
образец квц квп(П -- двойное-плавающее) кнк
если П < 0.0 то
СЮ.вернуть П
кне
// поскольку здесь нет возврата, будем сравнивать дальше
образец квц квп(Ч -- число) кнк
если Ч < 0 то
СЮ.вернуть Ч
кне
// здесь выполнение пойдёт дальше, на генерацию ошибки
кнс
Исходная версия den73, :
Кстати вот какая у меня идея появилась, навеяло. pattern matching всегда будет ограничен. Он либо слишком слабый, либо слишком запутанный. Как кто-то сказал, «если у вас была проблема и вы попытались решить её регекспами, то теперь у вас две проблемы». Поэтому, наверное имеет смысл конструкция break, как в switch. Тогда образец находит сопоставление только «вчерне», в меру своих ограниченных возможностей. А внутри составного оператора можно обложить переменные из образца отдельным условием и, если всё нормально, сделать возврат из оператора с помощью «вернуть», как делает break в switch. То есть, не нужно перегружать сопоставление с образцом лишними смыслами. Например, поиск отрицательного числа или символа «Минус»:
сопоставлять-с-образцами Ю
имя СЮ // имя конструкции нужно для возврата
или-ошибка ("Ждали отрицательное число, а нашли ~S",Ю)
образец квц квп(П -- двойное-плавающее) кнк
если П < 0.0 то
СЮ.вернуть П
кне
// поскольку здесь нет возврата, будем сравнивать дальше
образец квц квп(Ч -- число) кнк
если Ч < 0 то
СЮ.вернуть Ч
кне
// здесь выполнение пойдёт дальше, на генерацию ошибки
кнс