Threading functions
Is there a simpler way to achieve threading functionality in racket? I know about the threading library but it seems like such a basic functionality that I wonder if there is not some builtin way to do this.
(define (thread x . fns)
(foldl (lambda (f a) (f a))
thread
fns))
Also, can you express (lambda (f a) (f a))
in a simpler fashion?
1 answer

There are lots of ways of doing this. A nice one is to use a macro, a simple (and perhaps not completely correct) version of which is:
(definesyntax (/> stx) (syntaxcase stx () [(_ x) #'x] [(_ x f) #'(f x)] [(/> x f fs ...) #'(/> (f x) fs ...)] [/> (identifier? #'/>) #'(λ (x . fns) (for/fold ([r x]) ([f fns]) (f r)))]))
Now, for instance
(/> x sin cos)
is expanded to(cos (sin x))
: there is no runtime overhead at all. The last clause means that(apply /> 1 (list sin cos))
will work.I'm not sure the above macro is completely correct, particularly the last clause.