aboutsummaryrefslogtreecommitdiff
path: root/moo.org
blob: 6d08b8d49164727c637e548aed2adfbc723f31d2 (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
#+PROPERTY: header-args:emacs-lisp :lexical t

Setting the property for the whole buffer to have lexical binding in emacs-lisp
source blocks. Lexical binding will hold when evaluating any source block where
no other ~:lexical~ header arg is present.

* Moo
:PROPERTIES:
:header-args:emacs-lisp+: :noweb-ref moo
:END:

noweb-ref will make all blocks under this heading expand with =<<moo>>=

#+begin_src emacs-lisp
  (+ x 3)
#+end_src

* Goo
:PROPERTIES:
:header-args:emacs-lisp+: :noweb yes
:header-args:emacs-lisp+: :var foo="bar"
:END:

turn noweb on so we interpret the =<<moo>>= syntax as code to expand
setting a var ~foo~ to the string "bar" to be used later.

** Poop

properties go down into the subtrees

#+begin_src emacs-lisp
  (let ((x 1))
    <<moo>>)
#+end_src

#+RESULTS:
: 4

*** Floppy
:PROPERTIES:
:header-args:emacs-lisp+: :noweb no
:END:

apparently continuing with the "+" pattern takes the no over the yes above
this will fail to expand moo.

#+begin_src emacs-lisp
  (let ((x 1))
    <<moo>>)
#+end_src

#+RESULTS:
: let: Symbol’s value as variable is void: <<moo>>

** Gah

Define a function with a free variable x.

#+begin_src emacs-lisp :results none
  (defun getx ()
    x)
#+end_src

Because ~x~ is lexically bound in this block, ~getx~ will error
since ~x~ is not a dynamic variable and isn't bound with indefinite scope.

#+begin_src emacs-lisp
  (let ((x 1))    ; ‘x’ is lexically bound.
    (getx))
#+end_src

#+RESULTS:
: Symbol’s value as variable is void: x

we can flip lexical binding off for the evaluation of this block and
the free variable ~x~ is bound when ~getx~ is evaluated.

#+begin_src emacs-lisp :lexical no
  (let ((x 2))    ; ‘x’ is dynamically bound
    (getx))
#+end_src

#+RESULTS:
: 2

** Bah
:PROPERTIES:
:header-args:emacs-lisp+: :var foo="baz"
:END:

overriding the variable in this subtree

#+begin_src emacs-lisp
  foo
#+end_src

#+RESULTS:
: baz