* New scheme/function module (added by mistake on the previous commit)
* Added it to scheme/main * Documented it svn: r9018
This commit is contained in:
parent
a6642f066f
commit
d6cbe2b09f
|
@ -1,6 +1,6 @@
|
||||||
#lang scheme/base
|
#lang scheme/base
|
||||||
|
|
||||||
(provide negate curry)
|
(provide negate curry curryr)
|
||||||
|
|
||||||
(define (negate f)
|
(define (negate f)
|
||||||
(unless (procedure? f) (raise-type-error 'negate "procedure" f))
|
(unless (procedure? f) (raise-type-error 'negate "procedure" f))
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
(define (curry f . args)
|
(define (curry f . args)
|
||||||
(unless (procedure? f) (raise-type-error 'curry "procedure" f))
|
(unless (procedure? f) (raise-type-error 'curry "procedure" f))
|
||||||
(let loop ([args args])
|
(let loop ([args args])
|
||||||
(define curry
|
(define curried
|
||||||
(if (null? args) ; always at least one step
|
(if (null? args) ; always at least one step
|
||||||
(lambda more (loop more))
|
(lambda more (loop more))
|
||||||
(lambda more
|
(lambda more
|
||||||
|
@ -29,4 +29,17 @@
|
||||||
(if (procedure-arity-includes? f (length args))
|
(if (procedure-arity-includes? f (length args))
|
||||||
(apply f args)
|
(apply f args)
|
||||||
(loop args))))))
|
(loop args))))))
|
||||||
curry))
|
curried))
|
||||||
|
|
||||||
|
(define (curryr f . args)
|
||||||
|
(unless (procedure? f) (raise-type-error 'curry "procedure" f))
|
||||||
|
(let loop ([args args])
|
||||||
|
(define curried-right
|
||||||
|
(if (null? args) ; always at least one step
|
||||||
|
(lambda more (loop more))
|
||||||
|
(lambda more
|
||||||
|
(let ([args (append more args)])
|
||||||
|
(if (procedure-arity-includes? f (length args))
|
||||||
|
(apply f args)
|
||||||
|
(loop args))))))
|
||||||
|
curried-right))
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
scheme/tcp
|
scheme/tcp
|
||||||
scheme/udp
|
scheme/udp
|
||||||
scheme/list
|
scheme/list
|
||||||
|
scheme/function
|
||||||
scheme/path
|
scheme/path
|
||||||
scheme/file
|
scheme/file
|
||||||
scheme/cmdline
|
scheme/cmdline
|
||||||
|
@ -30,6 +31,7 @@
|
||||||
scheme/tcp
|
scheme/tcp
|
||||||
scheme/udp
|
scheme/udp
|
||||||
scheme/list
|
scheme/list
|
||||||
|
scheme/function
|
||||||
scheme/path
|
scheme/path
|
||||||
scheme/file
|
scheme/file
|
||||||
scheme/cmdline
|
scheme/cmdline
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
"Returns " (to-element 'equiv)))))]))
|
"Returns " (to-element 'equiv)))))]))
|
||||||
|
|
||||||
|
|
||||||
@(define list-eval (make-base-eval))
|
@(begin (define list-eval (make-base-eval))
|
||||||
@interaction-eval[#:eval list-eval (require scheme/list)]
|
(interaction-eval #:eval list-eval (require scheme/list)))
|
||||||
|
|
||||||
|
|
||||||
@title[#:tag "pairs"]{Pairs and Lists}
|
@title[#:tag "pairs"]{Pairs and Lists}
|
||||||
|
|
|
@ -346,3 +346,56 @@ by @scheme[arity]). For most primitives, this procedure returns
|
||||||
@scheme[1], since most primitives return a single value when
|
@scheme[1], since most primitives return a single value when
|
||||||
applied.}
|
applied.}
|
||||||
|
|
||||||
|
@; ----------------------------------------
|
||||||
|
@section{Additional Procedure Functions}
|
||||||
|
|
||||||
|
@note-lib[scheme/function]
|
||||||
|
@(begin (define fun-eval (make-base-eval))
|
||||||
|
(fun-eval '(require scheme/function))
|
||||||
|
(define-syntax fun-examples
|
||||||
|
(syntax-rules ()
|
||||||
|
[(_ e ...) (examples #:eval fun-eval e ...)])))
|
||||||
|
|
||||||
|
@defproc[(negate [proc procedure?]) procedure?]{
|
||||||
|
|
||||||
|
Returns a procedure that is just like @scheme[proc], except that it
|
||||||
|
returns the negation of the result. The resulting procedure has the
|
||||||
|
same arity as @scheme[proc].
|
||||||
|
|
||||||
|
@fun-examples[
|
||||||
|
(filter (negate symbol?) '(1 a 2 b 3 c))
|
||||||
|
]}
|
||||||
|
|
||||||
|
@defproc*[([(curry [proc procedure?]) procedure?]
|
||||||
|
[(curry [proc procedure?] [v any/c] ...+) procedure?])]{
|
||||||
|
|
||||||
|
@scheme[(curry proc)] returns a procedure that is a curried version of
|
||||||
|
@scheme[proc]. When the resulting procedure is applied on an
|
||||||
|
insufficient number of arguments, it returns a procedure that expects
|
||||||
|
additional arguments. However, at least one such application step is
|
||||||
|
required in any case, even if the @scheme[proc] consumes any number of
|
||||||
|
arguments.
|
||||||
|
|
||||||
|
If additional values are provided to @scheme[curry], they are used as
|
||||||
|
the first step. (This means that @scheme[curry] itself is curried.)
|
||||||
|
|
||||||
|
@fun-examples[
|
||||||
|
(map ((curry +) 10) '(1 2 3))
|
||||||
|
(map (curry + 10) '(1 2 3))
|
||||||
|
(map (compose (curry * 2) (curry + 10)) '(1 2 3))
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@defproc*[([(curryr [proc procedure?]) procedure?]
|
||||||
|
[(curryr [proc procedure?] [v any/c] ...+) procedure?])]{
|
||||||
|
|
||||||
|
Like @scheme[curry], except that the arguments are collected in the
|
||||||
|
opposite direction: the first step collects the rightmost group of
|
||||||
|
arguments, and following steps add arguments to the left of these.
|
||||||
|
|
||||||
|
@fun-examples[
|
||||||
|
(map (curryr list 'foo) '(1 2 3))
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user