fez-lisp 1.0.54 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
```
|