branch: elpa/llama commit 392b89ba544039633a271d384ff6a776923826e5 Author: Jonas Bernoulli <jo...@bernoul.li> Commit: Jonas Bernoulli <jo...@bernoul.li>
Improve documentation --- README.org | 62 +++++++++++++++++----------------- llama.el | 111 ++++++++++++++++++++++++++++++------------------------------- 2 files changed, 85 insertions(+), 88 deletions(-) diff --git a/README.org b/README.org index 43411a0f73..e9a56b31bb 100644 --- a/README.org +++ b/README.org @@ -1,28 +1,30 @@ * Llama — Compact syntax for short lambda -This package implements the macro ~##~, which provides compact -syntax for short ~lambda~, without actually being new syntax, -which would be difficult to get merged into Emacs. Past attempts -to add syntax were met with determined pushback and the use of a -macro was suggested as an alternative. - -The ~##~ macro, whose signature is ~(## FN &rest BODY)~, expands -to a ~lambda~ expression, which wraps around these arguments. - -This ~lambda~ expression calls the function FN with arguments -BODY and returns its value. Its own arguments are derived from -symbols found in BODY. - -Each symbol from ~%1~ through ~%9~, which appears in BODY, -specifies a mandatory argument. Each symbol from ~&1~ through -~&9~, which appears in BODY, specifies an optional argument. -All arguments following an optional argument have to be optional -as well, thus their names have to begin with ~&~. Symbol ~&*~ -specifies extra (~&rest~) arguments. - -The shorter symbol ~%~ can be used instead of ~%1~, but using both -in the same expression is not allowed. Likewise ~&~ can be used -instead of ~&1~. +This package implements a macro named ~##~, which provides a compact way +to write short ~lambda~ expressions. + +The signature of the macro is ~(## FN &rest BODY)~ and it expands to a +~lambda~ expression, which calls the function ~FN~ with the arguments ~BODY~ +and returns the value of that. The arguments of the ~lambda~ expression +are derived from symbols found in ~BODY~. + +Each symbol from ~%1~ through ~%9~, which appears in an unquoted part +of ~BODY~, specifies a mandatory argument. Each symbol from ~&1~ through +~&9~, which appears in an unquoted part of ~BODY~, specifies an optional +argument. The symbol ~&*~ specifies extra (~&rest~) arguments. + +The shorter symbol ~%~ can be used instead of ~%1~, but using both in +the same expression is not allowed. Likewise ~&~ can be used instead +of ~&1~. These shorthands are not recognized in function position. + +To support binding forms that use a vector as ~VARLIST~ (such as ~-let~ +from the ~dash~ package), argument symbols are also detected inside of +vectors. + +The space between ~##~ and ~FN~ can be omitted because ~##~ is read-syntax +for the symbol whose name is the empty string. If you prefer you can +place a space there anyway, and if you prefer to not use this somewhat +magical symbol at all, you can instead use the alternative name ~llama~. Instead of: @@ -44,8 +46,8 @@ which expands to: (foo %1 (bar &3) &*)) #+end_src -Unused trailing arguments and mandatory unused arguments at the -border between mandatory and optional arguments are also supported: +Unused trailing arguments and mandatory unused arguments at the border +between mandatory and optional arguments are also supported: #+begin_src emacs-lisp (##list %1 _%3 &5 _&6) @@ -58,10 +60,6 @@ becomes: (list %1 &5)) #+end_src -Note how ~_%3~ and ~_&6~ are removed from the body, because their -names begin with an underscore. Also note that ~_&4~ is optional, -unlike the explicitly specified ~_%3~. - -The name ~##~ was chosen because that allows (optionally) -omitting the whitespace between it and the following symbol. -It also looks similar to ~#'function~. +Note how ~_%3~ and ~_&6~ are removed from the body, because their names +begin with an underscore. Also note that ~_&4~ is optional, unlike the +explicitly specified ~_%3~. diff --git a/llama.el b/llama.el index 1928da3586..b5545fef98 100644 --- a/llama.el +++ b/llama.el @@ -25,29 +25,31 @@ ;;; Commentary: -;; This package implements the macro `##', which provides compact -;; syntax for short `lambda', without actually being new syntax, -;; which would be difficult to get merged into Emacs. Past attempts -;; to add syntax were met with determined pushback and the use of a -;; macro was suggested as an alternative. - -;; The `##' macro, whose signature is (## FN &rest BODY), expands -;; to a `lambda' expression, which wraps around these arguments. - -;; This `lambda' expression calls the function FN with arguments -;; BODY and returns its value. Its own arguments are derived from -;; symbols found in ARGS. - -;; Each symbol from `%1' through `%9', which appears in BODY, -;; specifies a mandatory argument. Each symbol from `&1' through -;; `&9', which appears in BODY, specifies an optional argument. -;; All arguments following an optional argument have to be optional -;; as well, thus their names have to begin with `&'. Symbol `&*' -;; specifies extra (`&rest') arguments. - -;; The shorter symbol `%' can be used instead of `%1', but using both -;; in the same expression is not allowed. Likewise `&' can be used -;; instead of `&1'. +;; This package implements a macro named `##', which provides a compact way +;; to write short `lambda' expressions. + +;; The signature of the macro is (## FN &rest BODY) and it expands to a +;; `lambda' expression, which calls the function FN with the arguments BODY +;; and returns the value of that. The arguments of the `lambda' expression +;; are derived from symbols found in BODY. + +;; Each symbol from `%1' through `%9', which appears in an unquoted part +;; of BODY, specifies a mandatory argument. Each symbol from `&1' through +;; `&9', which appears in an unquoted part of BODY, specifies an optional +;; argument. The symbol `&*' specifies extra (`&rest') arguments. + +;; The shorter symbol `%' can be used instead of `%1', but using both in +;; the same expression is not allowed. Likewise `&' can be used instead +;; of `&1'. These shorthands are not recognized in function position. + +;; To support binding forms that use a vector as VARLIST (such as `-let' +;; from the `dash' package), argument symbols are also detected inside of +;; vectors. + +;; The space between `##' and FN can be omitted because `##' is read-syntax +;; for the symbol whose name is the empty string. If you prefer you can +;; place a space there anyway, and if you prefer to not use this somewhat +;; magical symbol at all, you can instead use the alternative name `llama'. ;; Instead of: ;; @@ -63,8 +65,8 @@ ;; (lambda (%1 &optional _&2 &3 &rest &*) ;; (foo %1 (bar &3) &*)) -;; Unused trailing arguments and mandatory unused arguments at the -;; border between mandatory and optional arguments are also supported: +;; Unused trailing arguments and mandatory unused arguments at the border +;; between mandatory and optional arguments are also supported: ;; ;; (##list %1 _%3 &5 _&6) ;; @@ -73,13 +75,9 @@ ;; (lambda (%1 _%2 _%3 &optional _&4 &5 _&6) ;; (list %1 &5)) ;; -;; Note how `_%3' and `_&6' are removed from the body, because their -;; names begin with an underscore. Also note that `_&4' is optional, -;; unlike the explicitly specified `_%3'. - -;; The name `##' was chosen because that allows (optionally) -;; omitting the whitespace between it and the following symbol. -;; It also looks similar to #'function. +;; Note how `_%3' and `_&6' are removed from the body, because their names +;; begin with an underscore. Also note that `_&4' is optional, unlike the +;; explicitly specified `_%3'. ;;; Code: @@ -87,20 +85,28 @@ (defmacro llama (fn &rest body) "Expand to a `lambda' expression that wraps around FN and BODY. -This `lambda' expression calls the function FN with arguments -BODY and returns its value. Its own arguments are derived from -symbols found in BODY. +This macro provides a compact way to write short `lambda' expressions. +It expands to a `lambda' expression, which calls the function FN with +arguments BODY and returns its value. The arguments of the `lambda' +expression are derived from symbols found in BODY. + +Each symbol from `%1' through `%9', which appears in an unquoted part +of BODY, specifies a mandatory argument. Each symbol from `&1' through +`&9', which appears in an unquoted part of BODY, specifies an optional +argument. The symbol `&*' specifies extra (`&rest') arguments. -Each symbol from `%1' through `%9', which appears in BODY, -specifies a mandatory argument. Each symbol from `&1' through -`&9', which appears in BODY, specifies an optional argument. -All arguments following an optional argument have to be optional -as well, thus their names have to begin with `&'. Symbol `&*' -specifies extra (`&rest') arguments. +The shorter symbol `%' can be used instead of `%1', but using both in +the same expression is not allowed. Likewise `&' can be used instead +of `&1'. These shorthands are not recognized in function position. -The shorter symbol `%' can be used instead of `%1', but using both -in the same expression is not allowed. Likewise `&' can be used -instead of `&1'. +To support binding forms that use a vector as VARLIST (such as `-let' +from the `dash' package), argument symbols are also detected inside of +vectors. + +The space between `##' and FN can be omitted because `##' is read-syntax +for the symbol whose name is the empty string. If you prefer you can +place a space there anyway, and if you prefer to not use this somewhat +magical symbol at all, you can instead use the alternative name `llama'. Instead of: @@ -116,8 +122,8 @@ which expands to: (lambda (%1 &optional _&2 &3 &rest &*) (foo %1 (bar &3) &*)) -Unused trailing arguments and mandatory unused arguments at the -border between mandatory and optional arguments are also supported: +Unused trailing arguments and mandatory unused arguments at the border +between mandatory and optional arguments are also supported: (##list %1 _%3 &5 _&6) @@ -126,16 +132,9 @@ becomes: (lambda (%1 _%2 _%3 &optional _&4 &5 _&6) (list %1 &5)) -Note how `_%3' and `_&6' are removed from the body, because their -names begin with an underscore. Also note that `_&4' is optional, -unlike the explicitly specified `_%3'. - -The name `##' was chosen because that allows (optionally) omitting -the whitespace between it and the following symbol. If you dislike -this trickery, you can alternatively use this macro under the name -`llama'. (It is also available under the name `\\#\\#', but the sole -purpose of that is to allow using \"M-x describe-function RET ## RET\" -to view this docstring.)" +Note how `_%3' and `_&6' are removed from the body, because their names +begin with an underscore. Also note that `_&4' is optional, unlike the +explicitly specified `_%3'." (cond ((symbolp fn)) ((and (eq (car-safe fn) backquote-backquote-symbol) (not body))