-
-
Notifications
You must be signed in to change notification settings - Fork 3
Open
Description
Macro
Defines an automatically currying procedure in a single step. Uses curry
internally.
(begin-for-syntax
(define-syntax-class name-params
#:description "name and parameters clause"
(pattern (name:id params:id ...+)
#:fail-when (check-duplicate-identifier
(syntax->list #'(params ...)))
"duplicate parameter name")))
(define-syntax (define/curry stx)
(syntax-parse stx
[(_ np:name-params body ...+)
#`(define np.name
(curry #,(syntax/loc stx
(λ (np.params ...)
body ...))))]))
Example
;; Define a procedure like this:
(define/curry (insert-between mid left right)
(string-join (list left mid right) ""))
;; To use it like this:
(define dash-between (insert-between "-"))
(dash-between "left" "right") ; "left-right"
;; Or currying wherever necessary:
(((insert-between "-") "left") "right") ; "left-right"
Before and After
This code-cleaning macro reduces some boilerplate necessary to define a curried function. Code like this:
(define insert-between
(curry
(λ (mid left right)
(string-join (list left mid right) ""))))
Is simplified to this, identical in form to defining a regular procedure:
(define/curry (insert-between mid left right)
(string-join (list left mid right) ""))
I wrote an earlier version of this macro when implementing some Haskell code in Racket, and thought it was useful enough to share!
Licence
I release the above code under the MIT license, and accompanying text under the Creative Commons Attribution 4.0 International license.
bennn and Lazerbeak12345
Metadata
Metadata
Assignees
Labels
No labels