summaryrefslogtreecommitdiff
path: root/README.creole
blob: 68195110885e6a5ce24aba0ea86a2773d0ec67a4 (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
= noflet - Local function decoration =

{{{noflet}}} is dynamic, local, advice for Emacs-Lisp code.

{{{noflet}}} also has an Emacs indentation function for {{{flet}}}
like macros.

It's great for test code when you need to mock another function.

This is useful for definining functions that overide a base definition
in some way. You get access to the original (before you re-defined it)
function through a different name.

Use it like this:

{{{
(noflet ((find-file-noselect (file-name)
           (if (string-match-p "^#.*" file-name)
               (this-fn "/tmp/mytest")
               (this-fn file-name)))
         (expand-file-name (file-name &optional thing)
           (if (string-match-p "^#.*" file-name)
               (concat "/tmp" (file-name-as-directory 
                               (substring file-name 1)))
               (funcall this-fn file-name thing))))
  (expand-file-name "#/thing"))
}}}

This specifies that two functions should be overridden:

* {{{find-file-noselect}}} is changed so that if the file-name begins with {{{#}}} a different file-name altogether is opened
* {{{expand-file-name}}} is changed so that if the file-name begins with {{{#}}} it's resolved via {{{/tmp}}}

In both cases {{{this-fn}}} is used to access the original function
definition of these common Emacs functions.

=== Decorating results ===

{{{noflet}}} can also be used to decorate results, just like
{{{around-advice}}}:

{{{
(noflet ((find-file (file-name &optional wildcards)
           (let ((result (funcall this-fn file-name wildcards)))
              (with-current-buffer result
                 (setq some-buffer-local "special"))
              result)))
    (with-current-buffer (find-file "~/some-file")
      (message "buffer local var is: %s" some-buffer-local)))
}}}

This overrides {{{find-file}}} to set a local variable. There are
surely better ways to do it than this but it illustrates the point.


=== Lexical version ===

Because we include a good indenting function we also include a lexical
{{{flet}}}. It's just a wrapper for {{{cl-flet}}}.