From 87f8a85a878c0cc0226cd57ff8ee32677c95c1b4 Mon Sep 17 00:00:00 2001 From: Yutaka Ichibangase Date: Wed, 12 Jun 2024 21:53:17 +0900 Subject: [PATCH] fix variable's WriteTerm() when following/followed by a letter-digit operator. --- engine/variable.go | 16 +++++++++++++--- engine/variable_test.go | 2 ++ interpreter_test.go | 3 +++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/engine/variable.go b/engine/variable.go index 994289c7..a93380ed 100644 --- a/engine/variable.go +++ b/engine/variable.go @@ -28,11 +28,21 @@ func (v Variable) WriteTerm(w io.Writer, opts *WriteOptions, env *Env) error { return x.WriteTerm(w, opts, env) } + ew := errWriter{w: w} + + if letterDigit(opts.left.name) { + _, _ = ew.Write([]byte(" ")) + } if a, ok := opts.variableNames[v]; ok { - return a.WriteTerm(w, opts.withQuoted(false).withLeft(operator{}).withRight(operator{}), env) + _ = a.WriteTerm(&ew, opts.withQuoted(false).withLeft(operator{}).withRight(operator{}), env) + } else { + _, _ = ew.Write([]byte(fmt.Sprintf("_%d", v))) } - _, err := w.Write([]byte(fmt.Sprintf("_%d", v))) - return err + if letterDigit(opts.right.name) { + _, _ = ew.Write([]byte(" ")) + } + + return ew.err } func (v Variable) Compare(t Term, env *Env) int { diff --git a/engine/variable_test.go b/engine/variable_test.go index 3692d40f..90ca997c 100644 --- a/engine/variable_test.go +++ b/engine/variable_test.go @@ -21,6 +21,8 @@ func TestVariable_WriteTerm(t *testing.T) { }{ {title: "unnamed", v: x, output: fmt.Sprintf("_%d", x)}, {title: "variable_names", v: x, opts: WriteOptions{variableNames: map[Variable]Atom{x: NewAtom("Foo")}}, output: `Foo`}, + {title: "following a letter-digit operator", v: x, opts: WriteOptions{left: operator{name: NewAtom("is")}}, output: fmt.Sprintf(" _%d", x)}, + {title: "followed by a letter-digit operator", v: x, opts: WriteOptions{right: operator{name: NewAtom("is")}}, output: fmt.Sprintf("_%d ", x)}, } var buf bytes.Buffer diff --git a/interpreter_test.go b/interpreter_test.go index 0784ba79..a820e584 100644 --- a/interpreter_test.go +++ b/interpreter_test.go @@ -308,8 +308,11 @@ func TestNew_variableNames(t *testing.T) { {name: "55", query: `S=1+T,N=' /*r*/V',write_term(S,[quoted(true), variable_names([N=T])]).`, output: `1+ /*r*/V`}, {name: "58", query: `S=1+T,N=(+),write_term(S,[quoted(true), variable_names([N=T])]).`, output: `1++`}, {name: "59", query: `S=T+1,N=(+),write_term(S,[quoted(true), variable_names([N=T])]).`, output: `++1`}, + {name: "73", query: `S=(1 is T),N='X',write_term(S,[quoted(true), variable_names([N=T])]).`, output: `1 is X`}, {name: "69", query: `read_term(T, [singletons(1)]).`, waits: true}, {name: "70", input: `a.`, query: `\+read_term(T, [singletons(1)]).`}, + {name: "71", query: `write_term(T,[variable_names(['Bad'=T]),variable_names(['Good'=T])]).`, output: `Good`}, + {name: "72", query: `read_term(T,[singletons([])]).`, waits: true}, } for _, tt := range tests {