You can subscribe to this list here.
2002 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(4) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
(19) |
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
(7) |
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(15) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
(2) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2017 |
Jan
|
Feb
|
Mar
(2) |
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Vince <vi...@gm...> - 2017-04-03 12:02:17
|
Thanks. In the meanwhile I found a github mirror into the wiki of which I put the links I know so far (Common Lisp the language chapter, a blog article, a related project,…): https://github.com/tokenrove/series/wiki Though IMO it lacks code samples and more good write ups. Regards, Vincent Le 29/03/2017 à 02:57, Julian Squires a écrit : > On Tue, Mar 28, 2017 at 05:09:06PM +0200, Vince wrote: >> I'm currently interested in learning Series, and so to see its source >> code, but its url on sourceforge is dead: >> http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/?cvsroot=series >> >> Can I see its repository somewhere ? > The git repo is still alive: > > git://git.code.sf.net/p/series/series > > HTH, > > -- > Julian Squires |
From: Julian S. <ju...@ci...> - 2017-03-29 00:58:03
|
On Tue, Mar 28, 2017 at 05:09:06PM +0200, Vince wrote: > I'm currently interested in learning Series, and so to see its source > code, but its url on sourceforge is dead: > http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/?cvsroot=series > > Can I see its repository somewhere ? The git repo is still alive: git://git.code.sf.net/p/series/series HTH, -- Julian Squires |
From: Vince <vi...@gm...> - 2017-03-28 15:09:15
|
Hi, I'm currently interested in learning Series, and so to see its source code, but its url on sourceforge is dead: http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/?cvsroot=series Can I see its repository somewhere ? the following links are also dead: - the bug report url: http://sourceforge.net/bugs/?group_id=3235 - the TODO link - the surveys link - the Contact Us, About, Partners links (in the top menu) - the two links under "SERIES Documentation" (too bad !) - the link to ALU http://www.lisp.org/table/contents.htm (Other ressources) - the link to the Hyperspec (http://www.harlequin.com/education/books/HyperSpec redirecting to harlequin.com) - the last link, "the same thing with a different look" http://franz.com/support/docs/5.0.1/ansicl/ansicl.htm Cliki has a few valid links: http://www.cliki.net/Series Regards, Vincent |
From: Smith D. <zod...@gm...> - 2016-01-03 15:30:20
|
Hello, I've attached a patch that corrects the inconsistencies in the scan-range docstring. Best regards, Smith |
From: Raymond T. <toy...@gm...> - 2013-01-13 19:03:38
|
On 1/12/13 5:30 PM, Stas Boukarev wrote: > Import compiler-let. Patch committed. Thanks! Ray |
From: Stas B. <sta...@gm...> - 2013-01-13 01:30:27
|
Import compiler-let. |
From: Raymond T. <toy...@gm...> - 2010-07-28 19:55:48
|
On 7/28/10 3:53 AM, Helmut Eller wrote: > Here is a patch that adds an :optimizer for SCAN-HASH. > It uses WITH-HASH-TABLE-ITERATOR in similar manner > as SCAN-FILE uses WITH-OPEN-FILE. Patch applied, with your fix to use cl:multiple-value-bind. Thanks! Ray |
From: Raymond T. <toy...@gm...> - 2010-07-28 18:42:38
|
On 7/28/10 2:30 AM, Helmut Eller wrote: > > The problem seems to be that LIFT-OUT-VARS returns nil if there are no > variables to lift. That probably make the rest of the code believe that > nothing can be optimized. If LIFT-OUT-VARS returns the code without > modification it seems to work. Thanks. I had isolated the issue to *lift-out-vars-p* but didn't have time to investigate further. > How would one write a test to guard against such regressions? That's a good question. I think we can test for (macroexpand '(collect (scan '(1 2 3)))) returning '(1 2 3). That's a start anyway. Ray |
From: Helmut E. <he...@co...> - 2010-07-28 07:59:41
|
* Helmut Eller [2010-07-28 09:53+0200] writes: > Here is a patch that adds an :optimizer for SCAN-HASH. > It uses WITH-HASH-TABLE-ITERATOR in similar manner > as SCAN-FILE uses WITH-OPEN-FILE. Gee, that should use CL:MULTIPLE-VALUE-BIND not SERIES:MULTIPLE-VALUE-BIND. Helmut |
From: Helmut E. <he...@co...> - 2010-07-28 07:53:41
|
Here is a patch that adds an :optimizer for SCAN-HASH. It uses WITH-HASH-TABLE-ITERATOR in similar manner as SCAN-FILE uses WITH-OPEN-FILE. Helmut |
From: Raymond T. <toy...@gm...> - 2010-07-27 14:08:22
|
On 7/27/10 3:06 AM, Helmut Eller wrote: > If you disassemble this > > (defun foo () > (collect (scan '(1 2 3)))) > > it looks very inefficient. The macro-expander of SCAN and COLLECT are > called at runtime. BTW, I usually just macroexpand the collect to see what the generated code does. In series 2.2.4, this just macroexpands to '(1 2 3). Very nice! But in 2.2.5, this becomes (compiler-let ((series::*optimize-series-expressions* nil)) (collect (scan '(1 2 3))) Fernando made a huge set of changes between 2.2.4 and 2.2.5 and I didn't really understand what was going on. Ray |
From: Raymond T. <toy...@gm...> - 2010-07-27 13:46:10
|
On 7/27/10 3:06 AM, Helmut Eller wrote: > If you disassemble this > > (defun foo () > (collect (scan '(1 2 3)))) > > it looks very inefficient. The macro-expander of SCAN and COLLECT are > called at runtime. There's something wrong. This used to macroexpand into pretty efficient code. I must have broken something. Ray |
From: Helmut E. <he...@co...> - 2010-07-27 07:06:13
|
If you disassemble this (defun foo () (collect (scan '(1 2 3)))) it looks very inefficient. The macro-expander of SCAN and COLLECT are called at runtime. OTOH, this (defun bar () (collect (mapping ((x (scan '(1 2 3)))) x))) compiles to reasonable code. What's going on? Helmut |
From: Raymond T. <toy...@gm...> - 2010-07-26 13:07:13
|
On 7/26/10 2:19 AM, Helmut Eller wrote: > >> This produces something different from the original cross. I get >> >> (cross (scan '(a b c)) (scan '(1 2 3))) -> >> #Z(a a a b b b c c c) >> #z(1 2 3 1 2 3 1 2 3) > That's the same as what I quoted above, no? Yes. I don't know what I was looking at. For some reason, I thought the original was #z(1 1 1 2 2 2 3 3 3). > > I'm trying to write some examples here > http://projectfortress.sun.com/Projects/Community/wiki/ComprehendingComprehensions > > with series. They enumerate Pythagorean Triples with generator > expressions. It feels like that should be possible with series too, > but actually doing it is quite hard. Ah, now I understand. We have 3 sets of numbers, a, b, c, and we want to take all possible combinations of those 3 numbers so that we can apply the coprime property, the ordering a < b < c, and the most important property of a^2+b^2 = c^2. So to do this with series, we need to generate series as you propose so that we eventually get all possible combinations of a, b, and c. Ray |
From: Helmut E. <he...@co...> - 2010-07-26 08:07:30
|
* Raymond Toy [2010-07-25 22:06+0200] writes: > On 7/25/10 8:47 AM, Helmut Eller wrote: >> The functions ERS, WRS, and RRS call ERROR resp. WARN with empty >> strings. This is annoying when working with Slime. I propose to change >> that: instead of printing the messages to *error-output* and calling >> ERROR with an empty string it's better to pass the message to ERROR and >> let the compiler print it. The patch below does that. > Yes, this is much better. Patch applied. This needs an additional fix: LET doesn't work; it must be CL:LET. Apparently LET is defined later. Shadowing half of the special forms is quite confusing :-) Helmut |
From: Helmut E. <he...@co...> - 2010-07-26 06:19:22
|
* Raymond Toy [2010-07-26 02:13+0200] writes: > On 7/23/10 12:25 PM, Helmut Eller wrote: >> * Raymond Toy [2010-07-23 15:00+0200] writes: >> >>> On 7/23/10 4:15 AM, Helmut Eller wrote: >>>> Hello, >>>> >>>> I'd like to create a macro/function that when given two series >>>> as input produces the "cross product" as output. E.g. >>>> >>>> (cross (scan '(a b c)) (scan '(1 2 3))) >>>> => #Z(a a a b b b c c c) and #Z(1 2 3 1 2 3 1 2 3) >>>> >>> Do the two series have the same length? >> Yes, the output series have the same length (possibly infinite). > Sorry, I'm still confused. If the series have infinite length, then the > first series from cross will repeat the first element forever? Or > something else? Yes, it's repeated. [But in a lazy fashion, so that the version with ITERATE wouldn't work if the client only consumes the first 10 elements.] >> >>> I'm a bit confused on exactly what cross should do. >> Another way to write CROSS would be: >> >> (defmacro cross (sx sy) >> `(let ((xs '()) (ys '())) >> (iterate ((x ,sx)) >> (iterate ((y ,sy)) >> (push x xs) >> (push y ys))) >> (values (scan (reverse xs)) >> (scan (reverse ys))))) >> >> Obviously inefficient, but hopefully clearer. > This produces something different from the original cross. I get > > (cross (scan '(a b c)) (scan '(1 2 3))) -> > #Z(a a a b b b c c c) > #z(1 2 3 1 2 3 1 2 3) That's the same as what I quoted above, no? >> One series expression drives the outer loop and the other series >> expression drives the inner loop. The outer loop produces a series; >> lets call that #z(x_0 x_1 ... x_n). The inner loop consumes that >> series. For each element x_i the inner loop produces (part of) a series >> #z(y_i_0 y_i_1 ... y_i_m) and additionally copies x_i m times to a > What is the value of m? In the example it's 3; #z(y_i_0 y_i_1 ... y_i_m) corresponds to one of the #z(1 2 3) segments. > How is it derived from the inputs? I realize now that the second argument of cross can't be a just a series it must be a function that produces a series (the current element of the first series is passed in as argument). It's that function that decides how long the segments get. > I think it's ok if the output of a series function is "faster" than the > inputs. The function SPREAD produces more output data than the input > data series. Yes, that looks promising. I'm trying to write some examples here http://projectfortress.sun.com/Projects/Community/wiki/ComprehendingComprehensions with series. They enumerate Pythagorean Triples with generator expressions. It feels like that should be possible with series too, but actually doing it is quite hard. Helmut |
From: Raymond T. <toy...@gm...> - 2010-07-26 00:13:58
|
On 7/23/10 12:25 PM, Helmut Eller wrote: > * Raymond Toy [2010-07-23 15:00+0200] writes: > >> On 7/23/10 4:15 AM, Helmut Eller wrote: >>> Hello, >>> >>> I'd like to create a macro/function that when given two series >>> as input produces the "cross product" as output. E.g. >>> >>> (cross (scan '(a b c)) (scan '(1 2 3))) >>> => #Z(a a a b b b c c c) and #Z(1 2 3 1 2 3 1 2 3) >>> >> Do the two series have the same length? > Yes, the output series have the same length (possibly infinite). Sorry, I'm still confused. If the series have infinite length, then the first series from cross will repeat the first element forever? Or something else? > >> I'm a bit confused on exactly what cross should do. > Another way to write CROSS would be: > > (defmacro cross (sx sy) > `(let ((xs '()) (ys '())) > (iterate ((x ,sx)) > (iterate ((y ,sy)) > (push x xs) > (push y ys))) > (values (scan (reverse xs)) > (scan (reverse ys))))) > > Obviously inefficient, but hopefully clearer. This produces something different from the original cross. I get (cross (scan '(a b c)) (scan '(1 2 3))) -> #Z(a a a b b b c c c) #z(1 2 3 1 2 3 1 2 3) > One series expression drives the outer loop and the other series > expression drives the inner loop. The outer loop produces a series; > lets call that #z(x_0 x_1 ... x_n). The inner loop consumes that > series. For each element x_i the inner loop produces (part of) a series > #z(y_i_0 y_i_1 ... y_i_m) and additionally copies x_i m times to a What is the value of m? How is it derived from the inputs? I think it's ok if the output of a series function is "faster" than the inputs. The function SPREAD produces more output data than the input data series. Ray |
From: Helmut E. <he...@co...> - 2010-07-25 13:08:54
|
Test 491 uses compiler-let. I don't import that into cl-user so I had to fix that. Could that be changed to series::compiler-let? That would probably also make the special version for CLisp unnecessary. Test 562 is sensitive to *print-case*. I regularly set that to :downcase and the test failed. The test already binds *print-length* and could also bind *print-case* to :upcase. Helmut |
From: Helmut E. <he...@co...> - 2010-07-25 12:47:29
|
The functions ERS, WRS, and RRS call ERROR resp. WARN with empty strings. This is annoying when working with Slime. I propose to change that: instead of printing the messages to *error-output* and calling ERROR with an empty string it's better to pass the message to ERROR and let the compiler print it. The patch below does that. Helmut |
From: Helmut E. <he...@co...> - 2010-07-23 16:26:11
|
* Raymond Toy [2010-07-23 15:00+0200] writes: > On 7/23/10 4:15 AM, Helmut Eller wrote: >> Hello, >> >> I'd like to create a macro/function that when given two series >> as input produces the "cross product" as output. E.g. >> >> (cross (scan '(a b c)) (scan '(1 2 3))) >> => #Z(a a a b b b c c c) and #Z(1 2 3 1 2 3 1 2 3) >> > Do the two series have the same length? Yes, the output series have the same length (possibly infinite). > It seems you just replicate > each element 3 times. Why 3? Because there are 3 elements in the > original series? Perhaps a bad example, but yes: 3 because the inputs have length 3. > I'm a bit confused on exactly what cross should do. Another way to write CROSS would be: (defmacro cross (sx sy) `(let ((xs '()) (ys '())) (iterate ((x ,sx)) (iterate ((y ,sy)) (push x xs) (push y ys))) (values (scan (reverse xs)) (scan (reverse ys))))) Obviously inefficient, but hopefully clearer. One series expression drives the outer loop and the other series expression drives the inner loop. The outer loop produces a series; lets call that #z(x_0 x_1 ... x_n). The inner loop consumes that series. For each element x_i the inner loop produces (part of) a series #z(y_i_0 y_i_1 ... y_i_m) and additionally copies x_i m times to a second series (so that clients of CROSS can access the corresponding x and y values). The final two outputs look like: #z(x_0 x_0 ... x_0 x_1 x_1 ... x_1 x_2 x_2 ...) #z(y_0_0 y_0_1 ... y_0_m y_1_0 y_1_1 ... y_1_k y_2_0 y_2_1 ...) y_0_0 and y_1_0 can be different; also m and k can be different. The inner loop doesn't necessarily produce the same values for each iteration of the outer loop; i.e. the y values aren't just replicated. [The series expression of the inner loop should also have access to the current x value. In the example that's possible by accessing the variable x but that's sloppy; the name should better be an argument to CROSS or the second expression should be a lambda taking the value of x as argument.] Helmut |
From: Helmut E. <he...@co...> - 2010-07-23 08:53:29
|
Hello, I'd like to create a macro/function that when given two series as input produces the "cross product" as output. E.g. (cross (scan '(a b c)) (scan '(1 2 3))) => #Z(a a a b b b c c c) and #Z(1 2 3 1 2 3 1 2 3) Or as picture: ----------------- ------- | (scan '(a b c)) |------>| |----> #z(a b c a b c a b c) ----------------- | | | cross | ----------------- | | | (scan '(1 2 3)) |------>| |----> #z(1 1 1 2 2 2 3 3 3) ----------------- ------- I tried this: (defmacro cross (sx sy) `(producing (ox oy) ((genx ,sx) x geny y) (loop (tagbody (setq x (next-in genx (terminate-producing))) (setq geny (generator ,sy)) loop (setq y (progn (next-in geny (go end)))) (next-out ox x) (next-out oy y) (go loop) end)))) (defun foo () (collect (mapping (((x y) (cross (scan '(1 2 3)) (scan '(a b c))))) (cons x y)))) It works but apparently this can't be optimized. Is there a better way to write such "nested loops" where the outputs are "faster" than the inputs? If not, would it be possible to add a new "primitive" for such cases? Helmut |
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 |
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-14 17:48:52
|
Robin Lee Powell wrote: > Is there any way to expand a series? What I would like to do is > something (very loosely) like this: > > (let ((orig #z(1 -2 3 4 -5 6)) > ([do some other series stuff on orig]) > (x (choose-if #'minusp #z(1 -2 3 4 -5 6)))) > (alter x [turn -N into -N ... 0, thus changing the length of > the series])) > > In other words, given a series, I want to replace some of the values > with a bunch more values, but without losing the lazy-ness of the > library. > > Is there any way to do this at all? Don't know. But this do a large part of what you want, except to fill in the nils with the desired values: (spread (map-fn t #'(lambda (x) (if (minusp x) (abs x) 0)) #z(1 -2 3 4 -5 6)) #z(1 -2 3 4 -5 6)) => #Z(1 NIL NIL -2 3 4 NIL NIL NIL NIL NIL -5 6) I think you wanted #z(1 -2 -1 0 3 4 -5 -4 -3 -2 -1 0 6) Just need to get rid of the negative numbers and fill in the NILs with the desired values. Perhaps that will provide a hint on what to do. Ray |
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 |