Skip to content

Commit f0b0a40

Browse files
committed
add missing important features.
1 parent e7cb925 commit f0b0a40

File tree

1 file changed

+69
-1
lines changed

1 file changed

+69
-1
lines changed

ops.go

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func init() {
4040
ops["dotimes"] = makeFn(FtSpecial, doDotimes)
4141
ops["prin1"] = makeFn(FtBuiltin, doPrin1)
4242
ops["print"] = makeFn(FtBuiltin, doPrint)
43+
ops["princ"] = makeFn(FtBuiltin, doPrinc)
4344
ops["let"] = makeFn(FtSpecial, doLet)
4445
ops["let*"] = makeFn(FtSpecial, doLetStar)
4546
ops["setq"] = makeFn(FtSpecial, doSetq)
@@ -68,6 +69,8 @@ func init() {
6869
ops["apply"] = makeFn(FtBuiltin, doApply)
6970
ops["concatenate"] = makeFn(FtBuiltin, doConcatenate)
7071
ops["defun"] = makeFn(FtSpecial, doDefun)
72+
ops["float"] = makeFn(FtBuiltin, doFloat)
73+
ops["while"] = makeFn(FtSpecial, doWhile)
7174
ops["quote"] = makeFn(FtSpecial, doQuote)
7275
ops["getenv"] = makeFn(FtBuiltin, doGetenv)
7376
ops["length"] = makeFn(FtBuiltin, doLength)
@@ -411,7 +414,7 @@ func doPrin1(env *Env, node *Node) (*Node, error) {
411414
if node.car.t == NodeNil {
412415
fmt.Fprint(env.out, "nil")
413416
} else {
414-
fmt.Fprint(env.out, node.car.v)
417+
fmt.Fprintln(env.out, node.car.v)
415418
}
416419
return node.car, nil
417420
}
@@ -434,6 +437,24 @@ func doPrint(env *Env, node *Node) (*Node, error) {
434437
return node.car, nil
435438
}
436439

440+
func doPrinc(env *Env, node *Node) (*Node, error) {
441+
if node.car == nil {
442+
return nil, errors.New("invalid arguments for print")
443+
}
444+
if node.car.t == NodeNil {
445+
fmt.Fprint(env.out, "nil")
446+
} else if node.car.t == NodeT {
447+
fmt.Fprint(env.out, "t")
448+
} else if node.car.t == NodeQuote {
449+
fmt.Fprint(env.out, node.car)
450+
} else if node.car.t == NodeCell {
451+
fmt.Fprint(env.out, node.car)
452+
} else {
453+
fmt.Fprint(env.out, node.car.v)
454+
}
455+
return node.car, nil
456+
}
457+
437458
func doDotimes(env *Env, node *Node) (*Node, error) {
438459
var err error
439460

@@ -1390,6 +1411,53 @@ func doConcatenate(env *Env, node *Node) (*Node, error) {
13901411
}, nil
13911412
}
13921413

1414+
func doFloat(env *Env, node *Node) (*Node, error) {
1415+
if node.car == nil {
1416+
return nil, errors.New("invalid arguments for float")
1417+
}
1418+
var ret float64
1419+
switch node.car.t {
1420+
case NodeInt:
1421+
ret = float64(node.car.v.(int64))
1422+
case NodeDouble:
1423+
ret = node.car.v.(float64)
1424+
default:
1425+
return nil, errors.New("invalid arguments for float")
1426+
}
1427+
1428+
return &Node{
1429+
t: NodeDouble,
1430+
v: ret,
1431+
}, nil
1432+
}
1433+
1434+
func doWhile(env *Env, node *Node) (*Node, error) {
1435+
if node.car == nil {
1436+
return nil, errors.New("invalid arguments for while")
1437+
}
1438+
1439+
scope := NewEnv(env)
1440+
1441+
for {
1442+
ret, err := eval(env, node.car)
1443+
if err != nil {
1444+
return nil, err
1445+
}
1446+
if ret.t != NodeT {
1447+
break
1448+
}
1449+
ret, err = doProgn(scope, node)
1450+
if err != nil {
1451+
return nil, err
1452+
}
1453+
}
1454+
1455+
return &Node{
1456+
t: NodeNil,
1457+
v: nil,
1458+
}, nil
1459+
}
1460+
13931461
func doDefun(env *Env, node *Node) (*Node, error) {
13941462
v := &Node{
13951463
t: NodeEnv,

0 commit comments

Comments
 (0)