Skip to content

Commit

Permalink
add define/curry
Browse files Browse the repository at this point in the history
  • Loading branch information
agj authored and bennn committed Oct 27, 2021
1 parent b4743f0 commit 50bd615
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 0 deletions.
20 changes: 20 additions & 0 deletions define-curry/define-curry-test.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#lang racket/base
(module+ test
(require rackunit racket/string syntax-parse-example/define-curry/define-curry)

(test-case "insert-between"
(define/curry (insert-between mid left right)
(string-join (list left mid right) ""))

(define dash-between (insert-between "-"))

(check-equal? (dash-between "left" "right") "left-right")
(check-equal? (((insert-between "-") "left") "right") "left-right")

(check-true
(string-suffix? (symbol->string (object-name insert-between))
"6:4"))

(check-exn #rx"arity mismatch" ;; object name
(lambda () (insert-between 2 3 3 4 4 44))))
)
20 changes: 20 additions & 0 deletions define-curry/define-curry.rkt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#lang racket
(provide define/curry)
(require (for-syntax syntax/parse))

(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 ...))))]))

30 changes: 30 additions & 0 deletions define-curry/define-curry.scrbl
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#lang syntax-parse-example
@require[
(for-label racket/base syntax/parse syntax-parse-example/define-curry/define-curry)]

@(define define-curry-eval
(make-base-eval '(require racket/string syntax-parse-example/define-curry/define-curry)))

@title{@tt{define/curry}}
@stxbee2021["agj" 5]

@; =============================================================================

@defmodule[syntax-parse-example/define-curry/define-curry]{}

@defform[(define/curry (fn-id arg-id ...+) body ...+)]{
Defines an automatically currying procedure.

@examples[#:eval define-curry-eval
(define/curry (insert-between mid left right)
(string-join (list left mid right) ""))
(define dash-between (insert-between "-"))
(dash-between "left" "right")
]

The macro uses @racket[syntax/loc] to give newly-defined functions
names that point to their definition rather than to the macro body.

@racketfile{define-curry.rkt}

}
1 change: 1 addition & 0 deletions index.scrbl
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
@include-example{first-class-or}
@include-example{optional-assert}
@include-example{make-variable}
@include-example{define-curry}
@include-example{cross-macro-communication}
@include-example{let-star}
@include-example{while-break}
Expand Down

0 comments on commit 50bd615

Please sign in to comment.