feat: cli versions
This commit is contained in:
@@ -1,12 +1,8 @@
|
||||
package codec
|
||||
|
||||
import "git.maximhutz.com/max/lambda/pkg/repr"
|
||||
|
||||
type String string
|
||||
|
||||
func (s String) Id() string { return "string" }
|
||||
|
||||
type Codec[T, U repr.Repr] interface {
|
||||
type Codec[T, U any] interface {
|
||||
Encode(T) (U, error)
|
||||
Decode(U) (T, error)
|
||||
}
|
||||
|
||||
type Marshaler[T any] = Codec[T, string]
|
||||
|
||||
7
pkg/engine/engine.go
Normal file
7
pkg/engine/engine.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package engine
|
||||
|
||||
type Engine[T any] interface {
|
||||
Get() (T, error)
|
||||
Set(T) error
|
||||
Step(int) bool
|
||||
}
|
||||
@@ -3,14 +3,12 @@ package lambda
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.maximhutz.com/max/lambda/pkg/repr"
|
||||
"git.maximhutz.com/max/lambda/pkg/set"
|
||||
)
|
||||
|
||||
// Expression is the interface for all lambda calculus expression types.
|
||||
// It embeds the general expr.Expression interface for cross-mode compatibility.
|
||||
type Expression interface {
|
||||
repr.Repr
|
||||
fmt.Stringer
|
||||
|
||||
// Substitute replaces all free occurrences of the target variable with the
|
||||
@@ -40,8 +38,6 @@ type Abstraction struct {
|
||||
|
||||
var _ Expression = Abstraction{}
|
||||
|
||||
func (a Abstraction) Id() string { return "lambda" }
|
||||
|
||||
func (a Abstraction) Parameter() string {
|
||||
return a.parameter
|
||||
}
|
||||
@@ -67,8 +63,6 @@ type Application struct {
|
||||
|
||||
var _ Expression = Application{}
|
||||
|
||||
func (a Application) Id() string { return "lambda" }
|
||||
|
||||
func (a Application) Abstraction() Expression {
|
||||
return a.abstraction
|
||||
}
|
||||
@@ -93,8 +87,6 @@ type Variable struct {
|
||||
|
||||
var _ Expression = Variable{}
|
||||
|
||||
func (a Variable) Id() string { return "lambda" }
|
||||
|
||||
func (v Variable) Name() string {
|
||||
return v.name
|
||||
}
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
package normalorder
|
||||
|
||||
import "git.maximhutz.com/max/lambda/pkg/lambda"
|
||||
|
||||
func ReduceOnce(e lambda.Expression) (lambda.Expression, bool) {
|
||||
switch e := e.(type) {
|
||||
case lambda.Abstraction:
|
||||
body, reduced := ReduceOnce(e.Body())
|
||||
if reduced {
|
||||
return lambda.NewAbstraction(e.Parameter(), body), true
|
||||
}
|
||||
return e, false
|
||||
|
||||
case lambda.Application:
|
||||
if fn, fnOk := e.Abstraction().(lambda.Abstraction); fnOk {
|
||||
return fn.Body().Substitute(fn.Parameter(), e.Argument()), true
|
||||
}
|
||||
|
||||
abs, reduced := ReduceOnce(e.Abstraction())
|
||||
if reduced {
|
||||
return lambda.NewApplication(abs, e.Argument()), true
|
||||
}
|
||||
|
||||
arg, reduced := ReduceOnce(e.Argument())
|
||||
if reduced {
|
||||
return lambda.NewApplication(e.Abstraction(), arg), true
|
||||
}
|
||||
|
||||
return e, false
|
||||
|
||||
default:
|
||||
return e, false
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
package normalorder
|
||||
|
||||
import (
|
||||
"git.maximhutz.com/max/lambda/pkg/emitter"
|
||||
"git.maximhutz.com/max/lambda/pkg/lambda"
|
||||
"git.maximhutz.com/max/lambda/pkg/repr"
|
||||
"git.maximhutz.com/max/lambda/pkg/runtime"
|
||||
)
|
||||
|
||||
// NormalOrderReducer implements normal order (leftmost-outermost) reduction
|
||||
// for lambda calculus expressions.
|
||||
type Runtime struct {
|
||||
emitter.BaseEmitter[runtime.Event]
|
||||
expression lambda.Expression
|
||||
}
|
||||
|
||||
// NewNormalOrderReducer creates a new normal order reducer.
|
||||
func NewRuntime(expression lambda.Expression) *Runtime {
|
||||
return &Runtime{
|
||||
BaseEmitter: *emitter.New[runtime.Event](),
|
||||
expression: expression,
|
||||
}
|
||||
}
|
||||
|
||||
// Expression returns the current expression state.
|
||||
func (r *Runtime) Expression() repr.Repr {
|
||||
return r.expression
|
||||
}
|
||||
|
||||
func (r *Runtime) Step() bool {
|
||||
result, done := ReduceOnce(r.expression)
|
||||
r.expression = result
|
||||
return !done
|
||||
}
|
||||
|
||||
// Reduce performs normal order reduction on a lambda expression.
|
||||
// The expression must be a lambda.Expression; other types are returned unchanged.
|
||||
func (r *Runtime) Run() {
|
||||
r.Emit(runtime.StartEvent)
|
||||
|
||||
for !r.Step() {
|
||||
r.Emit(runtime.StepEvent)
|
||||
}
|
||||
|
||||
r.Emit(runtime.StopEvent)
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
// Package repr defines a general definition of a representation of lambda
|
||||
// calculus.
|
||||
package repr
|
||||
|
||||
import "fmt"
|
||||
|
||||
// Repr is a representation of lambda calculus.
|
||||
type Repr interface {
|
||||
fmt.Stringer
|
||||
|
||||
// Id returns to name of the objects underlying representation. If is
|
||||
// assumed that if two Repr objects have the same Id(), they share the same
|
||||
// representation.
|
||||
Id() string
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package runtime
|
||||
|
||||
// Event represents lifecycle events during interpretation.
|
||||
type Event int
|
||||
|
||||
const (
|
||||
// StartEvent is emitted before interpretation begins.
|
||||
StartEvent Event = iota
|
||||
// StepEvent is emitted after each interpretation step.
|
||||
StepEvent
|
||||
// StopEvent is emitted after interpretation completes.
|
||||
StopEvent
|
||||
)
|
||||
@@ -1,27 +0,0 @@
|
||||
// Package runtime provides the abstract Reducer interface for all expression
|
||||
// reduction strategies.
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"git.maximhutz.com/max/lambda/pkg/emitter"
|
||||
"git.maximhutz.com/max/lambda/pkg/repr"
|
||||
)
|
||||
|
||||
// Runtime defines the interface for expression reduction strategies.
|
||||
// Different evaluation modes (normal order, applicative order, SKI combinators,
|
||||
// etc.) implement this interface with their own reduction logic.
|
||||
//
|
||||
// Runtimes also implement the Emitter interface to allow plugins to observe
|
||||
// reduction lifecycle events (Start, Step, Stop).
|
||||
type Runtime interface {
|
||||
emitter.Emitter[Event]
|
||||
|
||||
// Run a single step. Returns whether the runtime is complete or not.
|
||||
Step() bool
|
||||
|
||||
// Run until completion.
|
||||
Run()
|
||||
|
||||
// Copy the state of the runtime.
|
||||
Expression() repr.Repr
|
||||
}
|
||||
Reference in New Issue
Block a user