Анонимные предикаты: различия между версиями
Материал из wikiru.visual-prolog.com
Строка 5: | Строка 5: | ||
<Vip> | <Vip> | ||
interface авто | |||
properties | |||
цена : unsigned(o). | |||
end interface авто | |||
class выюорАвтомобиля | |||
predicates | |||
недорогие : () -> авто* Результат. | |||
... | ... | ||
implement выюорАвтомобиля | |||
clauses | |||
неДорогие() = list::filter({(Авто):-Авто:цена <= 10000, !}, списокАвтомобилей). | |||
... | ... | ||
</Vip> | </Vip> | ||
Казалось бы ничего нового, ведь то же самое можно записать при помощи дополнительного предиката. Например так | |||
<Vip>predicates | |||
фильтерДляНедорогих : (авто Авто). | |||
clauses | |||
фильтерДляНедорогих(Авто):- Авто:цена < 10000, !. | |||
clauses | |||
неДорогие() = list::filter(фильтерДляНедорогих, списокАвтомобилей).</Vip> | |||
Но сегодня для нас для нас сумма 10000 является пределом мечтаний, а завтра 12000, как быть? Есть два решения, или менять константу, или добавить факт-переменную. Анонимный предикат позволит сделать это изящней. | |||
<Vip>predicates | |||
неДорогие2 : (unsigned НашиВозможности). | |||
clauses | |||
неДорогие2(НашиВозможности) = list::filter({(Авто):-Авто:цена <= НашиВозможности, !}, списокАвтомобилей).</Vip> | |||
Если внимательно присмотреться, тут мы наблюдаем картину, ранее недоступную невооруженным глазом. Переменная ''НашиВозможности'' из предиката ''''неДорогие2'''' перекочевала во внутрь другого предиката - фильтра! Вот это уже нельзя сделать использую дополнительный предикат, как раньше. | |||
Это не оконченная статья | Это не оконченная статья | ||
[[Категория:VipLanguage]] | [[Категория:VipLanguage]] |
Версия 11:20, 3 ноября 2007
Анонимные предикаты - новая возможность компилятора, которая будет реализована начиная с версии 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' перекочевала во внутрь другого предиката - фильтра! Вот это уже нельзя сделать использую дополнительный предикат, как раньше.
Это не оконченная статья