aboutsummaryrefslogtreecommitdiff
path: root/README.org
blob: 40a24b41f6071742a0fc345302fe2466061e9b86 (plain)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
* lambda-riffs 

ALPHA QUALITY -- USE AT YOUR OWN RISK 

A simple "one file" system that adds a reader macro for quick lambda
riffing.

** Examples and Use

To use the system, simply load it. It adds a single reader macro to
you lisp system.

If this system has any actual users, and if those users are
dissatisfied with the alteration of the global readtable, let me know
and I can try adapting this for use with named-readtables. 

*** Normal  Use

As normally used, lambda-riffs lets you make quick anonymous
functions.  There is a special syntax for making variables that start
with $, for example `$x` or `$my-var` 

Here is a basic example

 #+begin_src lisp :results verbatim

 (let ((xs (list 1 2 3 4 5 6))) 
   (remove-if-not #$(member $x xs)
                  (loop repeat 20 collect (random 10))))

 #+end_src

 : (3 1 6 1 4 2 4 6 4 3 5 1 5 3)

the =#$= syntax is a reader macro dispatch sequence. An symbol that
begins with =$= inside a form that begins with =#$= will be treated as
a parameter of the function being defined.

#+begin_src lisp :results verbatim

(list  (funcall #$(list $x $y) 1 2)
       (funcall #$(list $x $x $x) 10))
 
#+end_src


: ((1 2) (10 10 10))


*** Numbered Arguments 

Examples of numbered arguments:

- =$1= , =$2= 
- =$1-with-a-name= , =$2another-name= 

I.e. numbered arguments begin $ and are followed by an integer, and
then any normal variable name characters.

Their effect is to explicitly specify the order of the parameters
being defined.  Here is ane example:

#+begin_src lisp :results verbatim

(funcall #$(list $2-symb $1-symb) 'second 'first)

#+end_src


: (FIRST SECOND)

In the above ='second= is passed in as the first argument, and
='first= is passed as the second argument.  

Interestingly the numbers do not have to be sequentail, they are
merely sorted in ascending order:

#+begin_src lisp :results verbatim 

(funcall #$(list $10 $2 $4) :two :four :ten)

#+end_src


: (:TEN :TWO :FOUR)

*** Nested Forms

You can nest forms by adding an additional $ to the
dispatch. Variables of nested forms must include the same number of $
characters as there are in the dispatch form.

This is easer to understand through example:

#+begin_src lisp :results verbatim

;; map over a list of lists, subtracting 9 from any member of a list
;; that is greater than 9

(mapcar #$(mapcar
           #$$(if (> $$x 9) (- $$x 9) $$x)  ; our nested form
           $digit-list)                     
        '((1 2 3 4 5 6 7 8 9)
          (10 11 12 12 14 15 16 17 18)))
#+end_src


: ((1 2 3 4 5 6 7 8 9) (1 2 3 3 5 6 7 8 9))