-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCorePrims.cls
More file actions
315 lines (255 loc) · 8.37 KB
/
CorePrims.cls
File metadata and controls
315 lines (255 loc) · 8.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
' Creole Forth for VB
' Version 0.01
' Copyright 2021 Joseph M. O'Connor
' This Source Code Form is subject to the terms of the Mozilla Public
' License, v. 2.0. If a copy of the MPL was not distributed with this
' file, You can obtain one at http://mozilla.org/MPL/2.0/.
Option Explicit
Dim lngReturnVal As Long
' ( -- ) Do-nothing primitive which is surprisingly useful
Function DoNOP(ByRef poGSP As GlobalSimpleProps)
DoNOP = 0
End Function
' ( n1 n2 -- sum ) Adds two numbers on the stack
Function DoPlus(ByRef poGSP As GlobalSimpleProps)
Dim dblVal1 As Double
Dim dblVal2 As Double
Dim dblSum As Double
Call poGSP.Pop(poGSP.DataStack)
dblVal1 = CDbl(poGSP.Scratch)
Call poGSP.Pop(poGSP.DataStack)
dblVal2 = CDbl(poGSP.Scratch)
dblSum = dblVal1 + dblVal2
poGSP.Scratch = dblSum
Call poGSP.Push(poGSP.DataStack)
DoPlus = 0
End Function
' ( n1 n2 -- difference ) Subtracts two numbers on the stack
Function DoMinus(ByRef poGSP As GlobalSimpleProps)
Dim dblVal1 As Double
Dim dblVal2 As Double
Dim dblDifference As Double
Call poGSP.Pop(poGSP.DataStack)
dblVal2 = CDbl(poGSP.Scratch)
Call poGSP.Pop(poGSP.DataStack)
dblVal1 = CDbl(poGSP.Scratch)
dblDifference = dblVal1 - dblVal2
poGSP.Scratch = dblDifference
Call poGSP.Push(poGSP.DataStack)
DoMinus = 0
End Function
' ( n1 n2 -- product ) Multiplies two numbers on the stack
Function DoMultiply(ByRef poGSP As GlobalSimpleProps)
Dim dblVal1 As Double
Dim dblVal2 As Double
Dim dblProduct As Double
Call poGSP.Pop(poGSP.DataStack)
dblVal1 = CDbl(poGSP.Scratch)
Call poGSP.Pop(poGSP.DataStack)
dblVal2 = CDbl(poGSP.Scratch)
dblProduct = dblVal1 * dblVal2
poGSP.Scratch = dblProduct
Call poGSP.Push(poGSP.DataStack)
DoMultiply = 0
End Function
' ( n1 n2 -- quotient ) Divides two numbers on the stack
Function DoDivide(ByRef poGSP As GlobalSimpleProps)
Dim dblVal1 As Double
Dim dblVal2 As Double
Dim dblQuotient As Double
Call poGSP.Pop(poGSP.DataStack)
dblVal2 = CDbl(poGSP.Scratch)
Call poGSP.Pop(poGSP.DataStack)
dblVal1 = CDbl(poGSP.Scratch)
dblQuotient = dblVal1 / dblVal2
poGSP.Scratch = dblQuotient
Call poGSP.Push(poGSP.DataStack)
DoDivide = 0
End Function
' ( n1 n2 -- remainder ) Returns remainder of division operation
Function DoMod(ByRef poGSP As GlobalSimpleProps)
Dim dblVal1 As Double
Dim dblVal2 As Double
Dim dblRemainder As Double
Call poGSP.Pop(poGSP.DataStack)
dblVal2 = CDbl(poGSP.Scratch)
Call poGSP.Pop(poGSP.DataStack)
dblVal1 = CDbl(poGSP.Scratch)
dblRemainder = dblVal1 Mod dblVal2
poGSP.Scratch = dblRemainder
Call poGSP.Push(poGSP.DataStack)
DoMod = 0
End Function
' ( val -- val val ) Duplicates the argument on top of the stack
Function DoDup(ByRef poGSP As GlobalSimpleProps)
Call poGSP.Pop(poGSP.DataStack)
Call poGSP.Push(poGSP.DataStack)
Call poGSP.Push(poGSP.DataStack)
DoDup = 0
End Function
' ( val1 val2 -- val2 val1 ) Swaps the positions of the top two stack arguments
Function DoSwap(ByRef poGSP As GlobalSimpleProps)
Dim val1 As Variant
Dim val2 As Variant
Call poGSP.Pop(poGSP.DataStack)
val2 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
val1 = poGSP.Scratch
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val2
Call poGSP.Push(poGSP.DataStack)
DoSwap = 0
End Function
' ( val1 val2 val3 -- val2 val3 val1 ) Moves the third stack argument to the top
Function DoRot(ByRef poGSP As GlobalSimpleProps)
Dim val1 As Variant
Dim val2 As Variant
Dim val3 As Variant
Call poGSP.Pop(poGSP.DataStack)
val3 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
val2 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
val1 = poGSP.Scratch
poGSP.Scratch = val2
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val3
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val1
Call poGSP.Push(poGSP.DataStack)
DoRot = 0
End Function
' ( val1 val2 val3 -- val3 val1 val2 ) Moves the top stack argument to the third position
Function DoMinusRot(ByRef poGSP As GlobalSimpleProps)
Dim val1 As Variant
Dim val2 As Variant
Dim val3 As Variant
Call poGSP.Pop(poGSP.DataStack)
val3 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
val2 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
val1 = poGSP.Scratch
poGSP.Scratch = val3
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val1
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val2
Call poGSP.Push(poGSP.DataStack)
DoMinusRot = 0
End Function
' ( val1 val2 -- val2 ) Removes second stack argument
Function DoNip(ByRef poGSP As GlobalSimpleProps)
Dim val1 As Variant
Call poGSP.Pop(poGSP.DataStack)
val1 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
poGSP.Scratch = val1
Call poGSP.Push(poGSP.DataStack)
DoNip = 0
End Function
' ( val1 val2 -- val2 val1 val2 ) Copies top stack argument under second argument
Function DoTuck(ByRef poGSP As GlobalSimpleProps)
Dim val1 As Variant
Dim val2 As Variant
Call poGSP.Pop(poGSP.DataStack)
val2 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
val1 = poGSP.Scratch
poGSP.Scratch = val2
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val1
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val2
Call poGSP.Push(poGSP.DataStack)
DoTuck = 0
End Function
' ( val1 val2 -- val1 val2 val1 ) Copies second stack argument to the top of the stack
Function DoOver(ByRef poGSP As GlobalSimpleProps)
Dim val1 As Variant
Dim val2 As Variant
Call poGSP.Pop(poGSP.DataStack)
val2 = poGSP.Scratch
Call poGSP.Pop(poGSP.DataStack)
val1 = poGSP.Scratch
poGSP.Scratch = val1
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val2
Call poGSP.Push(poGSP.DataStack)
poGSP.Scratch = val1
Call poGSP.Push(poGSP.DataStack)
DoOver = 0
End Function
' ( val -- ) Drops the argument at the top of the stack
Function DoDrop(ByRef poGSP As GlobalSimpleProps)
Call poGSP.Pop(poGSP.DataStack)
DoDrop = 0
End Function
' ( val -- ) Prints the argument at the top of the stack
Function DoDot(ByRef poGSP As GlobalSimpleProps)
Call poGSP.Pop(poGSP.DataStack)
MsgBox poGSP.Scratch
DoDot = 0
End Function
' ( -- ) Nondestructive data stack print - rightmost is tos
Function DoDotDataStack(ByVal poGSP As GlobalSimpleProps)
Dim lngNewAddress As Long
Dim cw As CreoleWord
Dim lngDoLitAddr As Long
Dim litVal As Variant
Dim i As Long
Dim sVals As String
For i = 0 To poGSP.DataStack.Count - 1
sVals = sVals & " " & poGSP.DataStack.Items(i)
Next i
Debug.Print sVals
DoDotDataStack = 0
End Function
' ( -- n ) Returns the stack depth
Function DoDepth(ByRef poGSP As GlobalSimpleProps)
poGSP.Scratch = poGSP.DataStack.Count
Call poGSP.Push(poGSP.DataStack)
DoDepth = 0
End Function
' ( -- ) Pops up a Hello message box
Function DoHello(ByRef poGSP As GlobalSimpleProps)
MsgBox "Hello"
DoHello = 0
End Function
' ( -- ) Pops up a Tulip message box
Function DoTulip(ByRef poGSP As GlobalSimpleProps)
MsgBox "Tulip"
DoTulip = 0
End Function
' ( msg -- ) Pops up an alert saying the message
Function DoMsgBox(ByRef poGSP As GlobalSimpleProps)
Call poGSP.Pop(poGSP.DataStack)
MsgBox CStr(poGSP.Scratch)
DoMsgBox = 0
End Function
' ( -- ) Pops up an alert saying the date and time
Function DoNow(ByRef poGSP As GlobalSimpleProps)
MsgBox Now
DoNow = 0
End Function
' ( -- ) Lists the dictionary definitions
Function DoVlist(ByRef poGSP As GlobalSimpleProps)
Dim i As Long
Dim j As Long
Dim sList As String
Dim sVals As String
For i = 0 To poGSP.cfb.address.Count - 1
sVals = ""
For j = 0 To poGSP.cfb.address.Items(i).ParamField.Count - 1
sVals = sVals & " " & poGSP.cfb.address.Items(i).ParamField.Items(j)
Next j
sVals = Trim(sVals)
Debug.Print poGSP.cfb.address.Items(i).NameField & "," & _
poGSP.cfb.address.Items(i).FQNameField & "," & _
poGSP.cfb.address.Items(i).Vocabulary & "," & _
poGSP.cfb.address.Items(i).CompileActionField & "," & _
poGSP.cfb.address.Items(i).IndexField & "," & _
sVals
Next i
DoVlist = 0
End Function