From: Robin L. P. <rlp...@di...> - 2008-08-11 02:50:07
|
Brand new to Series, but it seems like my sort of thing; I always kind of enjoyed the lazy evaluation stuff that Haskell did. For this particural bit of code, I'm starting with finite lists and digging through them to find sub-sections. I'm a little surprised by some of the warnings I'm getting, and I'm hoping someone can shed some light on these. Everything seems to be working just fine, for the record. Restriction violation 12 in series expression: NIL Series var INITIAL-SER referenced in nested non-series LAMBDA. WARNING: Warning 28 in series expression: (COLLECT-FIRST X) Non-series to series data flow from: X to: (COLLECT-FIRST X) The goal of the function in question is to turn a (finite) series into a series of all the possible sub-series; there are *no* non-series calls in the function: (defun subseries-all (start-ser) (DECLARE (OPTIMIZABLE-SERIES-FUNCTION)) (multiple-value-bind (index-ser initial-ser) (cotruncate (scan-range) start-ser) (mapping ((x index-ser)) (subseries initial-ser x)))) Just to be clear, initial-ser and start-ser should be the same in all respects; I couldn't figure out any other way to get a 0-to-n series of the same length as start-ser. There's no way I can see to get the legth of a finite series. WARNING: Warning 28 in series expression: (DEFUN SPATH-FIND (SER ITEM) (DECLARE (OPTIMIZABLE-SERIES-FUNCTION)) (CHOOSE-IF #'(LAMBDA (X) (FORMAT T "val: ~A~%" X) (EQUAL ITEM (COLLECT-FIRST X))) (SUBSERIES-ALL SER))) Non-series to series data flow from: (SUBSERIES-ALL SER) to: (CHOOSE-IF #'(LAMBDA (X) (FORMAT T "val: ~A~%" X) (EQUAL ITEM (COLLECT-FIRST X))) (SUBSERIES-ALL SER)) WARNING: Restriction violation 13 in series expression: (COLLECT-FIRST (SPATH-FIND (SCAN '(B 3 C 1 B 5)) 'B)) Series to non-series data flow from: (SCAN '(B 3 C 1 B 5)) to: (SPATH-FIND (SCAN '(B 3 C 1 B 5)) 'B) Both of these come from the same function, spath-find, helpfully printed there in its entirety. The point of the choose-if predicate (ignoring the format call) is to compare the first item of the series (remember, subseries-all returns a series of series) to a given value. I'm quite surprised by the total lack of accessors; there's no way that I can see to get at the first element of the sub-series there at all without converting out of series mode and getting those warnings. I'm hoping someone can show me something I missed. Thanks. -Robin -- Lojban Reason #17: http://en.wikipedia.org/wiki/Buffalo_buffalo Proud Supporter of the Singularity Institute - http://singinst.org/ http://www.digitalkingdom.org/~rlpowell/ *** http://www.lojban.org/ |
From: Robin L. P. <rlp...@di...> - 2008-08-11 03:11:48
|
On Sun, Aug 10, 2008 at 07:50:03PM -0700, Robin Lee Powell wrote: > The goal of the function in question is to turn a (finite) series > into a series of all the possible sub-series; there are *no* > non-series calls in the function: > > (defun subseries-all (start-ser) > (DECLARE (OPTIMIZABLE-SERIES-FUNCTION)) > (multiple-value-bind > (index-ser initial-ser) > (cotruncate (scan-range) start-ser) > (mapping ((x index-ser)) > (subseries initial-ser x)))) Wrapping (subseries initial-ser x) in (collect ...) so I have a series of sublists still works just fine, but then I get the somewhat scarier error: WARNING: ; in: LAMBDA NIL ; (SERIES:COLLECT (SERIES:SUBSERIES SPATH::INITIAL-SER SPATH::X)) ; --> FLET BLOCK SB-CLTL2:COMPILER-LET LET COND IF COND IF COND IF COND IF COND ; --> IF PROGN SETQ THE IF CONSP CADR CAR ; ==> ; (CDR SERIES::SEQ-TYPE) ; ; caught WARNING: ; Asserted type LIST conflicts with derived type (VALUES (MEMBER LIST) &OPTIONAL). ; See also: ; The SBCL Manual, Node "Handling of Types" ; ; compilation unit finished ; caught 1 WARNING condition -Robin |
From: Raymond T. (RT/EUS) <ray...@er...> - 2008-08-14 17:26:28
|
Robin Lee Powell wrote: > Brand new to Series, but it seems like my sort of thing; I always > kind of enjoyed the lazy evaluation stuff that Haskell did. > > For this particural bit of code, I'm starting with finite lists and > digging through them to find sub-sections. I'm a little surprised > by some of the warnings I'm getting, and I'm hoping someone can shed > some light on these. Everything seems to be working just fine, for > the record. > > Restriction violation 12 in series expression: > NIL > Series var INITIAL-SER referenced in nested non-series LAMBDA. > WARNING: > Warning 28 in series expression: > (COLLECT-FIRST X) > Non-series to series data flow from: > X > to: > (COLLECT-FIRST X) > > The goal of the function in question is to turn a (finite) series > into a series of all the possible sub-series; there are *no* > non-series calls in the function: > > (defun subseries-all (start-ser) > (DECLARE (OPTIMIZABLE-SERIES-FUNCTION)) > (multiple-value-bind > (index-ser initial-ser) > (cotruncate (scan-range) start-ser) > (mapping ((x index-ser)) > (subseries initial-ser x)))) > > Just to be clear, initial-ser and start-ser should be the same in > all respects; I couldn't figure out any other way to get a 0-to-n > series of the same length as start-ser. There's no way I can see to > get the legth of a finite series. > > > WARNING: > Warning 28 in series expression: > (DEFUN SPATH-FIND (SER ITEM) (DECLARE (OPTIMIZABLE-SERIES-FUNCTION)) > (CHOOSE-IF > #'(LAMBDA (X) (FORMAT T "val: ~A~%" X) (EQUAL ITEM (COLLECT-FIRST X))) > (SUBSERIES-ALL SER))) > Non-series to series data flow from: > (SUBSERIES-ALL SER) > to: > (CHOOSE-IF > #'(LAMBDA (X) (FORMAT T "val: ~A~%" X) (EQUAL ITEM (COLLECT-FIRST X))) > (SUBSERIES-ALL SER)) > WARNING: > Restriction violation 13 in series expression: > (COLLECT-FIRST (SPATH-FIND (SCAN '(B 3 C 1 B 5)) 'B)) > Series to non-series data flow from: > (SCAN '(B 3 C 1 B 5)) > to: > (SPATH-FIND (SCAN '(B 3 C 1 B 5)) 'B) > > Both of these come from the same function, spath-find, helpfully > printed there in its entirety. > > The point of the choose-if predicate (ignoring the format call) is > to compare the first item of the series (remember, subseries-all > returns a series of series) to a given value. I'm quite surprised by > the total lack of accessors; there's no way that I can see to get at > the first element of the sub-series there at all without converting > out of series mode and getting those warnings. I'm hoping someone > can show me something I missed. I have been unable to produce a nice series function for what you want. But taking a step back, can you rearrange your code so that you can use scan-sublists? This produces a series containing the successive sublists. Then (#Mscan (scan-sublists '(a b c)) => #Z(#Z(A B C) #Z(B C) #Z(C)), which is what you wanted originally. Maybe something like this? (defun try (list) (mapping ((x (scan-sublists list))) (collect-first (scan x)))) Ray |
From: Robin L. P. <rlp...@di...> - 2008-08-14 17:52:38
|
On Thu, Aug 14, 2008 at 01:25:18PM -0400, Raymond Toy (RT/EUS) wrote: >> The point of the choose-if predicate (ignoring the format call) >> is to compare the first item of the series (remember, >> subseries-all returns a series of series) to a given value. I'm >> quite surprised by the total lack of accessors; there's no way >> that I can see to get at the first element of the sub-series >> there at all without converting out of series mode and getting >> those warnings. I'm hoping someone can show me something I >> missed. > > I have been unable to produce a nice series function for what you > want. > > But taking a step back, can you rearrange your code so that you > can use scan-sublists? No, because as soon as I move outside of the series calls, I lose the lazyness, which is really what I want here. I've been told that I'm treating Series as a general lazy list application, which it isn't, and I should be using one of those instead. -Robin -- Lojban Reason #17: http://en.wikipedia.org/wiki/Buffalo_buffalo Proud Supporter of the Singularity Institute - http://singinst.org/ http://www.digitalkingdom.org/~rlpowell/ *** http://www.lojban.org/ |
From: Raymond T. (RT/EUS) <ray...@er...> - 2008-08-15 13:23:20
|
Robin Lee Powell wrote: > On Thu, Aug 14, 2008 at 01:25:18PM -0400, Raymond Toy (RT/EUS) wrote: >>> The point of the choose-if predicate (ignoring the format call) >>> is to compare the first item of the series (remember, >>> subseries-all returns a series of series) to a given value. I'm >>> quite surprised by the total lack of accessors; there's no way >>> that I can see to get at the first element of the sub-series >>> there at all without converting out of series mode and getting >>> those warnings. I'm hoping someone can show me something I >>> missed. >> I have been unable to produce a nice series function for what you >> want. >> >> But taking a step back, can you rearrange your code so that you >> can use scan-sublists? > > No, because as soon as I move outside of the series calls, I lose > the lazyness, which is really what I want here. Without knowing the entire application, it's kind of hard to tell. But you could have the main application run scan-sublists and have that series passed on to all other code, as needed. > > I've been told that I'm treating Series as a general lazy list > application, which it isn't, and I should be using one of those > instead. Probably true. Still might be possible to get series to do what you want. Have you looked at the gather chapter in CLtL2? That might provide the functionality you're looking for. I think series supports that, but I'm not sure. Ray |