2015-04-18 14:50:51 +00:00
//: Boolean primitives
2015-04-17 18:22:59 +00:00
2015-04-17 17:31:17 +00:00
: ( before " End Primitive Recipe Declarations " )
AND ,
2015-02-20 00:59:31 +00:00
: ( before " End Primitive Recipe Numbers " )
2015-11-06 19:06:58 +00:00
put ( Recipe_ordinal , " and " , AND ) ;
2015-09-30 09:01:59 +00:00
: ( before " End Primitive Recipe Checks " )
2015-09-30 08:57:23 +00:00
case AND : {
2016-10-20 05:10:35 +00:00
for ( int i = 0 ; i < SIZE ( inst . ingredients ) ; + + i ) {
2015-09-30 08:57:23 +00:00
if ( ! is_mu_scalar ( inst . ingredients . at ( i ) ) ) {
2016-05-21 05:09:06 +00:00
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'and' requires boolean ingredients, but got ' " < < inst . ingredients . at ( i ) . original_string < < " ' \n " < < end ( ) ;
2015-09-30 08:57:23 +00:00
goto finish_checking_instruction ;
}
}
2016-02-26 21:27:23 +00:00
if ( SIZE ( inst . products ) > 1 ) {
2017-05-26 23:43:18 +00:00
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'and' yields exactly one product in ' " < < to_original_string ( inst ) < < " ' \n " < < end ( ) ;
2016-02-26 21:27:23 +00:00
break ;
}
if ( ! inst . products . empty ( ) & & ! is_dummy ( inst . products . at ( 0 ) ) & & ! is_mu_boolean ( inst . products . at ( 0 ) ) ) {
2016-05-21 05:09:06 +00:00
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'and' should yield a boolean, but got ' " < < inst . products . at ( 0 ) . original_string < < " ' \n " < < end ( ) ;
2016-02-26 21:27:23 +00:00
break ;
}
2015-09-30 08:57:23 +00:00
break ;
}
2015-02-20 00:59:31 +00:00
: ( before " End Primitive Recipe Implementations " )
case AND : {
2015-05-07 22:06:53 +00:00
bool result = true ;
2016-10-20 05:10:35 +00:00
for ( int i = 0 ; i < SIZE ( ingredients ) ; + + i )
2018-06-24 16:16:17 +00:00
result = result & & scalar_ingredient ( ingredients , i ) ;
2015-05-07 22:06:53 +00:00
products . resize ( 1 ) ;
2015-05-13 00:00:56 +00:00
products . at ( 0 ) . push_back ( result ) ;
2015-02-20 00:59:31 +00:00
break ;
}
2018-06-24 16:16:17 +00:00
: ( code )
double scalar_ingredient ( const vector < vector < double > > & ingredients , int i ) {
if ( is_mu_address ( current_instruction ( ) . ingredients . at ( i ) ) )
return ingredients . at ( i ) . at ( /*skip alloc id*/ 1 ) ;
return ingredients . at ( i ) . at ( 0 ) ;
}
2015-02-20 00:59:31 +00:00
2015-04-24 17:19:03 +00:00
: ( scenario and )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - copy true
2 : bool < - copy false
2016-09-17 07:46:03 +00:00
3 : bool < - and 1 : bool , 2 : bool
2015-02-20 00:59:31 +00:00
]
2015-03-24 06:59:59 +00:00
+ mem : storing 0 in location 3
2015-02-20 00:59:31 +00:00
2015-08-09 19:26:31 +00:00
: ( scenario and_2 )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - and true , true
2015-05-07 22:06:53 +00:00
]
+ mem : storing 1 in location 1
: ( scenario and_multiple )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - and true , true , false
2015-05-07 22:06:53 +00:00
]
+ mem : storing 0 in location 1
2015-08-09 19:26:31 +00:00
: ( scenario and_multiple_2 )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - and true , true , true
2015-05-07 22:06:53 +00:00
]
+ mem : storing 1 in location 1
2015-04-17 17:31:17 +00:00
: ( before " End Primitive Recipe Declarations " )
OR ,
2015-02-20 00:59:31 +00:00
: ( before " End Primitive Recipe Numbers " )
2015-11-06 19:06:58 +00:00
put ( Recipe_ordinal , " or " , OR ) ;
2015-09-30 09:01:59 +00:00
: ( before " End Primitive Recipe Checks " )
2015-09-30 08:57:23 +00:00
case OR : {
2016-10-20 05:10:35 +00:00
for ( int i = 0 ; i < SIZE ( inst . ingredients ) ; + + i ) {
2015-09-30 08:57:23 +00:00
if ( ! is_mu_scalar ( inst . ingredients . at ( i ) ) ) {
2016-05-21 05:09:06 +00:00
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'and' requires boolean ingredients, but got ' " < < inst . ingredients . at ( i ) . original_string < < " ' \n " < < end ( ) ;
2015-09-30 08:57:23 +00:00
goto finish_checking_instruction ;
}
}
2016-02-26 21:27:23 +00:00
if ( SIZE ( inst . products ) > 1 ) {
2017-05-26 23:43:18 +00:00
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'or' yields exactly one product in ' " < < to_original_string ( inst ) < < " ' \n " < < end ( ) ;
2016-02-26 21:27:23 +00:00
break ;
}
if ( ! inst . products . empty ( ) & & ! is_dummy ( inst . products . at ( 0 ) ) & & ! is_mu_boolean ( inst . products . at ( 0 ) ) ) {
2016-05-21 05:09:06 +00:00
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'or' should yield a boolean, but got ' " < < inst . products . at ( 0 ) . original_string < < " ' \n " < < end ( ) ;
2016-02-26 21:27:23 +00:00
break ;
}
2015-09-30 08:57:23 +00:00
break ;
}
2015-02-20 00:59:31 +00:00
: ( before " End Primitive Recipe Implementations " )
case OR : {
2015-05-07 22:06:53 +00:00
bool result = false ;
2016-10-20 05:10:35 +00:00
for ( int i = 0 ; i < SIZE ( ingredients ) ; + + i )
2018-06-24 16:16:17 +00:00
result = result | | scalar_ingredient ( ingredients , i ) ;
2015-05-07 22:06:53 +00:00
products . resize ( 1 ) ;
2015-05-13 00:00:56 +00:00
products . at ( 0 ) . push_back ( result ) ;
2015-02-20 00:59:31 +00:00
break ;
}
2015-04-24 17:19:03 +00:00
: ( scenario or )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - copy true
2 : bool < - copy false
2016-09-17 07:46:03 +00:00
3 : bool < - or 1 : bool , 2 : bool
2015-02-20 00:59:31 +00:00
]
2015-03-24 06:59:59 +00:00
+ mem : storing 1 in location 3
2015-02-20 01:02:20 +00:00
2015-08-09 19:26:31 +00:00
: ( scenario or_2 )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - or false , false
2015-05-07 22:06:53 +00:00
]
+ mem : storing 0 in location 1
: ( scenario or_multiple )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - or false , false , false
2015-05-07 22:06:53 +00:00
]
+ mem : storing 0 in location 1
2015-08-09 19:26:31 +00:00
: ( scenario or_multiple_2 )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - or false , false , true
2015-05-07 22:06:53 +00:00
]
+ mem : storing 1 in location 1
2015-04-17 17:31:17 +00:00
: ( before " End Primitive Recipe Declarations " )
NOT ,
2015-02-20 01:02:20 +00:00
: ( before " End Primitive Recipe Numbers " )
2015-11-06 19:06:58 +00:00
put ( Recipe_ordinal , " not " , NOT ) ;
2015-09-30 09:01:59 +00:00
: ( before " End Primitive Recipe Checks " )
2015-09-30 08:57:23 +00:00
case NOT : {
2016-05-25 17:32:51 +00:00
if ( SIZE ( inst . products ) ! = SIZE ( inst . ingredients ) ) {
2017-05-26 23:43:18 +00:00
raise < < " ingredients and products should match in ' " < < to_original_string ( inst ) < < " ' \n " < < end ( ) ;
2015-09-30 08:57:23 +00:00
break ;
}
2016-10-20 05:10:35 +00:00
for ( int i = 0 ; i < SIZE ( inst . ingredients ) ; + + i ) {
2018-06-24 16:16:17 +00:00
if ( ! is_mu_scalar ( inst . ingredients . at ( i ) ) & & ! is_mu_address ( inst . ingredients . at ( i ) ) ) {
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'not' requires ingredients that can be interpreted as boolean, but got ' " < < inst . ingredients . at ( i ) . original_string < < " ' \n " < < end ( ) ;
2015-09-30 08:57:23 +00:00
goto finish_checking_instruction ;
}
}
2016-10-20 05:10:35 +00:00
for ( int i = 0 ; i < SIZE ( inst . products ) ; + + i ) {
2016-02-26 21:27:23 +00:00
if ( is_dummy ( inst . products . at ( i ) ) ) continue ;
if ( ! is_mu_boolean ( inst . products . at ( i ) ) ) {
2016-05-21 05:09:06 +00:00
raise < < maybe ( get ( Recipe , r ) . name ) < < " 'not' should yield a boolean, but got ' " < < inst . products . at ( i ) . original_string < < " ' \n " < < end ( ) ;
2016-02-26 21:27:23 +00:00
goto finish_checking_instruction ;
}
}
2015-09-30 08:57:23 +00:00
break ;
}
2015-02-20 01:02:20 +00:00
: ( before " End Primitive Recipe Implementations " )
case NOT : {
2015-07-25 21:19:28 +00:00
products . resize ( SIZE ( ingredients ) ) ;
2016-10-20 05:10:35 +00:00
for ( int i = 0 ; i < SIZE ( ingredients ) ; + + i ) {
2018-06-24 16:16:17 +00:00
products . at ( i ) . push_back ( ! scalar_ingredient ( ingredients , i ) ) ;
2015-05-07 22:06:53 +00:00
}
2015-02-20 01:02:20 +00:00
break ;
}
2015-04-24 17:19:03 +00:00
: ( scenario not )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool < - copy true
2016-09-17 07:46:03 +00:00
2 : bool < - not 1 : bool
2015-02-20 01:02:20 +00:00
]
2015-03-24 06:59:59 +00:00
+ mem : storing 0 in location 2
2015-05-07 22:06:53 +00:00
: ( scenario not_multiple )
2016-03-08 09:30:14 +00:00
def main [
2018-06-17 07:05:38 +00:00
1 : bool , 2 : bool , 3 : bool < - not true , false , true
2015-05-07 22:06:53 +00:00
]
+ mem : storing 0 in location 1
+ mem : storing 1 in location 2
+ mem : storing 0 in location 3