@@ -75,6 +75,26 @@ fn impl_prim_inverse(prim: ImplPrimitive, span: usize) -> Option<Instr> {
75
75
} )
76
76
}
77
77
78
+ macro_rules! pat {
79
+ ( ( $( $matching: expr) ,* ) , ( $( $before: expr) ,* ) $( , ( $( $after: expr) ,* ) ) ? $( , ) ?) => {
80
+ (
81
+ [ $( $matching, ) * ] ,
82
+ [ $( box_as_instr( $before) ) ,* ] ,
83
+ $( [ $( box_as_instr( $after) ) ,* ] , ) ?
84
+ )
85
+ } ;
86
+ ( $matching: expr, ( $( $before: expr) ,* ) $( , ( $( $after: expr) ,* ) ) ? $( , ) ?) => {
87
+ (
88
+ [ $matching] ,
89
+ [ $( box_as_instr( $before) ) ,* ] ,
90
+ $( [ $( box_as_instr( $after) ) ,* ] , ) ?
91
+ )
92
+ } ;
93
+ ( $matching: expr, $before: expr $( , ( $( $after: expr) ,* ) ) ? $( , ) ?) => {
94
+ pat!( $matching, ( $before) $( , ( $( $after) ,* ) ) ?)
95
+ } ;
96
+ }
97
+
78
98
pub ( crate ) fn invert_instrs ( instrs : & [ Instr ] ) -> Option < Vec < Instr > > {
79
99
if instrs. is_empty ( ) {
80
100
return Some ( Vec :: new ( ) ) ;
@@ -120,16 +140,16 @@ fn invert_instr_impl(mut instrs: &[Instr]) -> Option<Vec<Instr>> {
120
140
& invert_invert_pattern,
121
141
& ( Val , ( [ Rotate ] , [ Neg , Rotate ] ) ) ,
122
142
& ( [ Rotate ] , [ Neg , Rotate ] ) ,
123
- & ( [ Sqrt ] , [ 2 . i ( ) , Pow . i ( ) ] ) ,
143
+ & pat ! ( Sqrt , ( 2 , Pow ) ) ,
124
144
& ( Val , IgnoreMany ( Flip ) , ( [ Add ] , [ Sub ] ) ) ,
125
145
& ( Val , ( [ Sub ] , [ Add ] ) ) ,
126
146
& ( Val , ( [ Flip , Sub ] , [ Flip , Sub ] ) ) ,
127
147
& ( Val , IgnoreMany ( Flip ) , ( [ Mul ] , [ Div ] ) ) ,
128
148
& ( Val , ( [ Div ] , [ Mul ] ) ) ,
129
149
& ( Val , ( [ Flip , Div ] , [ Flip , Div ] ) ) ,
130
- & ( [ Dup , Add ] , [ 2 . i ( ) , Div . i ( ) ] ) ,
150
+ & pat ! ( ( Dup , Add ) , ( 2 , Div ) ) ,
131
151
& ( [ Dup , Mul ] , [ Sqrt ] ) ,
132
- & ( Val , ( [ Pow ] , [ 1 . i ( ) , Flip . i ( ) , Div . i ( ) , Pow . i ( ) ] ) ) ,
152
+ & ( Val , pat ! ( Pow , ( 1 , Flip , Div , Pow ) ) ) ,
133
153
& ( Val , ( [ Log ] , [ Flip , Pow ] ) ) ,
134
154
] ;
135
155
@@ -188,34 +208,34 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
188
208
189
209
macro_rules! stash2 {
190
210
( $before: expr, $after: expr) => {
191
- (
192
- [ $before] ,
193
- [ Over . i ( ) , Over . i ( ) , PushTempN ( 2 ) . i ( ) , $before. i ( ) ] ,
194
- [ PopTempN ( 2 ) . i ( ) , $after. i ( ) ] ,
211
+ pat! (
212
+ $before,
213
+ ( Over , Over , PushTempN ( 2 ) , $before) ,
214
+ ( PopTempN ( 2 ) , $after) ,
195
215
)
196
216
} ;
197
217
}
198
218
199
219
macro_rules! bin {
200
220
( Flip , $before: expr, $after: expr) => {
201
- (
202
- [ Flip , $before] ,
203
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Flip . i ( ) , $before. i ( ) ] ,
204
- [ PopTempN ( 1 ) . i ( ) , $after. i ( ) ] ,
221
+ pat! (
222
+ ( Flip , $before) ,
223
+ ( Dup , PushTempN ( 1 ) , Flip , $before) ,
224
+ ( PopTempN ( 1 ) , $after) ,
205
225
)
206
226
} ;
207
227
( Flip , $before: expr) => {
208
- (
209
- [ Flip , $before] ,
210
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Flip . i ( ) , $before. i ( ) ] ,
211
- [ PopTempN ( 1 ) . i ( ) , Flip . i ( ) , $before. i ( ) ] ,
228
+ pat! (
229
+ ( Flip , $before) ,
230
+ ( Dup , PushTempN ( 1 ) , Flip , $before) ,
231
+ ( PopTempN ( 1 ) , Flip , $before) ,
212
232
)
213
233
} ;
214
234
( $before: expr, $after: expr) => {
215
- (
216
- [ $before] ,
217
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , $before. i ( ) ] ,
218
- [ PopTempN ( 1 ) . i ( ) , $after. i ( ) ] ,
235
+ pat! (
236
+ ( $before) ,
237
+ ( Dup , PushTempN ( 1 ) , $before) ,
238
+ ( PopTempN ( 1 ) , $after) ,
219
239
)
220
240
} ;
221
241
}
@@ -234,26 +254,22 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
234
254
& bin ! ( Sub , Add ) ,
235
255
& bin ! ( Mul , Div ) ,
236
256
& bin ! ( Div , Mul ) ,
237
- & (
238
- [ Flip , Pow ] ,
239
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Flip . i ( ) , Pow . i ( ) ] ,
240
- [ PopTempN ( 1 ) . i ( ) , Log . i ( ) ] ,
241
- ) ,
242
- & (
243
- [ Pow ] ,
244
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Pow . i ( ) ] ,
245
- [ PopTempN ( 1 ) . i ( ) , 1 . i ( ) , Flip . i ( ) , Div . i ( ) , Pow . i ( ) ] ,
257
+ & pat ! (
258
+ ( Flip , Pow ) ,
259
+ ( Dup , PushTempN ( 1 ) , Flip , Pow ) ,
260
+ ( PopTempN ( 1 ) , Log )
246
261
) ,
247
- & (
248
- [ Flip , Log ] ,
249
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Flip . i ( ) , Log . i ( ) ] ,
250
- [ 1 . i ( ) , Flip . i ( ) , Div . i ( ) , PopTempN ( 1 ) . i ( ) , Flip . i ( ) , Pow . i ( ) ] ,
262
+ & pat ! (
263
+ Pow ,
264
+ ( Dup , PushTempN ( 1 ) , Pow ) ,
265
+ ( PopTempN ( 1 ) , 1 , Flip , Div , Pow )
251
266
) ,
252
- & (
253
- [ Log ] ,
254
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Log . i ( ) ] ,
255
- [ PopTempN ( 1 ) . i ( ) , Flip . i ( ) , Pow . i ( ) ] ,
267
+ & pat ! (
268
+ ( Flip , Log ) ,
269
+ ( Dup , PushTempN ( 1 ) , Flip , Log ) ,
270
+ ( 1 , Flip , Div , PopTempN ( 1 ) , Flip , Pow )
256
271
) ,
272
+ & pat ! ( Log , ( Dup , PushTempN ( 1 ) , Log ) , ( PopTempN ( 1 ) , Flip , Pow ) ) ,
257
273
& ( Val , stash2 ! ( Take , Untake ) ) ,
258
274
& stash2 ! ( Take , Untake ) ,
259
275
& ( Val , stash2 ! ( Drop , Undrop ) ) ,
@@ -264,77 +280,69 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
264
280
& stash2 ! ( Pick , Unpick ) ,
265
281
& (
266
282
Val ,
267
- (
268
- [ Keep ] ,
269
- [ Over . i ( ) , Over . i ( ) , PushTempN ( 2 ) . i ( ) , Keep . i ( ) ] ,
270
- [ PopTempN ( 1 ) . i ( ) , Flip . i ( ) , PopTempN ( 1 ) . i ( ) , Unkeep . i ( ) ] ,
283
+ pat ! (
284
+ Keep ,
285
+ ( Over , Over , PushTempN ( 2 ) , Keep ) ,
286
+ ( PopTempN ( 1 ) , Flip , PopTempN ( 1 ) , Unkeep )
271
287
) ,
272
288
) ,
273
- & (
274
- [ Keep ] ,
275
- [ Over . i ( ) , Over . i ( ) , PushTempN ( 2 ) . i ( ) , Keep . i ( ) ] ,
276
- [ PopTempN ( 1 ) . i ( ) , Flip . i ( ) , PopTempN ( 1 ) . i ( ) , Unkeep . i ( ) ] ,
289
+ & pat ! (
290
+ Keep ,
291
+ ( Over , Over , PushTempN ( 2 ) , Keep ) ,
292
+ ( PopTempN ( 1 ) , Flip , PopTempN ( 1 ) , Unkeep ) ,
277
293
) ,
278
- & (
279
- [ Rotate ] ,
280
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Rotate . i ( ) ] ,
281
- [ PopTempN ( 1 ) . i ( ) , Neg . i ( ) , Rotate . i ( ) ] ,
294
+ & pat ! (
295
+ Rotate ,
296
+ ( Dup , PushTempN ( 1 ) , Rotate ) ,
297
+ ( PopTempN ( 1 ) , Neg , Rotate ) ,
282
298
) ,
283
- & (
284
- [ Abs ] ,
285
- [ Dup . i ( ) , Sign . i ( ) , PushTempN ( 1 ) . i ( ) , Abs . i ( ) ] ,
286
- [ PopTempN ( 1 ) . i ( ) , Mul . i ( ) ] ,
299
+ & pat ! ( ( Abs ) , ( Dup , Sign , PushTempN ( 1 ) , Abs ) , ( PopTempN ( 1 ) , Mul ) , ) ,
300
+ & pat ! (
301
+ First ,
302
+ ( Dup , PushTempN ( 1 ) , First ) ,
303
+ ( PopTempN ( 1 ) , 1 , Drop , Flip , Join ) ,
287
304
) ,
288
- & (
289
- [ First ] ,
290
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , First . i ( ) ] ,
291
- [ PopTempN ( 1 ) . i ( ) , 1 . i ( ) , Drop . i ( ) , Flip . i ( ) , Join . i ( ) ] ,
305
+ & pat ! (
306
+ Last ,
307
+ ( Dup , PushTempN ( 1 ) , Last ) ,
308
+ ( PopTempN ( 1 ) , - 1 , Drop , Join ) ,
292
309
) ,
293
- & (
294
- [ Last ] ,
295
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Last . i ( ) ] ,
296
- [ PopTempN ( 1 ) . i ( ) , ( - 1 ) . i ( ) , Drop . i ( ) , Join . i ( ) ] ,
310
+ & pat ! (
311
+ Shape ,
312
+ ( Dup , PushTempN ( 1 ) , Shape ) ,
313
+ ( PopTempN ( 1 ) , Flip , Reshape ) ,
297
314
) ,
298
- & (
299
- [ Shape ] ,
300
- [ Dup . i ( ) , PushTempN ( 1 ) . i ( ) , Shape . i ( ) ] ,
301
- [ PopTempN ( 1 ) . i ( ) , Flip . i ( ) , Reshape . i ( ) ] ,
315
+ & pat ! (
316
+ Deshape ,
317
+ ( Dup , Shape , PushTempN ( 1 ) , Deshape ) ,
318
+ ( PopTempN ( 1 ) , Reshape ) ,
302
319
) ,
303
- & (
304
- [ Deshape ] ,
305
- [ Dup . i ( ) , Shape . i ( ) , PushTempN ( 1 ) . i ( ) , Deshape . i ( ) ] ,
306
- [ PopTempN ( 1 ) . i ( ) , Reshape . i ( ) ] ,
320
+ & pat ! ( ( Now ) , ( Now , PushTempN ( 1 ) ) , ( PopTempN ( 1 ) , Now , Flip , Sub ) , ) ,
321
+ & pat ! (
322
+ Sys ( SysOp :: FOpen ) ,
323
+ ( Sys ( SysOp :: FOpen ) , Dup , PushTempN ( 1 ) ) ,
324
+ ( PopTempN ( 1 ) , Sys ( SysOp :: Close ) ) ,
307
325
) ,
308
- & (
309
- [ Now ] ,
310
- [ Now . i ( ) , PushTempN ( 1 ) . i ( ) ] ,
311
- [ PopTempN ( 1 ) . i ( ) , Now . i ( ) , Flip . i ( ) , Sub . i ( ) ] ,
326
+ & pat ! (
327
+ Sys ( SysOp :: FCreate ) ,
328
+ ( Sys ( SysOp :: FCreate ) , Dup , PushTempN ( 1 ) ) ,
329
+ ( PopTempN ( 1 ) , Sys ( SysOp :: Close ) ) ,
312
330
) ,
313
- & (
314
- [ Sys ( SysOp :: FOpen ) ] ,
315
- [ Sys ( SysOp :: FOpen ) . i ( ) , Dup . i ( ) , PushTempN ( 1 ) . i ( ) ] ,
316
- [ PopTempN ( 1 ) . i ( ) , Sys ( SysOp :: Close ) . i ( ) ] ,
331
+ & pat ! (
332
+ Sys ( SysOp :: TcpConnect ) ,
333
+ ( Sys ( SysOp :: TcpConnect ) , Dup , PushTempN ( 1 ) ) ,
334
+ ( PopTempN ( 1 ) , Sys ( SysOp :: Close ) ) ,
317
335
) ,
318
- & (
319
- [ Sys ( SysOp :: FCreate ) ] ,
320
- [ Sys ( SysOp :: FCreate ) . i ( ) , Dup . i ( ) , PushTempN ( 1 ) . i ( ) ] ,
321
- [ PopTempN ( 1 ) . i ( ) , Sys ( SysOp :: Close ) . i ( ) ] ,
322
- ) ,
323
- & (
324
- [ Sys ( SysOp :: TcpConnect ) ] ,
325
- [ Sys ( SysOp :: TcpConnect ) . i ( ) , Dup . i ( ) , PushTempN ( 1 ) . i ( ) ] ,
326
- [ PopTempN ( 1 ) . i ( ) , Sys ( SysOp :: Close ) . i ( ) ] ,
327
- ) ,
328
- & (
329
- [ Sys ( SysOp :: TcpAccept ) ] ,
330
- [ Sys ( SysOp :: TcpAccept ) . i ( ) , Dup . i ( ) , PushTempN ( 1 ) . i ( ) ] ,
331
- [ PopTempN ( 1 ) . i ( ) , Sys ( SysOp :: Close ) . i ( ) ] ,
336
+ & pat ! (
337
+ Sys ( SysOp :: TcpAccept ) ,
338
+ ( Sys ( SysOp :: TcpAccept ) , Dup , PushTempN ( 1 ) ) ,
339
+ ( PopTempN ( 1 ) , Sys ( SysOp :: Close ) ) ,
332
340
) ,
333
- & ( [ Rock ] , [ Rock ] , [ 1 . i ( ) , Drop . i ( ) ] ) ,
334
- & ( [ Surface ] , [ Surface ] , [ 1 . i ( ) , Drop . i ( ) ] ) ,
335
- & ( [ Deep ] , [ Deep ] , [ 1 . i ( ) , Drop . i ( ) ] ) ,
336
- & ( [ Abyss ] , [ Abyss ] , [ 1 . i ( ) , Drop . i ( ) ] ) ,
337
- & ( [ Seabed ] , [ Seabed ] , [ 1 . i ( ) , Drop . i ( ) ] ) ,
341
+ & pat ! ( Rock , Rock , ( 1 , Drop ) ) ,
342
+ & pat ! ( Surface , Surface , ( 1 , Drop ) ) ,
343
+ & pat ! ( Deep , Deep , ( 1 , Drop ) ) ,
344
+ & pat ! ( Abyss , Abyss , ( 1 , Drop ) ) ,
345
+ & pat ! ( Seabed , Seabed , ( 1 , Drop ) ) ,
338
346
& UnderPatternFn ( under_from_inverse_pattern) ,
339
347
& UnderPatternFn ( under_temp_pattern) ,
340
348
] ;
@@ -399,14 +407,12 @@ fn under_instrs_impl(instrs: &[Instr], g_sig: Signature) -> Option<(Vec<Instr>,
399
407
None
400
408
}
401
409
410
+ fn box_as_instr ( instr : impl AsInstr + ' static ) -> Box < dyn AsInstr > {
411
+ Box :: new ( instr)
412
+ }
413
+
402
414
trait AsInstr : fmt:: Debug {
403
415
fn as_instr ( & self , span : usize ) -> Instr ;
404
- fn i ( & self ) -> Box < dyn AsInstr >
405
- where
406
- Self : Copy + ' static ,
407
- {
408
- Box :: new ( * self )
409
- }
410
416
}
411
417
412
418
#[ derive( Debug , Clone , Copy ) ]
0 commit comments