CURRY-COMPOSE-READER-MACROS exports a single function
which may be called to enable reading of {}
braces as
partial function application []
brackets as function
composition and «»
braces split/join across
multiple functions.
Source:
http://github.com/eschulte/curry-compose-reader-macros.
Reader macros for concise expression of function partial application and composition.
These reader macros expand into the curry
, rcurry
and compose
functions from the Alexandria library. The contents of curly
brackets are curried and the contents of square brackets are
composed. The _
symbol inside curly brackets changes the order
of arguments with rcurry
.
The following examples demonstrate usage.
;; partial application `curry`
(mapcar {+ 1} '(1 2 3 4)) ; => (2 3 4 5)
;; alternate order of arguments `rcurry`
(mapcar {- _ 1} '(1 2 3 4)) ; => (0 1 2 3)
;; function composition
(mapcar [#'list {* 2}] '(1 2 3 4)) ; => ((2) (4) (6) (8))
Additionally special brackets may be used to split arguments amongst a
list of functions and collect the results. The first element of the
«»
-delimited list is the “join” function. Incoming arguments are
split out to the remaining functions in the «»
-delimited list, and
their results are then passed to the join function. (Emacs users can
type «
and »
with C-x 8 <
and C-x 8 >
respectively)
;; function split and join
(mapcar «list {* 2} {* 3}» '(1 2 3 4)) ; => ((2 3) (4 6) (6 9) (8 12))
(mapcar «and {< 2} #'evenp» '(1 2 3 4)) ; => (NIL NIL NIL T)
(mapcar «+ {* 2} {- _ 1}» '(1 2 3 4)) ; => (2 5 8 11)
Load CURRY-COMPOSE-READER-MACROS at the REPL with the following
(ql:quickload :curry-compose-reader-macros)
(ql:quickload :named-readtables)
(use-package 'named-readtables)
(in-readtable :curry-compose-reader-macros)
Use CURRY-COMPOSE-READER-MACROS in source by adding NAMED-READTABLES and CURRY-COMPOSE-READER-MACROS to your ASDF file and package and then including the following in source files which use these reader macros.
(in-readtable :curry-compose-reader-macros)
Emacs users may easily treat {}’s, []’s and «»’s as parenthesis for paredit commands and SEXP movement with the following configuration.
;; Syntax table
(modify-syntax-entry ?\[ "(]" lisp-mode-syntax-table)
(modify-syntax-entry ?\] ")[" lisp-mode-syntax-table)
(modify-syntax-entry ?\{ "(}" lisp-mode-syntax-table)
(modify-syntax-entry ?\} "){" lisp-mode-syntax-table)
(modify-syntax-entry ?\« "(»" lisp-mode-syntax-table)
(modify-syntax-entry ?\» ")«" lisp-mode-syntax-table)
;; Paredit keys
(eval-after-load "paredit"
'(progn
(define-key paredit-mode-map "[" 'paredit-open-parenthesis)
(define-key paredit-mode-map "]" 'paredit-close-parenthesis)
(define-key paredit-mode-map "(" 'paredit-open-bracket)
(define-key paredit-mode-map ")" 'paredit-close-bracket)
(define-key paredit-mode-map "«" 'paredit-open-special)
(define-key paredit-mode-map "»" 'paredit-close-special)))
Also, Emacs will insert «
with C-x 8 <
and »
with C-x 8 >
.
This documentation was prepared with a hacked up version of DOCUMENTATION-TEMPLATE.