Skip to content

Commit 7c595f5

Browse files
committed
auto update
1 parent ca16ecc commit 7c595f5

6 files changed

Lines changed: 210 additions & 3 deletions

File tree

bin/commit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#!bash
1+
22

33
git add .
44
git commit -m "auto update"

demo

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,13 @@ let (x = 10) {
9595
};
9696

9797
fib = λ(n) if n < 2 then n else fib(n - 1) + fib(n - 2);
98-
println(fib(22))
98+
println(fib(22));
99+
100+
copyFile = lambda(source, dest){
101+
writeFile(dest, readFile(source))
102+
};
103+
copyFile("demo", "demo2");
104+
105+
106+
println(1 + twice(2, 3));
107+

demo2

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# ref: http://lisperator.net/pltut/eval1/play
2+
3+
print_range = λ(a, b) if a <= b {
4+
println(a);
5+
if a + 1 <= b {
6+
print_range(a + 1, b);
7+
}
8+
else
9+
println("");
10+
};
11+
print_range(1, 10);
12+
13+
cons = λ(a, b) λ(f) f(a, b);
14+
car = λ(cell) cell(λ(a, b) a);
15+
cdr = λ(cell) cell(λ(a, b) b);
16+
NIL = λ(f) f(NIL, NIL);
17+
18+
x = cons(1, cons(2, cons(3, cons(4, cons(5, NIL)))));
19+
println(car(x)); # 1
20+
println(car(cdr(x))); # 2
21+
println(car(cdr(cdr(x)))); # 3
22+
println(car(cdr(cdr(cdr(x))))); # 4
23+
println(car(cdr(cdr(cdr(cdr(x)))))); # 5
24+
25+
26+
# code = fs-readFileSync("./demo");
27+
# println(code);
28+
# println(os-arch());
29+
30+
add = lambda(a, b){
31+
1;
32+
# return the last expression
33+
a + b
34+
};
35+
println(add(100, 133));
36+
37+
foreach = λ(list, f)
38+
if list != NIL {
39+
f(car(list));
40+
foreach(cdr(list), f);
41+
};
42+
foreach(x, println);
43+
44+
range = λ(a, b)
45+
if a <= b then cons(a, range(a + 1, b))
46+
else NIL;
47+
48+
# print the squares of 1..8
49+
foreach(range(1, 8), λ(x) println(x * x));
50+
51+
52+
cons = λ(x, y)
53+
λ(a, i, v)
54+
if a == "get"
55+
then if i == 0 then x else y
56+
else if i == 0 then x = v else y = v;
57+
58+
car = λ(cell) cell("get", 0);
59+
cdr = λ(cell) cell("get", 1);
60+
set-car! = λ(cell, val) cell("set", 0, val);
61+
set-cdr! = λ(cell, val) cell("set", 1, val);
62+
63+
# NIL can be a real cons this time
64+
NIL = cons(0, 0);
65+
set-car!(NIL, NIL);
66+
set-cdr!(NIL, NIL);
67+
68+
## test:
69+
x = cons(1, 2);
70+
println(car(x));
71+
println(cdr(x));
72+
set-car!(x, 10);
73+
set-cdr!(x, 20);
74+
println(car(x));
75+
println(cdr(x));
76+
77+
78+
## IIFE
79+
println(let loop (n = 100)
80+
if n > 0 then n + loop(n - 1)
81+
else 0);
82+
83+
let (x = 2, y = x + 1, z = x + y)
84+
println(x + y + z);
85+
86+
# errors out, the vars are bound to the let body
87+
# print(x + y + z);
88+
89+
let (x = 10) {
90+
let (x = x * 2, y = x * x) {
91+
println(x); ## 20
92+
println(y); ## 400
93+
};
94+
println(x); ## 10
95+
};
96+
97+
fib = λ(n) if n < 2 then n else fib(n - 1) + fib(n - 2);
98+
println(fib(22));
99+
100+
copyFile = lambda(source, dest){
101+
writeFile(dest, readFile(source))
102+
};
103+
copyFile("demo", "demo2");
104+
105+
106+
println(1 + twice(2, 3));
107+

index.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ let InputStream = require('./src/InputStream')
44
let TokenStream = require('./src/TokenStream')
55
let parser = require('./src/parser')
66
let Environment = require('./src/Environment')
7+
let Execute = Environment.Execute
8+
let evalute = Environment.evalute
79

810
const fs = require('fs')
911
const util = require('util')
@@ -18,4 +20,33 @@ globalEnv.def('println', (callack, value) => {
1820
callack(false)
1921
})
2022

23+
globalEnv.def('sleep', (k, millisenconds) => {
24+
setTimeout(() => {
25+
Execute(k, [false])
26+
}, millisenconds)
27+
})
28+
29+
globalEnv.def('halt', (k) => {})
30+
31+
globalEnv.def("readFile", function (k, filename) {
32+
fs.readFile(filename, function (err, data) {
33+
// error handling is a bit more complex, ignoring for now
34+
Execute(k, [data]); // hope it's clear why we need the Execute
35+
})
36+
})
37+
38+
globalEnv.def("writeFile", function (k, filename, data) {
39+
fs.writeFile(filename, data, function (err) {
40+
Execute(k, [false]);
41+
})
42+
})
43+
44+
globalEnv.def("twice", function (k, a, b) {
45+
console.log('1!!!!!', a)
46+
k(a)
47+
console.log('2!!!!!', b)
48+
k(b)
49+
})
50+
51+
2152
module.exports = globalEnv

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "implement-a-pl",
3-
"version": "0.2.0",
3+
"version": "0.2.1",
44
"description": "compiler",
55
"main": "index.js",
66
"scripts": {

src/codeGen.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
function makejs(expr) {
2+
return js(expr)
3+
4+
function js(expr) {
5+
switch (expr.type) {
6+
case 'num':
7+
case 'str':
8+
case 'bool':
9+
return jsAtom(expr)
10+
case 'var':
11+
return jsVar(expr)
12+
case 'binary':
13+
return jsBinary(expr)
14+
case 'assign':
15+
return jsAssign(expr)
16+
case 'let':
17+
return jsLet(expr)
18+
case 'lambda':
19+
return jsLambda(expr)
20+
case 'if':
21+
return jsIf(expr)
22+
case 'prog':
23+
return jsProg(expr)
24+
case 'call':
25+
return jsCall(expr)
26+
default:
27+
throw new SyntaxError('cannot make js for ', JSON.stringify(expr))
28+
}
29+
}
30+
31+
function jsAtom(expr){
32+
return JSON.stringify(expr.value)
33+
}
34+
35+
function makeVar(name){
36+
return name
37+
}
38+
39+
function jsVar(expr){
40+
return makeVar(expr.value)
41+
}
42+
43+
function jsBinary(expr){
44+
return '(' + js(expr.left) + expr.operator + js(expr.right) + ')'
45+
}
46+
47+
function jsAssign(expr){
48+
return jsBinary(expr)
49+
}
50+
51+
function jsLambda(expr){
52+
let code = '(function '
53+
if(expr.name){
54+
code += makeVar(expr.name)
55+
}
56+
code += '(' + expr.vars.map(makeVar).join(', ') + ') {'
57+
code += 'return ' + js(expr.body) + '})'
58+
return code
59+
}
60+
}

0 commit comments

Comments
 (0)