Skip to content

Commit fae89bc

Browse files
committed
chapter 9: cleanups
1 parent 5ef5577 commit fae89bc

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

std.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package main
22

33
import (
44
"fmt"
5+
"io"
56
"os"
67
"slices"
78
"strings"
9+
"time"
810
)
911

1012
var (
@@ -17,6 +19,7 @@ var (
1719
"is": ExprFunc(stdIs),
1820
"list": ExprFunc(stdList),
1921
"vec": ExprFunc(stdVec),
22+
"vector": ExprFunc(stdVec),
2023
"count": ExprFunc(stdCount),
2124
"isEmpty": ExprFunc(stdIsEmpty),
2225
"cmp": ExprFunc(stdCmp),
@@ -50,6 +53,10 @@ var (
5053
"hashmapKeys": ExprFunc(stdHashmapKeys),
5154
"hashmapVals": ExprFunc(stdHashmapVals),
5255
"apply": ExprFunc(stdApply),
56+
"readLine": ExprFunc(stdReadLine),
57+
"quit": ExprFunc(stdQuit),
58+
"exit": ExprFunc(stdQuit),
59+
"time-ms": ExprFunc(stdTimeMs),
5360
}}
5461
)
5562

@@ -624,3 +631,34 @@ func stdApply(args []Expr) (Expr, error) {
624631

625632
return nil, fmt.Errorf("not callable: %s", str(true, args[0]))
626633
}
634+
635+
func stdReadLine(args []Expr) (Expr, error) {
636+
if err := checkArgsCount(1, 1, args); err != nil {
637+
return nil, err
638+
}
639+
prompt, err := checkIs[ExprStr](args[0])
640+
if err != nil {
641+
return nil, nil
642+
}
643+
os.Stdout.Write([]byte(prompt))
644+
input, err := readUntil(os.Stdin, '\n', 128)
645+
if err == io.EOF {
646+
return exprNil, nil
647+
} else if err != nil {
648+
return nil, err
649+
}
650+
return ExprStr(input), nil
651+
}
652+
653+
func stdQuit(args []Expr) (Expr, error) {
654+
var exit_code ExprNum
655+
if len(args) > 0 {
656+
exit_code, _ = args[0].(ExprNum)
657+
}
658+
os.Exit(int(exit_code))
659+
return exprNil, nil
660+
}
661+
662+
func stdTimeMs(args []Expr) (Expr, error) {
663+
return ExprNum(time.Now().UnixMilli()), nil
664+
}

util.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package main
2+
3+
import (
4+
"io"
5+
)
6+
7+
func readUntil(r io.Reader, until byte, initialBufCapacity int) (string, error) {
8+
buf := make([]byte, 0, initialBufCapacity)
9+
var b [1]byte
10+
for {
11+
_, err := r.Read(b[0:1])
12+
if err != nil {
13+
return "", err
14+
} else if b[0] == until {
15+
break
16+
} else {
17+
buf = append(buf, b[0])
18+
}
19+
}
20+
line := string(buf)
21+
return line, nil
22+
}

0 commit comments

Comments
 (0)