# Functions as values (design/functions-as-values.md, 2026-09-21).structLocker{number:int32,owner:str.utf8}fnby_number[lent'a':Locker,lent'b':Locker]->bool{return'a'.number<'b'.number;}fnby_owner[lent'a':Locker,lent'b':Locker]->bool{returnstr.bytes[lend'a'.owner]<str.bytes[lend'b'.owner];}# a function that takes a function: the type is the signature without the namesfnfirst_by[lent'xs':list[Locker],'less':fn[lentLocker,lentLocker]->bool]->str.utf8{let'best':=1;for'i'from2tolist.length[lend'xs']by1{if'less'[lend'xs'[pos'i'],lend'xs'[pos'best']]{change'best'='i';}}let'winner':=lend'xs'[pos'best'];returncopy'winner'.owner;}fnkeep[lent'xs':list[int32],'test':fn[int32]->bool]->list[int32]{let'out':list[int32]=[];for'x'inlend'xs'{if'test'['x']{list.append[lend.mut'out',value'x'];}}returngive'out';}MAIN{let'lockers':=[Locker[number=7,owner="Cy"],Locker[number=2,owner="Ann"],Locker[number=5,owner="Bo"]];std::print.stored[first_by[lend'lockers',by_number],newln];# a named function, as a value: its bare namestd::print.stored[first_by[lend'lockers',by_owner],newln];let'f':=by_number;# held in a variablestd::print.useful['f'[lend'lockers'[pos1],lend'lockers'[pos2]],newln];# called: 'f'[…]let'limit':=60;let'scores':=[72,40,95,55];let'passing':=keep[lend'scores',fn['s':int32]->boolwith[lend'limit']{return's'at_least'limit';}];std::print.useful['passing',newln];let'evens':=keep[lend'scores',fn['s':int32]->bool{return('s'mod.floor2)equal_to0;}];# captures nothingstd::print.useful['evens',newln];}