1 | ---
|
2 | default_highlighter: oils-sh
|
3 | in_progress: true
|
4 | ---
|
5 |
|
6 | Oils Pure Mode: For Config Files and Functions
|
7 | =========================================
|
8 |
|
9 | The interpreter can run in pure mode
|
10 |
|
11 |
|
12 | <div id="toc">
|
13 | </div>
|
14 |
|
15 | ## Why does Oils have Pure Mode?
|
16 |
|
17 | - config files should be isolated to git
|
18 | - **data** versus **code**
|
19 |
|
20 | ---
|
21 |
|
22 | - JSON is data.
|
23 | - TSV, HTML is data
|
24 | - J8 Notation is data.
|
25 | - Hay is programmable data.
|
26 | - it doesn't format your hard drive.
|
27 |
|
28 | ### WebAssembly Analogy
|
29 |
|
30 | WebAssembly is also pure computation, and can be used in a variety of contexts.
|
31 |
|
32 | It has `io` too.
|
33 |
|
34 | ## When is it active?
|
35 |
|
36 | ### `--eval-pure`
|
37 |
|
38 | vs `--eval`
|
39 |
|
40 | TODO: link to doc/reef
|
41 |
|
42 | ### `eval()` and `evalExpr()`
|
43 |
|
44 | vs. `io->eval()` and `io->evalExpr()`
|
45 |
|
46 | TODO: link to doc/reef
|
47 |
|
48 | ### Pure Functions
|
49 |
|
50 | - TODO: `func`
|
51 |
|
52 | ## What's allowed in Pure Mode? Not allowed?
|
53 |
|
54 | What's not allowed:
|
55 |
|
56 | - external commands
|
57 | - any process construct
|
58 | - pipelines
|
59 | - subshell
|
60 | - command sub and process sub
|
61 | - background jobs with `&`
|
62 | - many builtins
|
63 | - most of these do I/O
|
64 | - globbing - touches the file system
|
65 | - time and randomness
|
66 | - $SECONDS and $RANDOM
|
67 |
|
68 | ---
|
69 |
|
70 | - [`shell-flags`](chap-front-end.html#shell-flags) for `--eval-pure`
|
71 | - [`func/eval`](chap-builtin-func.html#func/eval) and
|
72 | [`func/evalExpr`](chap-builtin-func.html#func/evalExpr)
|
73 | - [`func`](chap-ysh-cmd.html#func) - functions are pure
|
74 | - [`io`](chap-type-method.html#io) and [`vm`](chap-type-method.html#vm) - impure
|
75 | behavior is attached to these objects
|
76 |
|
77 | ## Notes
|
78 |
|
79 | Pure mode is a bit like functional programming, but the style **inside** a
|
80 | function is not functional.
|
81 |
|
82 | In YSH, it's natural to write pure functions in an imperative style. Just like
|
83 | you can do this in Python or JavaScript (although there is no enforcement,
|
84 | unlike Oils)
|
85 |
|
86 |
|
87 |
|
88 |
|