Hi Alex, Ah. That's what I missed.... the sort direction of the second argument..
Thank you Lindsay On Tue, May 23, 2017 at 10:47 PM, Alexander Burger <a...@software-lab.de> wrote: > Hi Lindsay, > > > My sample code ("ABRA..) is wrong. Sorry about that. > > Ah, I see. No problem. > > > > : (rank 'c '((a . a) (b . b) (d . d)) T) # ??? > > -> NIL > > : (rank 'd '((a . a) (b . b) (d . d)) T) # ??? > > -> NIL > > > > : (rank 'd '((a . a) (b . b) (d . d))) > > -> (d . d) > > : (rank 'c '((a . a) (b . b) (d . d))) > > -> (b . b) > > > > The latter two work as I would expect. > > I expected the first two to return '(d . d).... > > The reason here is that 'rank' expects a *sorted* list. It traverses the > list, > and stops as soon as it can confirm or refute the desired condition. > > With a second argument non-NIL, it tries to "Returns the element from lst > ... > with a minimal CAR greater or equal to any". However, already the first > element > (a . a) is *less* than 'c' or 'd', hence it returns NIL. > > If you reverse the list, it works: > > : (rank 'c '((d . d) (b . b) (a . a)) T) > -> (d . d) > > : (rank 'b '((d . d) (b . b) (a . a)) T) > -> (b . b) > > It is the purpose of the second argument to tell 'rank' in which direction > it > should expect the list to be sorted. > > ♪♫ Alex > > -- > UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe >