LINUX.ORG.RU

История изменений

Исправление 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 то
      СЮ.вернуть Ч
    кне
    // здесь выполнение пойдёт дальше, на генерацию ошибки
кнс