Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
259 changes: 0 additions & 259 deletions bootstrap.pl

This file was deleted.

18 changes: 0 additions & 18 deletions cmd/1pl/interpreter.go

This file was deleted.

14 changes: 0 additions & 14 deletions cmd/1pl/interpreter_test.go

This file was deleted.

45 changes: 38 additions & 7 deletions cmd/1pl/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,23 +68,54 @@ Type Ctrl-C or 'halt.' to exit.

log.SetOutput(t)

i := New(&userInput{t: t}, t)
i.Register1(engine.NewAtom("halt"), halt)
i := prolog.New(&userInput{t: t}, t)
if err := i.QuerySolution(`use_module(library(prologue)).`).Err(); err != nil {
log.Panic(err)
}
i.SetPredicate1("cd", func(vm *engine.VM, path engine.Term, k engine.Cont, env *engine.Env) *engine.Promise {
var p string
switch path := env.Resolve(path).(type) {
case engine.Variable:
return engine.Error(engine.InstantiationError(env))
case engine.Atom:
p = path.String()
default:
return engine.Error(engine.TypeError(engine.NewAtom("atom"), path, env))
}
if err := os.Chdir(p); err != nil {
return engine.Error(err)
}
return k(env)
})
i.SetPredicate4("skip_max_list", engine.SkipMaxList)
i.SetPredicate2("go_string", func(vm *engine.VM, term, s engine.Term, k engine.Cont, env *engine.Env) *engine.Promise {
return engine.Unify(vm, s, engine.NewAtom(fmt.Sprintf("%#v", term)), k, env)
})
i.SetPredicate1("halt", halt)
i.Unknown = func(name engine.Atom, args []engine.Term, env *engine.Env) {
var sb strings.Builder
s := engine.NewOutputTextStream(&sb)
_, _ = engine.WriteTerm(&i.VM, s, name.Apply(args...), engine.List(engine.NewAtom("quoted").Apply(engine.NewAtom("true"))), engine.Success, env).Force(context.Background())
log.Printf("UNKNOWN %s", &sb)
}

// Consult arguments.
if err := i.QuerySolution(`findall(F, (member(X, ?), atom_chars(F, X)), Fs), consult(Fs).`, flag.Args()).Err(); err != nil {
log.Panic(err)
}

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()

for _, arg := range flag.Args() {
f, err := os.Open(arg)
if err != nil {
log.Panicf("open file error: %v", err)
}
b, err := io.ReadAll(f)
if err != nil {
log.Panicf("read file error: %v", err)
}
if err := i.LoadText(ctx, string(b)); err != nil {
log.Panicf("load text error: %v", err)
}
}

var buf strings.Builder
keys := bufio.NewReader(os.Stdin)
for {
Expand Down
Loading