Анонимные предикаты: различия между версиями
(не показано 7 промежуточных версий 1 участника) | |||
Строка 1: | Строка 1: | ||
Анонимные предикаты - новая возможность компилятора, которая | Анонимные предикаты - новая возможность компилятора, которая реализована начиная с версии 7.2 | ||
===Вступление=== | |||
Пример использования: | Пример использования: | ||
Строка 10: | Строка 10: | ||
end interface авто | end interface авто | ||
class | class выборАвтомобиля | ||
predicates | predicates | ||
неДорогие : () -> авто* Результат. | |||
... | ... | ||
implement | implement выборАвтомобиля | ||
clauses | clauses | ||
неДорогие() = list::filter({(Авто):-Авто:цена <= 10000, !}, списокАвтомобилей). | неДорогие() = list::filter({(Авто) :- Авто:цена <= 10000, !}, списокАвтомобилей). | ||
... | ... | ||
</Vip> | </Vip> | ||
Строка 23: | Строка 23: | ||
Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так | Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так | ||
<Vip>predicates | <Vip>predicates | ||
фильтрДляНедорогих : (авто Авто). | |||
clauses | clauses | ||
фильтрДляНедорогих(Авто) :- Авто:цена <= 10000, !. | |||
clauses | clauses | ||
неДорогие() = list::filter( | неДорогие() = list::filter(фильтрДляНедорогих, списокАвтомобилей).</Vip> | ||
Но сегодня для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней. | Но сегодня для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней. | ||
Строка 33: | Строка 33: | ||
неДорогие2 : (unsigned НашиВозможности). | неДорогие2 : (unsigned НашиВозможности). | ||
clauses | clauses | ||
неДорогие2(НашиВозможности) = list::filter({(Авто):-Авто:цена <= НашиВозможности, !}, списокАвтомобилей).</Vip> | неДорогие2(НашиВозможности) = list::filter({(Авто) :- Авто:цена <= НашиВозможности, !}, списокАвтомобилей).</Vip> | ||
Если внимательно присмотреться, то тут мы наблюдаем картину, ранее недоступную невооружённым глазом. Переменная ''НашиВозможности'' из предиката ''''неДорогие2'''' перекочевала во внутрь другого предиката - фильтра! Вот это уже нельзя сделать использую дополнительный предикат, как раньше. | |||
===Погружение=== | |||
Давайте еще усложним наш пример, не сильно отрываясь от реальности. Представим, что у нас есть следующий интерфейс: | |||
<Vip>interface покупатель | |||
properties | |||
зарплата : unsigned(o). | |||
фильтрМашин : () -> list::filter. | |||
end interface покупатель</Vip> | |||
Попробуем написать реализацию | |||
<Vip>implement покупатель | |||
facts | |||
зарплата : unsigned. | |||
clauses | |||
фильтрМашин() = | |||
{(Авто) :- Авто:цена <= НашиВозможности, !}, списокАвтомобилей) | |||
implement покупатель</Vip> | |||
===Детали реализации=== | |||
===Где использовать=== | |||
Это | Это неоконченная статья | ||
[[Категория:VipLanguage]] | [[Категория:VipLanguage]] |
Текущая версия на 12:25, 26 мая 2009
Анонимные предикаты - новая возможность компилятора, которая реализована начиная с версии 7.2
Вступление
Пример использования:
interface авто properties цена : unsigned(o). end interface авто class выборАвтомобиля predicates неДорогие : () -> авто* Результат. ... implement выборАвтомобиля clauses неДорогие() = list::filter({(Авто) :- Авто:цена <= 10000, !}, списокАвтомобилей). ...
Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так
predicates фильтрДляНедорогих : (авто Авто). clauses фильтрДляНедорогих(Авто) :- Авто:цена <= 10000, !. clauses неДорогие() = list::filter(фильтрДляНедорогих, списокАвтомобилей).
Но сегодня для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней.
predicates неДорогие2 : (unsigned НашиВозможности). clauses неДорогие2(НашиВозможности) = list::filter({(Авто) :- Авто:цена <= НашиВозможности, !}, списокАвтомобилей).
Если внимательно присмотреться, то тут мы наблюдаем картину, ранее недоступную невооружённым глазом. Переменная НашиВозможности из предиката 'неДорогие2' перекочевала во внутрь другого предиката - фильтра! Вот это уже нельзя сделать использую дополнительный предикат, как раньше.
Погружение
Давайте еще усложним наш пример, не сильно отрываясь от реальности. Представим, что у нас есть следующий интерфейс:
interface покупатель properties зарплата : unsigned(o). фильтрМашин : () -> list::filter. end interface покупатель
Попробуем написать реализацию
implement покупатель facts зарплата : unsigned. clauses фильтрМашин() = {(Авто) :- Авто:цена <= НашиВозможности, !}, списокАвтомобилей) implement покупатель
Детали реализации
Где использовать
Это неоконченная статья