fez-lisp 1.0.54 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -30
- package/lib/baked/std.js +1 -1
- package/package.json +1 -1
- package/src/compiler.js +6 -16
- package/src/evaluator.js +1 -1
- package/src/interpreter.js +31 -120
- package/src/keywords.js +2 -9
- package/src/parser.js +2 -18
- package/src/utils.js +20 -15
package/README.md
CHANGED
@@ -4,9 +4,7 @@
|
|
4
4
|
<img width="64" src="./logo.svg"/>
|
5
5
|
</p>
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
```lisp
|
7
|
+
````lisp
|
10
8
|
(let fizz-buzz (lambda n
|
11
9
|
(cond
|
12
10
|
(= (mod n 15) 0) "Fizz Buzz"
|
@@ -14,21 +12,39 @@
|
|
14
12
|
(= (mod n 5) 0) "Buzz"
|
15
13
|
(*) n)))
|
16
14
|
|
15
|
+
(|>
|
16
|
+
(math:range 1 100)
|
17
|
+
(array:map fizz-buzz)
|
18
|
+
(log!))
|
19
|
+
```
|
20
|
+
|
21
|
+
```lisp
|
22
|
+
(let Fizz (string char:F char:i char:z char:z))
|
23
|
+
(let Buzz (string char:B char:u char:z char:z))
|
24
|
+
(let FizzBuzz (string Fizz Buzz))
|
25
|
+
|
26
|
+
(let fizz-buzz (lambda n
|
27
|
+
(cond
|
28
|
+
(= (mod n 15) 0) FizzBuzz
|
29
|
+
(= (mod n 3) 0) Fizz
|
30
|
+
(= (mod n 5) 0) Buzz
|
31
|
+
(*) n)))
|
32
|
+
|
17
33
|
(|>
|
18
34
|
(math:range 1 100)
|
19
35
|
(array:map fizz-buzz)
|
20
36
|
(log!))
|
21
|
-
|
37
|
+
````
|
22
38
|
|
23
39
|
```lisp
|
24
40
|
; https://adventofcode.com/2020/day/1
|
25
41
|
(let *input*
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
42
|
+
(string
|
43
|
+
char:1 char:7 char:2 char:1 char:new-line
|
44
|
+
char:3 char:6 char:6 char:new-line
|
45
|
+
char:2 char:9 char:9 char:new-line
|
46
|
+
char:6 char:7 char:5 char:new-line
|
47
|
+
char:1 char:4 char:5 char:6))
|
32
48
|
; solve part 1
|
33
49
|
(let solve (lambda arr cb
|
34
50
|
(array:fold arr (lambda a b (do
|
@@ -37,8 +53,24 @@
|
|
37
53
|
())))
|
38
54
|
; 514579
|
39
55
|
(|> *input*
|
40
|
-
(string:
|
41
|
-
(cast:
|
56
|
+
(string:lines)
|
57
|
+
(array:map (lambda d (|> d (cast:chars->digits) (cast:digits->number))))
|
58
|
+
(array:sort (lambda a b (> a b)))
|
59
|
+
(solve (lambda x (- 2020 x)))
|
60
|
+
(math:product)
|
61
|
+
(log!))
|
62
|
+
```
|
63
|
+
|
64
|
+
```lisp
|
65
|
+
(let *input* "1721,979,366,299,675,1456")
|
66
|
+
(let solve (lambda arr cb
|
67
|
+
(array:fold arr (lambda a b (do
|
68
|
+
(let res (array:binary-search arr (cb b)))
|
69
|
+
(if res (cons a (array res)) a)))
|
70
|
+
())))
|
71
|
+
(|> *input*
|
72
|
+
(string:commas)
|
73
|
+
(array:map (lambda d (|> d (cast:chars->digits) (cast:digits->number))))
|
42
74
|
(array:sort (lambda a b (> a b)))
|
43
75
|
(solve (lambda x (- 2020 x)))
|
44
76
|
(math:product)
|
@@ -69,8 +101,8 @@
|
|
69
101
|
(array:map car))))
|
70
102
|
; tests
|
71
103
|
(assert
|
72
|
-
(case
|
73
|
-
(case
|
104
|
+
(case (unique (array 1)) (array 1))
|
105
|
+
(case (unique (array 1 2 2 4 5 9 5 12 14 1)) (array 1 2 4 5 9 12 14)))
|
74
106
|
```
|
75
107
|
|
76
108
|
Installation:
|
@@ -81,12 +113,12 @@ npm i fez-lisp
|
|
81
113
|
|
82
114
|
```js
|
83
115
|
import { fez } from 'fez-lisp'
|
84
|
-
fez(`(log! "Hello World!")
|
116
|
+
fez(`(log! "Hello World!")`, { strings: true }) // Hello World!
|
85
117
|
```
|
86
118
|
|
87
119
|
```js
|
88
120
|
import { fez } from 'fez-lisp'
|
89
|
-
fez(`(+ 1
|
121
|
+
fez(`(+ 1 (array 2))`) // Not all arguments of (+) are (number) (+ 1 (array 2))
|
90
122
|
```
|
91
123
|
|
92
124
|
```js
|
@@ -100,7 +132,7 @@ eval(
|
|
100
132
|
// include standard library
|
101
133
|
// compile fez to JavaScript
|
102
134
|
// tree shake standard library
|
103
|
-
{
|
135
|
+
{ compile: true }
|
104
136
|
)
|
105
137
|
)
|
106
138
|
```
|
@@ -108,15 +140,20 @@ eval(
|
|
108
140
|
```js
|
109
141
|
import { fez } from 'fez-lisp'
|
110
142
|
fez(
|
111
|
-
`
|
143
|
+
`
|
144
|
+
(let Fizz (string char:F char:i char:z char:z))
|
145
|
+
(let Buzz (string char:B char:u char:z char:z))
|
146
|
+
(let FizzBuzz (string Fizz Buzz))
|
147
|
+
|
148
|
+
(let fizz-buzz (lambda n
|
112
149
|
(cond
|
113
|
-
(= (mod n 15) 0)
|
114
|
-
(= (mod n 3) 0)
|
115
|
-
(= (mod n 5) 0)
|
150
|
+
(= (mod n 15) 0) FizzBuzz
|
151
|
+
(= (mod n 3) 0) Fizz
|
152
|
+
(= (mod n 5) 0) Buzz
|
116
153
|
(*) n)))
|
117
154
|
|
118
155
|
(|> (math:range 1 100) (array:map fizz-buzz) (log!))`,
|
119
|
-
{
|
156
|
+
{ compile: false }
|
120
157
|
)
|
121
158
|
```
|
122
159
|
|
@@ -124,8 +161,8 @@ Many logical operators
|
|
124
161
|
|
125
162
|
```lisp
|
126
163
|
(let logic-a (lambda a b
|
127
|
-
(if (or (= b -1) (> a b))
|
128
|
-
(if (and (> b 2) (< a 4))
|
164
|
+
(if (or (= b -1) (> a b)) char:a
|
165
|
+
(if (and (> b 2) (< a 4)) char:b char:c))))
|
129
166
|
|
130
167
|
; De Morgan's First Law: ¬(P ∧ Q) is equivalent to (¬P ∨ ¬Q)
|
131
168
|
; De Morgan's Second Law: ¬(P ∨ Q) is equivalent to (¬P ∧ ¬Q)
|
@@ -133,13 +170,13 @@ Many logical operators
|
|
133
170
|
; Swapping the consequent with the alternative in the condition by using (unless) instead of (if)
|
134
171
|
; The condition (or (= b -1) (> a b)) has been changed to (and (not (= b -1)) (not (> a b))), applying De Morgan's First Law.
|
135
172
|
; The condition (and (> b 2) (< a 4)) has been changed to (or (not (> b 2)) (not (< a 4))), applying De Morgan's Second Law.
|
136
|
-
(unless (and (not (= b -1)) (not (> a b)))
|
137
|
-
(unless (or (not (> b 2)) (not (< a 4)))
|
173
|
+
(unless (and (not (= b -1)) (not (> a b))) char:a
|
174
|
+
(unless (or (not (> b 2)) (not (< a 4))) char:b char:c))))
|
138
175
|
|
139
176
|
(assert
|
140
|
-
(case
|
141
|
-
(case
|
142
|
-
(case
|
177
|
+
(case (logic-a 0 -1) (logic-b 0 -1))
|
178
|
+
(case (logic-a 1 3) (logic-b 1 3))
|
179
|
+
(case (logic-a 1 2) (logic-b 1 2)))
|
143
180
|
```
|
144
181
|
|
145
182
|
Tail Call Optimization:
|
@@ -178,7 +215,6 @@ const source = `(|>
|
|
178
215
|
(math:summation)
|
179
216
|
(log!))`
|
180
217
|
fez(source, {
|
181
|
-
std: 1,
|
182
218
|
mutation: 1
|
183
219
|
})
|
184
220
|
```
|