1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
* 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 an 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~.
Instead of:
#+begin_src emacs-lisp
(lambda (a _ &optional c &rest d)
(foo a (bar c) d))
#+end_src
you can use this macro and write:
#+begin_src emacs-lisp
(##foo %1 (bar &3) &*)
#+end_src
which expands to:
#+begin_src emacs-lisp
(lambda (%1 &optional _&2 &3 &rest &*)
(foo %1 (bar &3) &*))
#+end_src
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)
#+end_src
becomes:
#+begin_src emacs-lisp
(lambda (%1 _%2 _%3 &optional _&4 &5 _&6)
(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~.
|