[racket-dev] for/... improvement. #:filter

2013-09-10 Thread Roman Klochkov
 I propose to add yet one keyword to for/foldX/derived/break (and so to all 
for/... syntaxes).

Reason: 

If one need to filter the results of body before collecting them in 
list/vector/sum/..., there are two options:

1. (filter filter-func (for/list ...)) : doubles memory consumption and slower
2. (for/list (exprs ...) body ...) =  (for/list (exprs ... #:when #t (res 
(in-value (begin body ...))) #:when (filter-func res)) res). Works, but very 
clumsy.

I propose syntax
(for/list (exprs ...) body ...) =  (for/list (exprs ... #:filter filter-func) 
body ...) with the same behavior as in 2.
                 
Syntax:

#:filter filter-func = (thunk* #t)

Expects function with the same number of arguments as the result of for/... 
body should return values. Applied  to results of body, and collected only if 
filter-func returns #t.

Implementation:

Minor changes in for.rkt in (define-syntax (for/foldX/derived stx) ...) and 
in documentation. If you busy, I may do it myself and make pull request.

To think about:

How many values should return filter-func in (for/lists ...). Only one or as 
many as values of body. I don't know what is more natural.

-- 
Roman Klochkov
_
  Racket Developers list:
  http://lists.racket-lang.org/dev


Re: [racket-dev] for/... improvement. #:filter

2013-09-10 Thread Stephen Chang
I like the proposal. My earlier suggestion for supporting #:when and
#:unless in the body is the same as what you are asking for, I
believe.

On Wed, Sep 11, 2013 at 12:41 AM, Roman Klochkov kalimeh...@mail.ru wrote:
 I propose to add yet one keyword to for/foldX/derived/break (and so to all
 for/... syntaxes).

 Reason:

 If one need to filter the results of body before collecting them in
 list/vector/sum/..., there are two options:

 1. (filter filter-func (for/list ...)) : doubles memory consumption and
 slower
 2. (for/list (exprs ...) body ...) =  (for/list (exprs ... #:when #t (res
 (in-value (begin body ...))) #:when (filter-func res)) res). Works, but very
 clumsy.

 I propose syntax
 (for/list (exprs ...) body ...) =  (for/list (exprs ... #:filter
 filter-func) body ...) with the same behavior as in 2.

 Syntax:

 #:filter filter-func = (thunk* #t)

 Expects function with the same number of arguments as the result of for/...
 body should return values. Applied  to results of body, and collected only
 if filter-func returns #t.

 Implementation:

 Minor changes in for.rkt in (define-syntax (for/foldX/derived stx) ...)
 and in documentation. If you busy, I may do it myself and make pull request.

 To think about:

 How many values should return filter-func in (for/lists ...). Only one or as
 many as values of body. I don't know what is more natural.

 --
 Roman Klochkov

 _
   Racket Developers list:
   http://lists.racket-lang.org/dev

_
  Racket Developers list:
  http://lists.racket-lang.org/dev