The complete shared Core-1 declaration grammar.
Core-1 grammar
(* Core-1 additions to the inherited Core-0 grammar. These productions replace
the corresponding Core-0 domain/message productions. *)
domain = "algorithm" | "compute" | "state" | "flow" | "optimize" ;
effect = "io" | "alloc" | "time" | "random" | "reflect" | "unsafe"
| "abort" | "compute" | "state" | "flow" | "optimize" ;
effect-clause = "effects" , "{" , [ effect , { "," , effect } ] , "}" ;
domain-set = "{" , domain , { "," , domain } , "}" ;
authoring-modality = "interpreted" | "compiled" ;
ordinary-message-declaration
= visibility , authoring-modality , [ "open" ] , [ "abstract" ] , [ "override" ] ,
domain , "message" , identifier , [ generic-parameters ] ,
"(" , receiver-parameter , { "," , value-parameter } , ")" ,
"->" , type , { requirement-clause } ,
[ precondition-clause ] , [ postcondition-clause ] ,
effect-clause , (block | ";") ;
portable-message-declaration
= visibility , authoring-modality , "portable" , domain-set , "message" , identifier ,
[ generic-parameters ] ,
"(" , receiver-parameter , { "," , value-parameter } , ")" ,
"->" , type , { requirement-clause } ,
[ precondition-clause ] , [ postcondition-clause ] ,
effect-clause , (block | ";") ;
message-declaration
= ordinary-message-declaration | portable-message-declaration ;
typed-message-reference = identifier , "." , identifier ;
shared-ref-type = "Ref" , "<" , ( "Self" | identifier ) , ">" ;
shared-borrow-expression
= "Ref" , "::" , "<" , ( "Self" | identifier ) , ">" ,
"." , "borrow" , "(" , identifier , ")" ;
bounded-shared-loan-local
= "let" , identifier , ":" , shared-ref-type , "=" ,
shared-borrow-expression , ";" ;
bounded-shared-view-projection = identifier , "." , identifier ;
positive-integer = nonzero-digit , { digit } ;
signed-integer = [ "-" ] , digit , { digit } ;
device-run-expression
= "Device" , "." , "run" , "(" , typed-message-reference ,
{ "," , expression } , ")" ;
store-transact-expression
= "Store" , "." , "transact" , "(" , typed-message-reference ,
{ "," , expression } , ")" ;
flow-activity-expression
= "Flow" , "." , "activity" , "(" , positive-integer , "," ,
typed-message-reference , "," , expression , "," , positive-integer ,
"," , positive-integer , "," , ("true" | "false") , ")" ;
flow-timer-expression
= "Flow" , "." , "timer" , "(" , positive-integer , "," ,
expression , ")" ;
flow-signal-expression
= "Flow" , "." , "signal" , "(" , positive-integer , "," ,
positive-integer , ")" ;
flow-engine-start-expression
= "FlowEngine" , "." , "start" , "(" , typed-message-reference ,
"," , expression , ")" ;
optimization-problem-expression
= "Optimization" , "." , "problem" , "(" , positive-integer , "," ,
[ finite-space-expression , "," ] , typed-message-reference , "," ,
typed-message-reference , "," ,
positive-integer , "," , positive-integer , ")" ;
finite-space-expression
= "Space" , "." , "range" , "(" , signed-integer , "," ,
signed-integer , ")" ;
optimizer-run-expression
= "Optimizer" , "." , "run" , "(" , typed-message-reference , ")" ;
(* `workflow` is reserved only so the frontend can emit the migration
diagnostic. It is not a domain and cannot appear in domain-set. *)