<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/walk
diff options
context:
space:
mode:
authorCharlie Stanton <charlie@shtanton.xyz>2023-04-19 14:13:32 +0100
committerCharlie Stanton <charlie@shtanton.xyz>2023-04-19 14:13:32 +0100
commit5089fe689f17a3489b6be76588b8fc7f93d70e55 (patch)
treee3b6a09634deab4e46d832396ac7bd54704480b0 /walk
parentca161b26e9b6a253837e5ec4e0cf318bd0ee7903 (diff)
downloadstred-go-5089fe689f17a3489b6be76588b8fc7f93d70e55.tar
Adds a dummy method to atom so the compiler checks that only valid atoms are allowed
Diffstat (limited to 'walk')
-rw-r--r--walk/walk.go26
1 files changed, 21 insertions, 5 deletions
diff --git a/walk/walk.go b/walk/walk.go
index 36e9805..64f16ac 100644
--- a/walk/walk.go
+++ b/walk/walk.go
@@ -34,6 +34,7 @@ func (value TerminalValue) String() string {
panic("Unknown TerminalValue")
}
}
+func (value TerminalValue) atomness() {}
type ValueNull struct {}
func (value ValueNull) Pieces(out chan<- Atom) {
@@ -42,6 +43,8 @@ func (value ValueNull) Pieces(out chan<- Atom) {
func (value ValueNull) String() string {
return "null"
}
+func (value ValueNull) atomness() {}
+
type ValueBool bool
func (value ValueBool) Pieces(out chan<- Atom) {
out<-value
@@ -53,6 +56,8 @@ func (value ValueBool) String() string {
return "false"
}
}
+func (value ValueBool) atomness() {}
+
type ValueNumber float64
func (value ValueNumber) Pieces(out chan<- Atom) {
out<-value
@@ -61,14 +66,22 @@ func (value ValueNumber) String() string {
v := float64(value)
return fmt.Sprintf("%f", v)
}
+func (value ValueNumber) atomness() {}
type StartString struct {}
+func (value StartString) atomness() {}
+
type EndString struct {}
+func (value EndString) atomness() {}
+
+type StringAtom rune
+func (value StringAtom) atomness() {}
+
type ValueString string
func (value ValueString) Pieces(out chan<- Atom) {
out<-StartString{}
for _, char := range value {
- out<-char
+ out<-StringAtom(char)
}
out<-EndString{}
}
@@ -76,7 +89,10 @@ func (value ValueString) String() string {
return fmt.Sprintf("\"%s\"", string(value))
}
-type Atom interface {}
+type Atom interface {
+ // Something so the compiler will check that only certain types are being cast into Atoms
+ atomness()
+}
type WalkValue interface {
Pieces(out chan<- Atom)
@@ -458,7 +474,7 @@ func Compound(in <-chan Atom) <-chan CompoundResult {
case ValueNumber:
out<-CompoundResult{v, nil}
continue
- case rune:
+ case StringAtom:
out<-CompoundResult{nil, CompoundRuneOutsideString}
break outer
case EndString:
@@ -480,8 +496,8 @@ func Compound(in <-chan Atom) <-chan CompoundResult {
switch v := atom.(type) {
case EndString:
break loop
- case rune:
- builder.WriteRune(v)
+ case StringAtom:
+ builder.WriteRune(rune(v))
default:
out<-CompoundResult{nil, CompoundInvalidStringAtom}
break outer