Answer: Yes, if you redefine nothingness. You can exploit the fact that 
appending (or splicing) an empty list will cause it to disappear (meaning, no 
#<void> residue).

#lang racket
(require rackunit)
(define (foo-3 x) (if (eq? x "foo") (list #t) empty))
(check-equal? (append-map foo-3 '(a b "foo" "bar")) '(#t))




On Thursday, December 10, 2015 at 10:16:40 PM UTC-8, David K. Storrs wrote:
> Question: Is there a way to make a function return nothing -- not '() or 
> #void, but actually nothing?
> 
> 
> I'm playing around with HTML parsing as a learning exercise.  The current 
> exercise is writing a look-down function which can be handed an HTML value 
> produced by the html library and a function, run the function across the 
> collect the results, and return them.  I would use this for things like "find 
> every link in the following document" or "capitalize every use of the word 
> 'kumquat'" or etc.
> 
> I would like to have a way to say "this element isn't interesting, just 
> ignore it" so that I don't get spurious return values in the results list.  I 
> can't see a way to do that...I can exclude the values afterwards, but that's 
> not really what I was looking for, and opens the door to false negatives.  
> 
> Here's some simplified test code (removing all the HTML stuff for clarity) to 
> show the point:
> 
> 
> ----------------
> (define (foo-1 x) (if (eq? x "foo") #t '()))
> (define (foo-2 x) (if (eq? x "foo") #t (values)))
> 
> (map foo-1 '(a b "foo" "bar"))
> (filter (lambda (x) (not (null? x))) (map foo-1 '(a b "foo" "bar")))
> (map foo-2 '(a b "foo" "bar"))
> 
> [dstorrs@localhost:~/personal/study/scheme/spider:<master*>]$ racket test.rkt
> racket test.rkt
> '(() () #t ())
> '(#t)
> result arity mismatch;
>  expected number of values not received
>   expected: 1
>   received: 0
>   values...:
>   context...:
>    /Users/dstorrs/personal/study/scheme/spider/test.rkt: [running body]
> ----------------
> 
> Instead of a 'result arity' crash, I would have liked to get '(#t) back, same 
> a if I'd generated the list and then filtered it.
> 
> Is there a way to do this?
> 
> 
> For the record, here's the actual look-down function:
> 
> (require (prefix-in h: html)
>          (prefix-in x: xml))
> 
> (define (look-down el action)
>   (match el
>          [(struct h:html-full (attributes content))
>           (apply append (map action content))]
> 
>          [(struct h:html-element (attributes))
>           (action el)]
> 
>          [ _ '()]))

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to