2015-03-17 03:26:59 +00:00
//: Calls can take ingredients just like primitives. To access a recipe's
2015-03-17 04:19:50 +00:00
//: ingredients, use 'next-ingredient'.
2015-04-17 18:22:59 +00:00
2015-04-24 17:19:03 +00:00
: ( scenario next_ingredient )
2015-03-15 16:49:23 +00:00
recipe main [
2015-07-28 21:33:22 +00:00
f 2
2015-03-15 16:49:23 +00:00
]
recipe f [
2015-05-13 17:03:26 +00:00
12 : number < - next - ingredient
2015-07-28 21:33:22 +00:00
13 : number < - add 1 , 12 : number
2015-03-15 16:49:23 +00:00
]
2015-03-24 06:59:59 +00:00
+ mem : storing 3 in location 13
2015-03-15 16:49:23 +00:00
2015-04-24 17:19:03 +00:00
: ( scenario next_ingredient_missing )
2015-04-20 03:38:09 +00:00
recipe main [
f
]
recipe f [
2015-05-13 17:03:26 +00:00
_ , 12 : number < - next - ingredient
2015-04-20 03:38:09 +00:00
]
+ mem : storing 0 in location 12
2015-04-13 03:56:45 +00:00
: ( before " End call Fields " )
2015-05-13 01:08:47 +00:00
vector < vector < double > > ingredient_atoms ;
2015-05-17 09:22:41 +00:00
long long int next_ingredient_to_process ;
2015-05-24 00:58:10 +00:00
: ( before " End call Constructor " )
next_ingredient_to_process = 0 ;
2015-03-15 16:49:23 +00:00
2015-07-25 21:19:28 +00:00
: ( after " call_housekeeping: " )
2015-05-17 09:22:41 +00:00
for ( long long int i = 0 ; i < SIZE ( ingredients ) ; + + i ) {
2015-05-24 22:45:09 +00:00
Current_routine - > calls . front ( ) . ingredient_atoms . push_back ( ingredients . at ( i ) ) ;
2015-03-15 16:49:23 +00:00
}
2015-04-17 17:31:17 +00:00
: ( before " End Primitive Recipe Declarations " )
NEXT_INGREDIENT ,
2015-03-15 16:49:23 +00:00
: ( before " End Primitive Recipe Numbers " )
2015-07-04 16:40:50 +00:00
Recipe_ordinal [ " next-ingredient " ] = NEXT_INGREDIENT ;
2015-03-15 16:49:23 +00:00
: ( before " End Primitive Recipe Implementations " )
case NEXT_INGREDIENT : {
2015-07-25 21:19:28 +00:00
if ( ! ingredients . empty ( ) ) {
raise < < current_recipe_name ( ) < < " : 'next-ingredient' didn't expect any ingredients in ' " < < current_instruction ( ) . to_string ( ) < < " ' \n " < < end ( ) ;
break ;
}
2015-05-13 23:33:40 +00:00
assert ( ! Current_routine - > calls . empty ( ) ) ;
2015-05-17 09:22:41 +00:00
if ( Current_routine - > calls . front ( ) . next_ingredient_to_process < SIZE ( Current_routine - > calls . front ( ) . ingredient_atoms ) ) {
2015-05-07 22:06:53 +00:00
products . push_back (
2015-05-13 23:33:40 +00:00
Current_routine - > calls . front ( ) . ingredient_atoms . at ( Current_routine - > calls . front ( ) . next_ingredient_to_process ) ) ;
2015-05-17 09:22:41 +00:00
assert ( SIZE ( products ) = = 1 ) ; products . resize ( 2 ) ; // push a new vector
2015-05-07 22:06:53 +00:00
products . at ( 1 ) . push_back ( 1 ) ;
2015-05-13 23:33:40 +00:00
+ + Current_routine - > calls . front ( ) . next_ingredient_to_process ;
2015-03-15 16:49:23 +00:00
}
2015-04-20 03:38:09 +00:00
else {
2015-05-07 22:06:53 +00:00
products . resize ( 2 ) ;
products . at ( 0 ) . push_back ( 0 ) ; // todo: will fail noisily if we try to read a compound value
products . at ( 1 ) . push_back ( 0 ) ;
2015-04-20 03:38:09 +00:00
}
2015-03-15 16:49:23 +00:00
break ;
}
2015-04-20 03:49:30 +00:00
2015-04-24 17:19:03 +00:00
: ( scenario rewind_ingredients )
2015-04-20 03:49:30 +00:00
recipe main [
2015-07-28 21:33:22 +00:00
f 2
2015-04-20 03:49:30 +00:00
]
recipe f [
2015-05-13 17:03:26 +00:00
12 : number < - next - ingredient # consume ingredient
2015-04-20 03:49:30 +00:00
_ , 1 : boolean < - next - ingredient # will not find any ingredients
rewind - ingredients
2015-05-13 17:03:26 +00:00
13 : number , 2 : boolean < - next - ingredient # will find ingredient again
2015-04-20 03:49:30 +00:00
]
+ mem : storing 2 in location 12
+ mem : storing 0 in location 1
+ mem : storing 2 in location 13
+ mem : storing 1 in location 2
: ( before " End Primitive Recipe Declarations " )
REWIND_INGREDIENTS ,
: ( before " End Primitive Recipe Numbers " )
2015-07-04 16:40:50 +00:00
Recipe_ordinal [ " rewind-ingredients " ] = REWIND_INGREDIENTS ;
2015-04-20 03:49:30 +00:00
: ( before " End Primitive Recipe Implementations " )
case REWIND_INGREDIENTS : {
2015-05-13 23:33:40 +00:00
Current_routine - > calls . front ( ) . next_ingredient_to_process = 0 ;
2015-04-20 03:49:30 +00:00
break ;
}
2015-04-24 17:19:03 +00:00
: ( scenario ingredient )
2015-04-20 03:49:30 +00:00
recipe main [
2015-07-28 21:33:22 +00:00
f 1 , 2
2015-04-20 03:49:30 +00:00
]
recipe f [
2015-07-28 21:33:22 +00:00
12 : number < - ingredient 1 # consume second ingredient first
2015-05-13 17:03:26 +00:00
13 : number , 1 : boolean < - next - ingredient # next - ingredient tries to scan past that
2015-04-20 03:49:30 +00:00
]
+ mem : storing 2 in location 12
+ mem : storing 0 in location 1
: ( before " End Primitive Recipe Declarations " )
INGREDIENT ,
: ( before " End Primitive Recipe Numbers " )
2015-07-04 16:40:50 +00:00
Recipe_ordinal [ " ingredient " ] = INGREDIENT ;
2015-04-20 03:49:30 +00:00
: ( before " End Primitive Recipe Implementations " )
case INGREDIENT : {
2015-07-25 21:19:28 +00:00
if ( SIZE ( ingredients ) ! = 1 ) {
raise < < current_recipe_name ( ) < < " : 'ingredient' expects exactly one ingredient, but got ' " < < current_instruction ( ) . to_string ( ) < < " ' \n " < < end ( ) ;
break ;
}
if ( ! is_literal ( current_instruction ( ) . ingredients . at ( 0 ) ) ) {
raise < < current_recipe_name ( ) < < " : 'ingredient' expects a literal ingredient, but got " < < current_instruction ( ) . ingredients . at ( 0 ) . original_string < < ' \n ' < < end ( ) ;
break ;
}
2015-05-17 09:22:41 +00:00
assert ( scalar ( ingredients . at ( 0 ) ) ) ;
if ( static_cast < long long int > ( ingredients . at ( 0 ) . at ( 0 ) ) < SIZE ( Current_routine - > calls . front ( ) . ingredient_atoms ) ) {
2015-05-13 23:33:40 +00:00
Current_routine - > calls . front ( ) . next_ingredient_to_process = ingredients . at ( 0 ) . at ( 0 ) ;
2015-05-07 22:06:53 +00:00
products . push_back (
2015-05-13 23:33:40 +00:00
Current_routine - > calls . front ( ) . ingredient_atoms . at ( Current_routine - > calls . front ( ) . next_ingredient_to_process ) ) ;
2015-05-17 09:22:41 +00:00
assert ( SIZE ( products ) = = 1 ) ; products . resize ( 2 ) ; // push a new vector
2015-05-13 00:00:56 +00:00
products . at ( 1 ) . push_back ( 1 ) ;
2015-05-13 23:33:40 +00:00
+ + Current_routine - > calls . front ( ) . next_ingredient_to_process ;
2015-04-20 03:49:30 +00:00
}
else {
2015-05-17 09:22:41 +00:00
if ( SIZE ( current_instruction ( ) . products ) > 1 ) {
2015-05-07 22:06:53 +00:00
products . resize ( 2 ) ;
products . at ( 0 ) . push_back ( 0 ) ; // todo: will fail noisily if we try to read a compound value
2015-05-13 00:00:56 +00:00
products . at ( 1 ) . push_back ( 0 ) ;
2015-04-20 03:49:30 +00:00
}
}
break ;
}