Looks pretty much the same in VB6:
mdlStackMachine
Code:
Option Explicit
Private Type Point
X As Double
Y As Double
End Type
Private Sub Main()
Dim pt1 As Point, pt2 As Point
pt1.X = 1: pt1.Y = 1: pt2.X = 4: pt2.Y = 5
Debug.Print CalcDist(pt1, pt2), Sqr((pt2.X - pt1.X) ^ 2 + (pt2.Y - pt1.Y) ^ 2)
End Sub
Private Function CalcDist(pt1 As Point, pt2 As Point) As Double
Dim Ops As New Collection
With Ops
.Add NewOp(OP_PUSH, pt2.X)
.Add NewOp(OP_PUSH, pt1.X)
.Add NewOp(OP_SUB)
.Add NewOp(OP_PUSH, 2)
.Add NewOp(OP_POW)
.Add NewOp(OP_PUSH, pt2.Y)
.Add NewOp(OP_PUSH, pt1.Y)
.Add NewOp(OP_SUB)
.Add NewOp(OP_PUSH, 2)
.Add NewOp(OP_POW)
.Add NewOp(OP_ADD)
.Add NewOp(OP_SQR)
End With
With New cStackMachine
.ExecuteProgram Ops: CalcDist = .OpPop
End With
End Function
Private Function NewOp(OP As OP_LIST, Optional Operand As Double) As cOP
With New cOP
Set NewOp = .This(OP, Operand)
End With
End Function
cStackMachine
Code:
Option Explicit
Private m_Stack As Collection
Friend Sub ExecuteProgram(Program As Collection)
Dim OP As cOP
For Each OP In Program: OP.Execute Me: Next OP
End Sub
Friend Sub OpPush(Operand As Double)
m_Stack.Add Operand
End Sub
Friend Function OpPop() As Double
OpPop = m_Stack(m_Stack.Count): m_Stack.Remove m_Stack.Count
End Function
Friend Sub OpSqr()
OpPush Sqr(OpPop)
End Sub
Friend Sub OpAdd()
OpPush OpPop + OpPop
End Sub
Friend Sub OpSub()
OpPush -(OpPop - OpPop)
End Sub
Friend Sub OpDiv()
OpPush 1 / OpPop * OpPop
End Sub
Friend Sub OpMul()
OpPush OpPop * OpPop
End Sub
Friend Sub OpPow()
Dim Exponent As Double
Exponent = OpPop: OpPush OpPop ^ Exponent
End Sub
Private Sub Class_Initialize()
Set m_Stack = New Collection
End Sub
cOP
Code:
Option Explicit
Public Enum OP_LIST
OP_PUSH
OP_POP
OP_SQR
OP_ADD
OP_SUB
OP_DIV
OP_MUL
OP_POW
End Enum
Private m_OP As OP_LIST, m_Operand As Double
Friend Sub Execute(StackMachine As cStackMachine)
With StackMachine
Select Case m_OP
Case OP_PUSH: .OpPush m_Operand
Case OP_POP: .OpPop
Case OP_SQR: .OpSqr
Case OP_ADD: .OpAdd
Case OP_SUB: .OpSub
Case OP_DIV: .OpDiv
Case OP_MUL: .OpMul
Case OP_POW: .OpPow
End Select
End With
End Sub
Friend Function This(OP As OP_LIST, Optional Operand As Double) As cOP
m_OP = OP: m_Operand = Operand: Set This = Me
End Function